summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2010-10-26 11:32:03 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-11-19 18:35:12 -0500
commit9c335c0b8daf56b9f73479d00b1dd726e1fcca09 (patch)
tree1b408ebd50345d5f3c699a2cd14c73248f39a29d /fs
parentb176331627fccc726d28f4fc4a357d1f3c19dbf0 (diff)
downloadop-kernel-dev-9c335c0b8daf56b9f73479d00b1dd726e1fcca09.zip
op-kernel-dev-9c335c0b8daf56b9f73479d00b1dd726e1fcca09.tar.gz
svcrpc: fix wspace-checking race
We call svc_xprt_enqueue() after something happens which we think may require handling from a server thread. To avoid such events being lost, svc_xprt_enqueue() must guarantee that there will be a svc_serv() call from a server thread following any such event. It does that by either waking up a server thread itself, or checking that XPT_BUSY is set (in which case somebody else is doing it). But the check of XPT_BUSY could occur just as someone finishes processing some other event, and just before they clear XPT_BUSY. Therefore it's important not to clear XPT_BUSY without subsequently doing another svc_export_enqueue() to check whether the xprt should be requeued. The xpo_wspace() check in svc_xprt_enqueue() breaks this rule, allowing an event to be missed in situations like: data arrives call svc_tcp_data_ready(): call svc_xprt_enqueue(): set BUSY find no write space svc_reserve(): free up write space call svc_enqueue(): test BUSY clear BUSY So, instead, check wspace in the same places that the state flags are checked: before taking BUSY, and in svc_receive(). Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud