LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Miklos Szeredi <miklos@szeredi.hu> To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [patch 21/22] fuse: limit dirty pages Date: Wed, 28 Feb 2007 00:15:03 +0100 [thread overview] Message-ID: <20070227231737.946840361@szeredi.hu> (raw) In-Reply-To: 20070227231442.627972152@szeredi.hu [-- Attachment #1: fuse_dirty_limit.patch --] [-- Type: text/plain, Size: 2803 bytes --] From: Miklos Szeredi <mszeredi@suse.cz> Add a per-filesystem limit for the number of dirty pages. If half the limit is reached, background writeback is started. If the limit is reached, then start some writeback and wait until the the number goes below the limit again. The dirty limit is currently hardcoded at 1MB. This limiting is necessary, so that buggy or unfriendly filesystems don't hurt system performance too badly. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> --- Index: linux/fs/fuse/file.c =================================================================== --- linux.orig/fs/fuse/file.c 2007-02-27 14:41:12.000000000 +0100 +++ linux/fs/fuse/file.c 2007-02-27 14:41:13.000000000 +0100 @@ -780,10 +780,35 @@ static void fuse_vma_close(struct vm_are filemap_write_and_wait(vma->vm_file->f_mapping); } +static int fuse_page_mkwrite(struct vm_area_struct *vma, struct page *page) +{ + struct inode *inode = page->mapping->host; + struct fuse_conn *fc = get_fuse_conn(inode); + long nr_dirty = atomic_long_read(&fc->bdi.nr_dirty); + struct writeback_control wbc = { + .sync_mode = WB_SYNC_NONE, + .nr_to_write = FUSE_MAX_PAGES_PER_REQ, + .range_cyclic = 1, + }; + + while (nr_dirty >= fc->max_dirty) { + sync_sb(inode->i_sb, &wbc); + congestion_wait(WRITE, HZ / 10); + nr_dirty = atomic_long_read(&fc->bdi.nr_dirty); + wbc.nr_to_write = FUSE_MAX_PAGES_PER_REQ; + } + if (nr_dirty >= fc->max_dirty / 2) { + wbc.nonblocking = 1; + sync_sb(inode->i_sb, &wbc); + } + return 0; +} + static struct vm_operations_struct fuse_file_vm_ops = { .close = fuse_vma_close, .nopage = filemap_nopage, .populate = filemap_populate, + .page_mkwrite = fuse_page_mkwrite, }; static void fuse_send_writepages(struct fuse_req *req, struct inode *inode) Index: linux/fs/fuse/fuse_i.h =================================================================== --- linux.orig/fs/fuse/fuse_i.h 2007-02-27 14:41:13.000000000 +0100 +++ linux/fs/fuse/fuse_i.h 2007-02-27 14:41:13.000000000 +0100 @@ -397,6 +397,9 @@ struct fuse_conn { /** Reserved request for the DESTROY message */ struct fuse_req *destroy_req; + + /** Maximum number of dirty pages in this fs */ + unsigned long max_dirty; }; static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb) Index: linux/fs/fuse/inode.c =================================================================== --- linux.orig/fs/fuse/inode.c 2007-02-27 14:41:11.000000000 +0100 +++ linux/fs/fuse/inode.c 2007-02-27 14:41:13.000000000 +0100 @@ -425,6 +425,7 @@ static struct fuse_conn *new_conn(void) fc->bdi.unplug_io_fn = default_unplug_io_fn; fc->reqctr = 0; fc->blocked = 1; + fc->max_dirty = (1024 * 1024) / PAGE_CACHE_SIZE; get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); } return fc; --
next prev parent reply other threads:[~2007-02-27 23:18 UTC|newest] Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-02-27 23:14 [patch 00/22] misc VFS/VM patches and fuse writable shared mapping support Miklos Szeredi 2007-02-27 23:14 ` [patch 01/22] update ctime and mtime for mmaped write Miklos Szeredi 2007-02-28 14:16 ` Peter Staubach 2007-02-28 17:06 ` Miklos Szeredi 2007-02-28 17:21 ` Peter Staubach 2007-02-28 17:51 ` Miklos Szeredi 2007-02-28 20:01 ` Peter Staubach 2007-02-28 20:35 ` Miklos Szeredi 2007-02-28 20:58 ` Miklos Szeredi 2007-02-28 21:09 ` Peter Staubach 2007-03-01 7:25 ` Miklos Szeredi 2007-02-27 23:14 ` [patch 02/22] fix quadratic behavior of shrink_dcache_parent() Miklos Szeredi 2007-02-27 23:14 ` [patch 03/22] fix deadlock in balance_dirty_pages Miklos Szeredi 2007-02-27 23:14 ` [patch 04/22] fix deadlock in throttle_vm_writeout Miklos Szeredi 2007-02-27 23:14 ` [patch 05/22] balance dirty pages from loop device Miklos Szeredi 2007-02-27 23:14 ` [patch 06/22] consolidate generic_writepages and mpage_writepages Miklos Szeredi 2007-02-27 23:14 ` [patch 07/22] add filesystem subtype support Miklos Szeredi 2007-02-27 23:14 ` [patch 08/22] fuse: update backing_dev_info congestion state Miklos Szeredi 2007-02-27 23:14 ` [patch 09/22] fuse: fix reserved request wake up Miklos Szeredi 2007-02-27 23:14 ` [patch 10/22] fuse: add reference counting to fuse_file Miklos Szeredi 2007-02-27 23:14 ` [patch 11/22] fuse: add truncation semaphore Miklos Szeredi 2007-02-27 23:14 ` [patch 12/22] fuse: fix page invalidation Miklos Szeredi 2007-02-27 23:14 ` [patch 13/22] fuse: add list of writable files to fuse_inode Miklos Szeredi 2007-02-27 23:14 ` [patch 14/22] fuse: add helper for asynchronous writes Miklos Szeredi 2007-02-27 23:14 ` [patch 15/22] add non-owner variant of down_read_trylock() Miklos Szeredi 2007-02-27 23:14 ` [patch 16/22] fuse: add fuse_writepage() function Miklos Szeredi 2007-02-27 23:14 ` [patch 17/22] fuse: writable shared mmap support Miklos Szeredi 2007-02-27 23:15 ` [patch 18/22] fuse: add fuse_writepages() function Miklos Szeredi 2007-02-27 23:15 ` [patch 19/22] export sync_sb() to modules Miklos Szeredi 2007-02-27 23:15 ` [patch 20/22] fuse: make dirty stats available Miklos Szeredi 2007-02-27 23:15 ` Miklos Szeredi [this message] 2007-02-27 23:15 ` [patch 22/22] fuse: allow big write requests Miklos Szeredi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20070227231737.946840361@szeredi.hu \ --to=miklos@szeredi.hu \ --cc=akpm@linux-foundation.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).