aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJim Cromie <jim.cromie@gmail.com>2011-12-19 17:13:07 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2012-01-24 15:48:55 -0500
commit7281491c594e7b8501eb5dfcf6cd3724f8a1b5b0 (patch)
tree7f99ca473ffc79baf0cb96b6dfb33de831af494f /lib
parent8bd6026e88cb2eb1e60ee40c7a1a0786b2db6623 (diff)
dynamic_debug: enlarge command/query write buffer
Current query write buffer is 256 bytes, on stack. In comparison, the ddebug_query boot-arg is 1024. Allocate the buffer off heap, and enlarge it to 4096 bytes, big enough for ~100 queries (at 40 bytes each), and error out if not. This makes it play nicely with large query sets (to be added later). The buffer should be enough for most uses, and others should probably be split into subsets. [jbaron@redhat.com: changed USER_BUF_PAGE from 4095 -> 4096 ] Signed-off-by: Jim Cromie <jim.cromie@gmail.com> Signed-off-by: Jason Baron <jbaron@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/dynamic_debug.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 86a9abb9a1ce..d8773dcd83c5 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -570,24 +570,32 @@ __setup("ddebug_query=", ddebug_setup_query);
570 * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the 570 * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the
571 * command text from userspace, parses and executes it. 571 * command text from userspace, parses and executes it.
572 */ 572 */
573#define USER_BUF_PAGE 4096
573static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf, 574static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
574 size_t len, loff_t *offp) 575 size_t len, loff_t *offp)
575{ 576{
576 char tmpbuf[256]; 577 char *tmpbuf;
577 int ret; 578 int ret;
578 579
579 if (len == 0) 580 if (len == 0)
580 return 0; 581 return 0;
581 /* we don't check *offp -- multiple writes() are allowed */ 582 if (len > USER_BUF_PAGE - 1) {
582 if (len > sizeof(tmpbuf)-1) 583 pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
583 return -E2BIG; 584 return -E2BIG;
584 if (copy_from_user(tmpbuf, ubuf, len)) 585 }
586 tmpbuf = kmalloc(len + 1, GFP_KERNEL);
587 if (!tmpbuf)
588 return -ENOMEM;
589 if (copy_from_user(tmpbuf, ubuf, len)) {
590 kfree(tmpbuf);
585 return -EFAULT; 591 return -EFAULT;
592 }
586 tmpbuf[len] = '\0'; 593 tmpbuf[len] = '\0';
587 if (verbose) 594 if (verbose)
588 pr_info("read %d bytes from userspace\n", (int)len); 595 pr_info("read %d bytes from userspace\n", (int)len);
589 596
590 ret = ddebug_exec_query(tmpbuf); 597 ret = ddebug_exec_query(tmpbuf);
598 kfree(tmpbuf);
591 if (ret) 599 if (ret)
592 return ret; 600 return ret;
593 601