diff options
author | Zhaozhong Ni <nzz@google.com> | 2018-05-11 16:20:01 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-05-11 16:20:50 -0700 |
commit | 85fd5d40ff78f7b7fd473e5215daba84a28977f3 (patch) | |
tree | fea521e01f18e3d54b546bbdfc2aeb048d5fdbec | |
parent | 8deabbaae1fc45b042d551891080deef866dc0f8 (diff) |
netstack: release rcv lock after ping socket save is done.
PiperOrigin-RevId: 196324694
Change-Id: Ia3a48976433f21622eacb4a38fefe7143ca5e31b
-rw-r--r-- | pkg/tcpip/transport/ping/endpoint.go | 2 | ||||
-rw-r--r-- | pkg/tcpip/transport/ping/endpoint_state.go | 19 |
2 files changed, 20 insertions, 1 deletions
diff --git a/pkg/tcpip/transport/ping/endpoint.go b/pkg/tcpip/transport/ping/endpoint.go index 609e7d947..2b80881bb 100644 --- a/pkg/tcpip/transport/ping/endpoint.go +++ b/pkg/tcpip/transport/ping/endpoint.go @@ -52,7 +52,7 @@ type endpoint struct { rcvMu sync.Mutex `state:"nosave"` rcvReady bool rcvList pingPacketList - rcvBufSizeMax int + rcvBufSizeMax int `state:".(int)"` rcvBufSize int rcvClosed bool rcvTimestamp bool diff --git a/pkg/tcpip/transport/ping/endpoint_state.go b/pkg/tcpip/transport/ping/endpoint_state.go index e1664f049..29fde2585 100644 --- a/pkg/tcpip/transport/ping/endpoint_state.go +++ b/pkg/tcpip/transport/ping/endpoint_state.go @@ -29,9 +29,28 @@ func (p *pingPacket) loadData(data buffer.VectorisedView) { // beforeSave is invoked by stateify. func (e *endpoint) beforeSave() { // Stop incoming packets from being handled (and mutate endpoint state). + // The lock will be released after savercvBufSizeMax(), which would have + // saved e.rcvBufSizeMax and set it to 0 to continue blocking incoming + // packets. e.rcvMu.Lock() } +// saveRcvBufSizeMax is invoked by stateify. +func (e *endpoint) saveRcvBufSizeMax() int { + max := e.rcvBufSizeMax + // Make sure no new packets will be handled regardless of the lock. + e.rcvBufSizeMax = 0 + // Release the lock acquired in beforeSave() so regular endpoint closing + // logic can proceed after save. + e.rcvMu.Unlock() + return max +} + +// loadRcvBufSizeMax is invoked by stateify. +func (e *endpoint) loadRcvBufSizeMax(max int) { + e.rcvBufSizeMax = max +} + // afterLoad is invoked by stateify. func (e *endpoint) afterLoad() { e.stack = stack.StackFromEnv |