diff options
author | Csaba Henk <csaba@gluster.com> | 2009-07-01 20:28:41 -0400 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2009-07-07 11:28:52 -0400 |
commit | 7a6d3c8b3049d07123628f2bf57127bba2cc878f (patch) | |
tree | bfa09bd7e87753eb777699e0566e396ae639532c /fs | |
parent | 8e4a718ff38d8539938ec3421935904c27e00c39 (diff) |
fuse: make the number of max background requests and congestion threshold tunable
The practical values for these limits depend on the design of the
filesystem server so let userspace set them at initialization time.
Signed-off-by: Csaba Henk <csaba@gluster.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fuse/dev.c | 10 | ||||
-rw-r--r-- | fs/fuse/fuse_i.h | 12 | ||||
-rw-r--r-- | fs/fuse/inode.c | 14 |
3 files changed, 25 insertions, 11 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index f58ecbc416c8..b152761c1bf6 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
@@ -250,7 +250,7 @@ static void queue_request(struct fuse_conn *fc, struct fuse_req *req) | |||
250 | 250 | ||
251 | static void flush_bg_queue(struct fuse_conn *fc) | 251 | static void flush_bg_queue(struct fuse_conn *fc) |
252 | { | 252 | { |
253 | while (fc->active_background < FUSE_MAX_BACKGROUND && | 253 | while (fc->active_background < fc->max_background && |
254 | !list_empty(&fc->bg_queue)) { | 254 | !list_empty(&fc->bg_queue)) { |
255 | struct fuse_req *req; | 255 | struct fuse_req *req; |
256 | 256 | ||
@@ -280,11 +280,11 @@ __releases(&fc->lock) | |||
280 | list_del(&req->intr_entry); | 280 | list_del(&req->intr_entry); |
281 | req->state = FUSE_REQ_FINISHED; | 281 | req->state = FUSE_REQ_FINISHED; |
282 | if (req->background) { | 282 | if (req->background) { |
283 | if (fc->num_background == FUSE_MAX_BACKGROUND) { | 283 | if (fc->num_background == fc->max_background) { |
284 | fc->blocked = 0; | 284 | fc->blocked = 0; |
285 | wake_up_all(&fc->blocked_waitq); | 285 | wake_up_all(&fc->blocked_waitq); |
286 | } | 286 | } |
287 | if (fc->num_background == FUSE_CONGESTION_THRESHOLD && | 287 | if (fc->num_background == fc->congestion_threshold && |
288 | fc->connected && fc->bdi_initialized) { | 288 | fc->connected && fc->bdi_initialized) { |
289 | clear_bdi_congested(&fc->bdi, READ); | 289 | clear_bdi_congested(&fc->bdi, READ); |
290 | clear_bdi_congested(&fc->bdi, WRITE); | 290 | clear_bdi_congested(&fc->bdi, WRITE); |
@@ -410,9 +410,9 @@ static void fuse_request_send_nowait_locked(struct fuse_conn *fc, | |||
410 | { | 410 | { |
411 | req->background = 1; | 411 | req->background = 1; |
412 | fc->num_background++; | 412 | fc->num_background++; |
413 | if (fc->num_background == FUSE_MAX_BACKGROUND) | 413 | if (fc->num_background == fc->max_background) |
414 | fc->blocked = 1; | 414 | fc->blocked = 1; |
415 | if (fc->num_background == FUSE_CONGESTION_THRESHOLD && | 415 | if (fc->num_background == fc->congestion_threshold && |
416 | fc->bdi_initialized) { | 416 | fc->bdi_initialized) { |
417 | set_bdi_congested(&fc->bdi, READ); | 417 | set_bdi_congested(&fc->bdi, READ); |
418 | set_bdi_congested(&fc->bdi, WRITE); | 418 | set_bdi_congested(&fc->bdi, WRITE); |
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 52b641fc0faf..6bcfab04396f 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -25,12 +25,6 @@ | |||
25 | /** Max number of pages that can be used in a single read request */ | 25 | /** Max number of pages that can be used in a single read request */ |
26 | #define FUSE_MAX_PAGES_PER_REQ 32 | 26 | #define FUSE_MAX_PAGES_PER_REQ 32 |
27 | 27 | ||
28 | /** Maximum number of outstanding background requests */ | ||
29 | #define FUSE_MAX_BACKGROUND 12 | ||
30 | |||
31 | /** Congestion starts at 75% of maximum */ | ||
32 | #define FUSE_CONGESTION_THRESHOLD (FUSE_MAX_BACKGROUND * 75 / 100) | ||
33 | |||
34 | /** Bias for fi->writectr, meaning new writepages must not be sent */ | 28 | /** Bias for fi->writectr, meaning new writepages must not be sent */ |
35 | #define FUSE_NOWRITE INT_MIN | 29 | #define FUSE_NOWRITE INT_MIN |
36 | 30 | ||
@@ -349,6 +343,12 @@ struct fuse_conn { | |||
349 | /** rbtree of fuse_files waiting for poll events indexed by ph */ | 343 | /** rbtree of fuse_files waiting for poll events indexed by ph */ |
350 | struct rb_root polled_files; | 344 | struct rb_root polled_files; |
351 | 345 | ||
346 | /** Maximum number of outstanding background requests */ | ||
347 | unsigned max_background; | ||
348 | |||
349 | /** Number of background requests at which congestion starts */ | ||
350 | unsigned congestion_threshold; | ||
351 | |||
352 | /** Number of requests currently in the background */ | 352 | /** Number of requests currently in the background */ |
353 | unsigned num_background; | 353 | unsigned num_background; |
354 | 354 | ||
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index f91ccc4a189d..9aa6f46d0c32 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -32,6 +32,12 @@ DEFINE_MUTEX(fuse_mutex); | |||
32 | 32 | ||
33 | #define FUSE_DEFAULT_BLKSIZE 512 | 33 | #define FUSE_DEFAULT_BLKSIZE 512 |
34 | 34 | ||
35 | /** Maximum number of outstanding background requests */ | ||
36 | #define FUSE_DEFAULT_MAX_BACKGROUND 12 | ||
37 | |||
38 | /** Congestion starts at 75% of maximum */ | ||
39 | #define FUSE_DEFAULT_CONGESTION_THRESHOLD (FUSE_DEFAULT_MAX_BACKGROUND * 3 / 4) | ||
40 | |||
35 | struct fuse_mount_data { | 41 | struct fuse_mount_data { |
36 | int fd; | 42 | int fd; |
37 | unsigned rootmode; | 43 | unsigned rootmode; |
@@ -517,6 +523,8 @@ void fuse_conn_init(struct fuse_conn *fc) | |||
517 | INIT_LIST_HEAD(&fc->bg_queue); | 523 | INIT_LIST_HEAD(&fc->bg_queue); |
518 | INIT_LIST_HEAD(&fc->entry); | 524 | INIT_LIST_HEAD(&fc->entry); |
519 | atomic_set(&fc->num_waiting, 0); | 525 | atomic_set(&fc->num_waiting, 0); |
526 | fc->max_background = FUSE_DEFAULT_MAX_BACKGROUND; | ||
527 | fc->congestion_threshold = FUSE_DEFAULT_CONGESTION_THRESHOLD; | ||
520 | fc->khctr = 0; | 528 | fc->khctr = 0; |
521 | fc->polled_files = RB_ROOT; | 529 | fc->polled_files = RB_ROOT; |
522 | fc->reqctr = 0; | 530 | fc->reqctr = 0; |
@@ -736,6 +744,12 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) | |||
736 | else { | 744 | else { |
737 | unsigned long ra_pages; | 745 | unsigned long ra_pages; |
738 | 746 | ||
747 | if (arg->minor >= 13) { | ||
748 | if (arg->max_background) | ||
749 | fc->max_background = arg->max_background; | ||
750 | if (arg->congestion_threshold) | ||
751 | fc->congestion_threshold = arg->congestion_threshold; | ||
752 | } | ||
739 | if (arg->minor >= 6) { | 753 | if (arg->minor >= 6) { |
740 | ra_pages = arg->max_readahead / PAGE_CACHE_SIZE; | 754 | ra_pages = arg->max_readahead / PAGE_CACHE_SIZE; |
741 | if (arg->flags & FUSE_ASYNC_READ) | 755 | if (arg->flags & FUSE_ASYNC_READ) |