Messages in this thread Patch in this message | | | Subject | [PATCH 3/4] fuse: skip blocking on allocations of synchronous requests | From | "Maxim V. Patlasov" <> | Date | Thu, 21 Mar 2013 18:02:28 +0400 |
| |
Miklos wrote:
> A task may have at most one synchronous request allocated. So these > requests need not be otherwise limited.
The patch re-works fuse_get_req() to follow this idea.
Signed-off-by: Maxim Patlasov <mpatlasov@parallels.com> --- fs/fuse/dev.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 6137650..1f7ce89 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -137,17 +137,27 @@ struct fuse_req *fuse_get_req_internal(struct fuse_conn *fc, unsigned npages, bool for_background) { struct fuse_req *req; - sigset_t oldset; - int intr; int err; + int *flag_p = NULL; atomic_inc(&fc->num_waiting); - block_sigs(&oldset); - intr = wait_event_interruptible(fc->blocked_waitq, !fc->blocked); - restore_sigs(&oldset); - err = -EINTR; - if (intr) - goto out; + + if (for_background) + flag_p = &fc->blocked; + else if (fc->uninitialized) + flag_p = &fc->uninitialized; + + if (flag_p) { + sigset_t oldset; + int intr; + + block_sigs(&oldset); + intr = wait_event_interruptible(fc->blocked_waitq, !*flag_p); + restore_sigs(&oldset); + err = -EINTR; + if (intr) + goto out; + } err = -ENOTCONN; if (!fc->connected)
| |