|
Handling write miss
- CASE A: requester is in HEAD_DIRTY state already
- Directory must be in GONE state
- Only need to invalidate sharers
- Requester sends an invalidation to the next sharer
- A sharer upon receiving an invalidation sends a roll-out request to its next sharer (unless TAIL); the receiving node sets its upstream pointer properly and sends a roll-out acknowledgment
- Eventually roll-out request is acknowledged, the sharer invalidates its RAC line and sends a reply back to head with the id of the next sharer
- Head moves on to purge the sharer with received id
- During the entire process requester’s RAC line remains in PENDING state
- Note that home is not at all involved here
- CASE B: requester is in ONLY_DIRTY state
- CASE C: requester is in HEAD_FRESH state
- Send state change request to home (FRESH to GONE)
- Once acknowledgment from home is received list purging can be started
- What if the home is in a state different from FRESH with a different head node?
- The only case in SCI when a NACK is generated
- The requester on receiving the NACK changes its state to PENDING and initiates a new write request to home for transitioning to ONLY_DIRTY
- CASE D: requester in MID_FRESH or TAIL_FRESH state
- First it must roll out from the list and attach itself to the head in HEAD_FRESH state (recall that only the head node can write)
- This roll-out may require acknowledgments from upstream and downstream neighbors (if MID) or just the upstream neighbor (if TAIL)
- Follow CASE C
- CASE E: requester not a sharer
- First get the block in HEAD_DIRTY state
- Follow CASE A
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|