aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2007-10-17 02:30:59 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 11:43:03 -0400
commitf92b99b9dccb61760b345baf40ed37f59b91f8af (patch)
tree1460ac391186be79beb79a6d4030cc387239681c
parentfdc1ca8abae72c5829e099fd35626b83ecb12666 (diff)
fuse: update backing_dev_info congestion state
Set the read and write congestion state if the request queue is close to blocking, and clear it when it's not. This prevents unnecessary blocking in readahead and (when writable mmaps are allowed) writeback. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/fuse/dev.c8
-rw-r--r--fs/fuse/fuse_i.h5
2 files changed, 12 insertions, 1 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 3ad22beb24c2..ebc36f525eee 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -224,6 +224,10 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
224 fc->blocked = 0; 224 fc->blocked = 0;
225 wake_up_all(&fc->blocked_waitq); 225 wake_up_all(&fc->blocked_waitq);
226 } 226 }
227 if (fc->num_background == FUSE_CONGESTION_THRESHOLD) {
228 clear_bdi_congested(&fc->bdi, READ);
229 clear_bdi_congested(&fc->bdi, WRITE);
230 }
227 fc->num_background--; 231 fc->num_background--;
228 } 232 }
229 spin_unlock(&fc->lock); 233 spin_unlock(&fc->lock);
@@ -378,6 +382,10 @@ static void request_send_nowait(struct fuse_conn *fc, struct fuse_req *req)
378 fc->num_background++; 382 fc->num_background++;
379 if (fc->num_background == FUSE_MAX_BACKGROUND) 383 if (fc->num_background == FUSE_MAX_BACKGROUND)
380 fc->blocked = 1; 384 fc->blocked = 1;
385 if (fc->num_background == FUSE_CONGESTION_THRESHOLD) {
386 set_bdi_congested(&fc->bdi, READ);
387 set_bdi_congested(&fc->bdi, WRITE);
388 }
381 389
382 queue_request(fc, req); 390 queue_request(fc, req);
383 spin_unlock(&fc->lock); 391 spin_unlock(&fc->lock);
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 68ae87cbafab..9f4603beb9e8 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -20,7 +20,10 @@
20#define FUSE_MAX_PAGES_PER_REQ 32 20#define FUSE_MAX_PAGES_PER_REQ 32
21 21
22/** Maximum number of outstanding background requests */ 22/** Maximum number of outstanding background requests */
23#define FUSE_MAX_BACKGROUND 10 23#define FUSE_MAX_BACKGROUND 12
24
25/** Congestion starts at 75% of maximum */
26#define FUSE_CONGESTION_THRESHOLD (FUSE_MAX_BACKGROUND * 75 / 100)
24 27
25/** It could be as large as PATH_MAX, but would that have any uses? */ 28/** It could be as large as PATH_MAX, but would that have any uses? */
26#define FUSE_NAME_MAX 1024 29#define FUSE_NAME_MAX 1024