* Change proc/<pid>/cmdline to 8k
@ 2015-06-04 4:22 Navin P
2015-06-04 5:17 ` Greg KH
0 siblings, 1 reply; 11+ messages in thread
From: Navin P @ 2015-06-04 4:22 UTC (permalink / raw)
To: kernelnewbies
Hi,
I want to change the cmdline of a process to support 8096 . It works
well on ppc where the page size is 65k.
But when i try to increase it on x86 (i686)
http://lxr.free-electrons.com/source/fs/proc/base.c by doing
6*PAGE_SIZE, i get kernel panic after some time
199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
200 struct pid *pid, struct task_struct *task)
201 {
202 /*
203 * Rely on struct seq_operations::show() being called once
204 * per internal buffer allocation. See single_open(), traverse().
205 */
206 BUG_ON(m->size < PAGE_SIZE);
207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
208 return 0;
209 }
210
Regards,
Navin
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 4:22 Change proc/<pid>/cmdline to 8k Navin P
@ 2015-06-04 5:17 ` Greg KH
2015-06-04 7:41 ` Navin P
0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2015-06-04 5:17 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 04, 2015 at 09:52:08AM +0530, Navin P wrote:
> Hi,
>
> I want to change the cmdline of a process to support 8096 . It works
> well on ppc where the page size is 65k.
> But when i try to increase it on x86 (i686)
>
> http://lxr.free-electrons.com/source/fs/proc/base.c by doing
> 6*PAGE_SIZE, i get kernel panic after some time
>
> 199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
> 200 struct pid *pid, struct task_struct *task)
> 201 {
> 202 /*
> 203 * Rely on struct seq_operations::show() being called once
> 204 * per internal buffer allocation. See single_open(), traverse().
> 205 */
> 206 BUG_ON(m->size < PAGE_SIZE);
> 207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
> 208 return 0;
> 209 }
> 210
That shows you that this will not work, sorry.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 5:17 ` Greg KH
@ 2015-06-04 7:41 ` Navin P
2015-06-04 8:04 ` Greg KH
0 siblings, 1 reply; 11+ messages in thread
From: Navin P @ 2015-06-04 7:41 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 4, 2015 at 10:47 AM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Thu, Jun 04, 2015 at 09:52:08AM +0530, Navin P wrote:
>> Hi,
>>
>> I want to change the cmdline of a process to support 8096 . It works
>> well on ppc where the page size is 65k.
>> But when i try to increase it on x86 (i686)
>>
>> http://lxr.free-electrons.com/source/fs/proc/base.c by doing
>> 6*PAGE_SIZE, i get kernel panic after some time
>>
>> 199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
>> 200 struct pid *pid, struct task_struct *task)
>> 201 {
>> 202 /*
>> 203 * Rely on struct seq_operations::show() being called once
>> 204 * per internal buffer allocation. See single_open(), traverse().
>> 205 */
>> 206 BUG_ON(m->size < PAGE_SIZE);
>> 207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
>> 208 return 0;
>> 209 }
>> 210
>
> That shows you that this will not work, sorry.
Can you please help me and guide me into achieving this ?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 7:41 ` Navin P
@ 2015-06-04 8:04 ` Greg KH
2015-06-04 15:36 ` Navin P
0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2015-06-04 8:04 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 04, 2015 at 01:11:48PM +0530, Navin P wrote:
> On Thu, Jun 4, 2015 at 10:47 AM, Greg KH <gregkh@linuxfoundation.org> wrote:
> > On Thu, Jun 04, 2015 at 09:52:08AM +0530, Navin P wrote:
> >> Hi,
> >>
> >> I want to change the cmdline of a process to support 8096 . It works
> >> well on ppc where the page size is 65k.
> >> But when i try to increase it on x86 (i686)
> >>
> >> http://lxr.free-electrons.com/source/fs/proc/base.c by doing
> >> 6*PAGE_SIZE, i get kernel panic after some time
> >>
> >> 199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
> >> 200 struct pid *pid, struct task_struct *task)
> >> 201 {
> >> 202 /*
> >> 203 * Rely on struct seq_operations::show() being called once
> >> 204 * per internal buffer allocation. See single_open(), traverse().
> >> 205 */
> >> 206 BUG_ON(m->size < PAGE_SIZE);
> >> 207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
> >> 208 return 0;
> >> 209 }
> >> 210
> >
> > That shows you that this will not work, sorry.
>
> Can you please help me and guide me into achieving this ?
Why do you want this? What problem are you trying to solve that you
have come to the conclusion that increasing the size of the command line
is the solution?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 8:04 ` Greg KH
@ 2015-06-04 15:36 ` Navin P
2015-06-04 22:07 ` Greg KH
2015-06-04 22:19 ` Valdis.Kletnieks at vt.edu
0 siblings, 2 replies; 11+ messages in thread
From: Navin P @ 2015-06-04 15:36 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 4, 2015 at 1:34 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Thu, Jun 04, 2015 at 01:11:48PM +0530, Navin P wrote:
>> On Thu, Jun 4, 2015 at 10:47 AM, Greg KH <gregkh@linuxfoundation.org> wrote:
>> > On Thu, Jun 04, 2015 at 09:52:08AM +0530, Navin P wrote:
>> >> Hi,
>> >>
>> >> I want to change the cmdline of a process to support 8096 . It works
>> >> well on ppc where the page size is 65k.
>> >> But when i try to increase it on x86 (i686)
>> >>
>> >> http://lxr.free-electrons.com/source/fs/proc/base.c by doing
>> >> 6*PAGE_SIZE, i get kernel panic after some time
>> >>
>> >> 199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
>> >> 200 struct pid *pid, struct task_struct *task)
>> >> 201 {
>> >> 202 /*
>> >> 203 * Rely on struct seq_operations::show() being called once
>> >> 204 * per internal buffer allocation. See single_open(), traverse().
>> >> 205 */
>> >> 206 BUG_ON(m->size < PAGE_SIZE);
>> >> 207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
>> >> 208 return 0;
>> >> 209 }
>> >> 210
>> >
>> > That shows you that this will not work, sorry.
>>
>> Can you please help me and guide me into achieving this ?
>
> Why do you want this? What problem are you trying to solve that you
> have come to the conclusion that increasing the size of the command line
> is the solution?
>
I'm trying to learn things so that default cmd linux across all
distributions for ia64 and ppc which has PAGE_SIZE has 64k works . We
have this 3rd party application with deeply mounted dir that runs as a
testcase more than 5k chars . We can change it , i thought if that was
the problem ? So just trying to learn. I tried changing the PAGE_SHIFT
but that made the kernel non-bootable or stuck at booting.
This panics only when you access the pid with more than 4k chars.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 15:36 ` Navin P
@ 2015-06-04 22:07 ` Greg KH
2015-06-04 22:18 ` Valdis.Kletnieks at vt.edu
2015-06-04 22:19 ` Valdis.Kletnieks at vt.edu
1 sibling, 1 reply; 11+ messages in thread
From: Greg KH @ 2015-06-04 22:07 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 04, 2015 at 09:06:10PM +0530, Navin P wrote:
> On Thu, Jun 4, 2015 at 1:34 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> > On Thu, Jun 04, 2015 at 01:11:48PM +0530, Navin P wrote:
> >> On Thu, Jun 4, 2015 at 10:47 AM, Greg KH <gregkh@linuxfoundation.org> wrote:
> >> > On Thu, Jun 04, 2015 at 09:52:08AM +0530, Navin P wrote:
> >> >> Hi,
> >> >>
> >> >> I want to change the cmdline of a process to support 8096 . It works
> >> >> well on ppc where the page size is 65k.
> >> >> But when i try to increase it on x86 (i686)
> >> >>
> >> >> http://lxr.free-electrons.com/source/fs/proc/base.c by doing
> >> >> 6*PAGE_SIZE, i get kernel panic after some time
> >> >>
> >> >> 199 static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
> >> >> 200 struct pid *pid, struct task_struct *task)
> >> >> 201 {
> >> >> 202 /*
> >> >> 203 * Rely on struct seq_operations::show() being called once
> >> >> 204 * per internal buffer allocation. See single_open(), traverse().
> >> >> 205 */
> >> >> 206 BUG_ON(m->size < PAGE_SIZE);
> >> >> 207 m->count += get_cmdline(task, m->buf, 6*PAGE_SIZE);
> >> >> 208 return 0;
> >> >> 209 }
> >> >> 210
> >> >
> >> > That shows you that this will not work, sorry.
> >>
> >> Can you please help me and guide me into achieving this ?
> >
> > Why do you want this? What problem are you trying to solve that you
> > have come to the conclusion that increasing the size of the command line
> > is the solution?
> >
> I'm trying to learn things so that default cmd linux across all
> distributions for ia64 and ppc which has PAGE_SIZE has 64k works . We
> have this 3rd party application with deeply mounted dir that runs as a
> testcase more than 5k chars .
Applications shouldn't be messing around with the kernel command line.
> We can change it , i thought if that was
> the problem ? So just trying to learn. I tried changing the PAGE_SHIFT
> but that made the kernel non-bootable or stuck at booting.
You can not easily, if at all, change the PAGE_SIZE of an architecture.
That is a non-trivial task that takes a ton of knowledge about the
platform.
> This panics only when you access the pid with more than 4k chars.
A pid is a number, not a string. What do you mean by "pid" in this
context?
greg k-h
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 22:07 ` Greg KH
@ 2015-06-04 22:18 ` Valdis.Kletnieks at vt.edu
2015-06-04 22:38 ` Greg KH
0 siblings, 1 reply; 11+ messages in thread
From: Valdis.Kletnieks at vt.edu @ 2015-06-04 22:18 UTC (permalink / raw)
To: kernelnewbies
On Fri, 05 Jun 2015 07:07:30 +0900, Greg KH said:
> Applications shouldn't be messing around with the kernel command line.
He's looking at /proc/<PID>/cmdline, which is a different beast.
Presumably, he's looking at 'ps axwwwwwwwwwww' and still not seeing the
full process commandline, and that irritates him for some reason...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 848 bytes
Desc: not available
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20150604/8ecb1fb5/attachment.bin
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 15:36 ` Navin P
2015-06-04 22:07 ` Greg KH
@ 2015-06-04 22:19 ` Valdis.Kletnieks at vt.edu
2015-06-05 3:21 ` Navin P
1 sibling, 1 reply; 11+ messages in thread
From: Valdis.Kletnieks at vt.edu @ 2015-06-04 22:19 UTC (permalink / raw)
To: kernelnewbies
On Thu, 04 Jun 2015 21:06:10 +0530, Navin P said:
> have this 3rd party application with deeply mounted dir that runs as a
> testcase more than 5k chars . We can change it , i thought if that was
> the problem ?
So why is a long commandline a problem that needs solving? Are you actually
caring what the command line says? If so, why?
Hint: There's no guarantee that your commandline contain the actual full
command string. Consider this on an x86_84 kernel (yes, my $HOME does
need a good cleaning))
% /bin/echo * | wc
1 1884 25797
1,884 parameters in argv[], totalling some 24K of data. Which means that
20k isn't displayable. And extending it to 64k won't fix the problem, as
demonstrated by looking at a rather large mail folder I have:
% /bin/echo ietf/* | wc
1 62257 673721
OK, how far can we take this?
% echo | xargs --show-limits echo
Your environment variables take up 1918 bytes
POSIX upper limit on argument length (this system): 2093186
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2091268
Size of command buffer we are actually using: 131072
Apparently, up to 2M or so...
So what problem are you trying to solve, and why?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 848 bytes
Desc: not available
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20150604/2332681d/attachment.bin
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 22:18 ` Valdis.Kletnieks at vt.edu
@ 2015-06-04 22:38 ` Greg KH
0 siblings, 0 replies; 11+ messages in thread
From: Greg KH @ 2015-06-04 22:38 UTC (permalink / raw)
To: kernelnewbies
On Thu, Jun 04, 2015 at 06:18:11PM -0400, Valdis.Kletnieks at vt.edu wrote:
> On Fri, 05 Jun 2015 07:07:30 +0900, Greg KH said:
>
> > Applications shouldn't be messing around with the kernel command line.
>
> He's looking at /proc/<PID>/cmdline, which is a different beast.
Ah, doh, you are right, nevermind...
> Presumably, he's looking at 'ps axwwwwwwwwwww' and still not seeing the
> full process commandline, and that irritates him for some reason...
Yeah, that's not a good thing to rely on to even be correct, as it is
easy for an application to change that value.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-04 22:19 ` Valdis.Kletnieks at vt.edu
@ 2015-06-05 3:21 ` Navin P
2015-06-16 10:34 ` Navin P
0 siblings, 1 reply; 11+ messages in thread
From: Navin P @ 2015-06-05 3:21 UTC (permalink / raw)
To: kernelnewbies
On Fri, Jun 5, 2015 at 3:49 AM, <Valdis.Kletnieks@vt.edu> wrote:
> On Thu, 04 Jun 2015 21:06:10 +0530, Navin P said:
>> have this 3rd party application with deeply mounted dir that runs as a
>> testcase more than 5k chars . We can change it , i thought if that was
>> the problem ?
>
> So why is a long commandline a problem that needs solving? Are you actually
> caring what the command line says? If so, why?
>
> Hint: There's no guarantee that your commandline contain the actual full
> command string. Consider this on an x86_84 kernel (yes, my $HOME does
> need a good cleaning))
>
> % /bin/echo * | wc
> 1 1884 25797
>
> 1,884 parameters in argv[], totalling some 24K of data. Which means that
> 20k isn't displayable. And extending it to 64k won't fix the problem, as
> demonstrated by looking at a rather large mail folder I have:
>
> % /bin/echo ietf/* | wc
> 1 62257 673721
>
> OK, how far can we take this?
>
> % echo | xargs --show-limits echo
> Your environment variables take up 1918 bytes
> POSIX upper limit on argument length (this system): 2093186
> POSIX smallest allowable upper limit on argument length (all systems): 4096
> Maximum length of command we could actually use: 2091268
> Size of command buffer we are actually using: 131072
>
> Apparently, up to 2M or so...
>
> So what problem are you trying to solve, and why?
Thanks.
In fs/proc/base.c
static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
200 struct pid *pid, struct task_struct *task)
201 {
202 /*
203 * Rely on struct seq_operations::show() being called once
204 * per internal buffer allocation. See single_open(), traverse().
205 */
206 BUG_ON(m->size < PAGE_SIZE);
207 m->count += get_cmdline(task, m->buf, PAGE_SIZE);
208 return 0;
209 }
396 int get_cmdline(struct task_struct *task, char *buffer, int buflen)
397 {
398 int res = 0;
399 unsigned int len;
400 struct mm_struct *mm = get_task_mm(task);
401 if (!mm)
402 goto out;
403 if (!mm->arg_end)
404 goto out_mm; /* Shh! No looking before we're done */
405
406 len = mm->arg_end - mm->arg_start;
407
408 if (len > buflen)
409 len = buflen;
We are truncating the cmdline to PAGE_SIZE in mm/util.c
I did created a program that prints argv[1] and counts wc -c ie
./longarg 12345...5k | wc -c you get 4096 on i686.
I also need this for things like perl -e 'running code' that is
longer and i want to grep for some strings that are present at the end
so the code can be around 5k-8k by multiple users.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Change proc/<pid>/cmdline to 8k
2015-06-05 3:21 ` Navin P
@ 2015-06-16 10:34 ` Navin P
0 siblings, 0 replies; 11+ messages in thread
From: Navin P @ 2015-06-16 10:34 UTC (permalink / raw)
To: kernelnewbies
On Fri, Jun 5, 2015 at 8:51 AM, Navin P <navinp1912@gmail.com> wrote:
> On Fri, Jun 5, 2015 at 3:49 AM, <Valdis.Kletnieks@vt.edu> wrote:
After all your perseverance , i have got what i wanted with 4 lines
change on linux-4.0 fc22 :)
I just made the proc cmdlines buffer size to a max of 100*4k. I hit
the execve limit E2BIG when i had lot more more than 128000 but then i
stopped beyond that.
diff --git a/linux-4.0_orig/fs/proc/base.c b/linux-4.0/fs/proc/base.c
index 3f3d7ae..06f19ee 100644
--- a/linux-4.0_orig/fs/proc/base.c
+++ b/linux-4.0/fs/proc/base.c
@@ -204,7 +204,7 @@ static int proc_pid_cmdline(struct seq_file *m,
struct pid_namespace *ns,
* per internal buffer allocation. See single_open(), traverse().
*/
BUG_ON(m->size < PAGE_SIZE);
- m->count += get_cmdline(task, m->buf, PAGE_SIZE);
+ m->count += get_cmdline(task, m->buf, 100*PAGE_SIZE);
return 0;
}
@@ -2166,7 +2166,7 @@ static ssize_t proc_pid_attr_write(struct file *
file, const char __user * buf,
if (!task)
goto out_no_task;
if (count > PAGE_SIZE)
- count = PAGE_SIZE;
+ count = 100*PAGE_SIZE;
/* No partial writes. */
length = -EINVAL;
diff --git a/linux-4.0_orig/fs/seq_file.c b/linux-4.0/fs/seq_file.c
index 555f821..047d13e 100644
--- a/linux-4.0_orig/fs/seq_file.c
+++ b/linux-4.0/fs/seq_file.c
@@ -101,7 +101,7 @@ static int traverse(struct seq_file *m, loff_t offset)
return 0;
}
if (!m->buf) {
- m->buf = seq_buf_alloc(m->size = PAGE_SIZE);
+ m->buf = seq_buf_alloc(m->size = (100*PAGE_SIZE));
if (!m->buf)
return -ENOMEM;
}
@@ -197,7 +197,7 @@ ssize_t seq_read(struct file *file, char __user
*buf, size_t size, loff_t *ppos)
/* grab buffer if we didn't have one */
if (!m->buf) {
- m->buf = seq_buf_alloc(m->size = PAGE_SIZE);
+ m->buf = seq_buf_alloc(m->size = (100*PAGE_SIZE));
if (!m->buf)
goto Enomem;
}
Thanks.
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-06-16 10:34 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-04 4:22 Change proc/<pid>/cmdline to 8k Navin P
2015-06-04 5:17 ` Greg KH
2015-06-04 7:41 ` Navin P
2015-06-04 8:04 ` Greg KH
2015-06-04 15:36 ` Navin P
2015-06-04 22:07 ` Greg KH
2015-06-04 22:18 ` Valdis.Kletnieks at vt.edu
2015-06-04 22:38 ` Greg KH
2015-06-04 22:19 ` Valdis.Kletnieks at vt.edu
2015-06-05 3:21 ` Navin P
2015-06-16 10:34 ` Navin P
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).