mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2026-11-10 20:48:12 +00:00
fuse_get_req() parks background allocations on fch->blocked_waitq via wait_event_state_exclusive(), so each wakeup releases exactly one waiter. fuse_chan_max_background_set() clears fch->blocked when the new limit exceeds num_background, but the accompanying wake_up() releases a single waiter regardless of how many slots just became available. Raising max_background from 10 to 100 therefore admits one request instead of ninety. The remaining waiters are not permanently stranded — the "else if (!fch->blocked)" branch in fuse_request_end() wakes one more per completion — but that only helps while requests keep completing. Consider a fixed pool of threads doing readahead or async direct I/O with the quota exhausted: every thread is either in flight or parked, and each completion wakes one waiter while freeing one slot, a net change of zero. num_background oscillates around the old limit and the added quota is never taken up. Waking one waiter per freed slot also preserves submission order: once fch->blocked is clear, new callers of fuse_get_req() skip the waitqueue entirely, overtaking waiters that parked before the limit was raised. Use wake_up_nr() with the number of slots that just became available. Since the wakeup is guarded by !fch->blocked, num_background is strictly below max_background, so the count is at least 1 and never degenerates into wake_up_all(). Signed-off-by: Baokun Li <libaokun@linux.alibaba.com> Reviewed-By: Horst Birthelmer <hbirthelmer@ddn.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
History
|
|
|---|---|---|
| .. | ||
| acl.c | ||
| args.h | ||
| backing.c | ||
| control.c | ||
| cuse.c | ||
| dax.c | ||
| dev.c | ||
| dev.h | ||
| dev_uring.c | ||
| dev_uring_i.h | ||
| dir.c | ||
| file.c | ||
| fuse_dev_i.h | ||
| fuse_i.h | ||
| fuse_trace.h | ||
| inode.c | ||
| ioctl.c | ||
| iomode.c | ||
| Kconfig | ||
| Makefile | ||
| notify.c | ||
| passthrough.c | ||
| poll.c | ||
| readdir.c | ||
| req.c | ||
| req_timeout.c | ||
| sysctl.c | ||
| sysctl.h | ||
| trace.c | ||
| virtio_fs.c | ||
| xattr.c | ||