From: Jens Axboe <jaxboe@fusionio.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: "mtk.manpages@gmail.com" <mtk.manpages@gmail.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [patch] pipe: add support for shrinking and growing pipes
Date: Thu, 03 Jun 2010 13:37:26 +0200 [thread overview]
Message-ID: <4C0793F6.4070107@fusionio.com> (raw)
In-Reply-To: <E1OK8fK-0007Wa-BU@pomaz-ex.szeredi.hu>
On 2010-06-03 13:32, Miklos Szeredi wrote:
> On Thu, 03 Jun 2010, Jens Axboe wrote:
>> I looked at that when I did the original pipe-max-pages, but it seems
>> we're not consistent in this regard. Anyway, here's what I came up with.
>> Not tested yet, and I hope thunderbird doesn't fsck up the patch.
>
> Unfortunately it did (line wrap damage).
I suspected it might. This better?
diff --git a/fs/pipe.c b/fs/pipe.c
index f98fae3..f7f62f3 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -26,9 +26,14 @@
/*
* The max size that a non-root user is allowed to grow the pipe. Can
- * be set by root in /proc/sys/fs/pipe-max-pages
+ * be set by root in /proc/sys/fs/pipe_max_size
*/
-unsigned int pipe_max_pages = PIPE_DEF_BUFFERS * 16;
+unsigned int pipe_max_size = 1048576;
+
+/*
+ * Minimum pipe size, as required by POSIX
+ */
+unsigned int pipe_min_size = PAGE_SIZE;
/*
* We use a start+len construction, which provides full use of the
@@ -1156,6 +1161,35 @@ static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages)
return nr_pages * PAGE_SIZE;
}
+/*
+ * Currently we rely on the pipe array holding a power-of-2 number
+ * of pages.
+ */
+static inline unsigned int round_pipe_size(unsigned int size)
+{
+ unsigned long nr_pages;
+
+ nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ return roundup_pow_of_two(nr_pages) << PAGE_SHIFT;
+}
+
+/*
+ * This should work even if CONFIG_PROC_FS isn't set, as proc_dointvec_minmax
+ * will return an error.
+ */
+int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,
+ size_t *lenp, loff_t *ppos)
+{
+ int ret;
+
+ ret = proc_dointvec_minmax(table, write, buf, lenp, ppos);
+ if (ret < 0 || !write)
+ return ret;
+
+ pipe_max_size = round_pipe_size(pipe_max_size);
+ return ret;
+}
+
long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct pipe_inode_info *pipe;
@@ -1169,23 +1203,19 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case F_SETPIPE_SZ: {
- unsigned long nr_pages;
+ unsigned int size, nr_pages;
- /*
- * Currently the array must be a power-of-2 size, so adjust
- * upwards if needed.
- */
- nr_pages = (arg + PAGE_SIZE - 1) >> PAGE_SHIFT;
- nr_pages = roundup_pow_of_two(nr_pages);
+ size = round_pipe_size(arg);
+ nr_pages = size >> PAGE_SHIFT;
- if (!capable(CAP_SYS_RESOURCE) && nr_pages > pipe_max_pages) {
+ if (!capable(CAP_SYS_RESOURCE) && size > pipe_max_size) {
ret = -EPERM;
goto out;
- } else if (nr_pages < 1) {
+ } else if (nr_pages < PAGE_SIZE) {
ret = -EINVAL;
goto out;
}
- ret = pipe_set_size(pipe, arg);
+ ret = pipe_set_size(pipe, nr_pages);
break;
}
case F_GETPIPE_SZ:
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
index 16de393..4457969 100644
--- a/include/linux/pipe_fs_i.h
+++ b/include/linux/pipe_fs_i.h
@@ -139,7 +139,9 @@ void pipe_lock(struct pipe_inode_info *);
void pipe_unlock(struct pipe_inode_info *);
void pipe_double_lock(struct pipe_inode_info *, struct pipe_inode_info *);
-extern unsigned int pipe_max_pages;
+extern unsigned int pipe_max_size, pipe_min_size;
+int pipe_proc_fn(struct ctl_table *, int, void __user *, size_t *, loff_t *);
+
/* Drop the inode semaphore and wait for a pipe event, atomically */
void pipe_wait(struct pipe_inode_info *pipe);
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 997080f..2f9b3a6 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1471,12 +1471,12 @@ static struct ctl_table fs_table[] = {
},
#endif
{
- .procname = "pipe-max-pages",
- .data = &pipe_max_pages,
+ .procname = "pipe_max_size",
+ .data = &pipe_max_size,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = &proc_dointvec_minmax,
- .extra1 = &two,
+ .proc_handler = &pipe_proc_fn,
+ .extra1 = &pipe_min_size,
},
/*
* NOTE: do not add new entries to this table unless you have read
--
Jens Axboe
next prev parent reply other threads:[~2010-06-03 11:37 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-19 16:45 [patch] pipe: add support for shrinking and growing pipes Miklos Szeredi
2010-05-19 16:49 ` Linus Torvalds
2010-05-19 18:05 ` Jens Axboe
2010-05-19 19:05 ` Jens Axboe
2010-05-20 8:33 ` Miklos Szeredi
2010-05-20 8:37 ` Jens Axboe
2010-05-20 17:42 ` Linus Torvalds
2010-05-20 17:48 ` Jens Axboe
2010-05-21 17:13 ` Rick Sherm
2010-05-23 5:30 ` Michael Kerrisk
2010-05-23 2:38 ` Andrew Morton
2010-05-23 5:52 ` Michael Kerrisk
2010-05-23 7:09 ` Jens Axboe
2010-05-23 9:24 ` Michael Kerrisk
2010-05-23 17:47 ` Jens Axboe
2010-05-24 1:43 ` OGAWA Hirofumi
2010-05-24 4:43 ` Michael Kerrisk
2010-05-24 4:43 ` Michael Kerrisk
2010-05-24 7:05 ` Jens Axboe
2010-05-24 7:27 ` Michael Kerrisk
2010-05-24 7:27 ` Michael Kerrisk
2010-05-24 17:35 ` Jens Axboe
2010-05-24 17:52 ` Michael Kerrisk
2010-05-24 17:56 ` Jens Axboe
2010-05-25 4:01 ` Michael Kerrisk
2010-06-01 7:48 ` Jens Axboe
2010-06-01 15:22 ` Linus Torvalds
2010-06-01 16:36 ` Loke, Chetan
2010-05-27 6:49 ` Michael Kerrisk
2010-06-01 7:45 ` Jens Axboe
2010-06-02 19:25 ` Michael Kerrisk
2010-06-03 6:10 ` Jens Axboe
2010-06-03 6:46 ` Michael Kerrisk
2010-06-03 7:01 ` Jens Axboe
2010-06-03 7:01 ` Jens Axboe
2010-06-03 7:05 ` Michael Kerrisk
2010-06-03 7:05 ` Michael Kerrisk
2010-06-03 7:48 ` Michael Kerrisk
2010-06-03 7:48 ` Michael Kerrisk
2010-06-03 7:58 ` Michael Kerrisk
2010-06-03 7:58 ` Michael Kerrisk
2010-06-03 8:29 ` Michael Kerrisk
2010-06-03 8:53 ` Michael Kerrisk
[not found] ` <4C07862D.4090709@fusionio.com>
[not found] ` <AANLkTincO5thcP-yASUtIV41TtY3ZmG9YSU-J5nT2sFg@mail.gmail.com>
2010-06-03 11:11 ` Jens Axboe
[not found] ` <4C078610.6020901@fusionio.com>
[not found] ` <AANLkTinhO5oRDPXyXaeAOZU3i55eBKsx4iFMOzwm98na@mail.gmail.com>
[not found] ` <AANLkTin_8MU3AbJ_KeXr2uTxtRFJ5ABmBAyigU6m-C6u@mail.gmail.com>
2010-06-03 11:12 ` Jens Axboe
2010-06-03 11:32 ` Miklos Szeredi
2010-06-03 11:37 ` Jens Axboe [this message]
2010-06-03 12:45 ` Miklos Szeredi
2010-06-03 12:50 ` Jens Axboe
2010-06-19 5:45 ` Michael Kerrisk
2010-06-19 18:13 ` Jens Axboe
2010-06-20 5:37 ` Michael Kerrisk
2010-06-03 16:06 ` Miklos Szeredi
2010-05-24 7:04 ` Jens Axboe
2010-05-24 7:28 ` Michael Kerrisk
2010-05-24 7:28 ` Michael Kerrisk
2010-05-24 7:49 ` OGAWA Hirofumi
2010-05-24 14:51 ` Brian Bloniarz
2010-05-24 15:43 ` Michael Kerrisk
2010-05-24 7:46 ` OGAWA Hirofumi
2010-05-24 17:15 ` Jens Axboe
2010-05-24 18:12 ` OGAWA Hirofumi
2010-05-24 18:16 ` Michael Kerrisk
2010-05-20 12:52 ` Andi Kleen
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=4C0793F6.4070107@fusionio.com \
--to=jaxboe@fusionio.com \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=mtk.manpages@gmail.com \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.