Messages in this thread Patch in this message | | | Date | Mon, 17 Apr 2006 10:19:49 -0300 | From | "Thiago Galesi" <> | Subject | [PATCH] Remove unnecessary kmalloc/kfree calls in mtdchar |
| |
Josh
Thank you for your feedback! You're right, and both read and write had the problem. It's probably better to kmalloc once but calculate len in the old way. Hopefully I got it right this time.
Index: linux-2.6.16.2/drivers/mtd/mtdchar.c =================================================================== --- linux-2.6.16.2.orig/drivers/mtd/mtdchar.c +++ linux-2.6.16.2/drivers/mtd/mtdchar.c @@ -170,16 +170,22 @@ static ssize_t mtd_read(struct file *fil
/* FIXME: Use kiovec in 2.5 to lock down the user's buffers and pass them directly to the MTD functions */ + + if (count > MAX_KMALLOC_SIZE) + kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL); + else + kbuf=kmalloc(count, GFP_KERNEL); + + if (!kbuf) + return -ENOMEM; + while (count) { + if (count > MAX_KMALLOC_SIZE) len = MAX_KMALLOC_SIZE; else len = count;
- kbuf=kmalloc(len,GFP_KERNEL); - if (!kbuf) - return -ENOMEM; - switch (MTD_MODE(file)) { case MTD_MODE_OTP_FACT: ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf); @@ -215,9 +221,9 @@ static ssize_t mtd_read(struct file *fil return ret; }
- kfree(kbuf); }
+ kfree(kbuf); return total_retlen; } /* mtd_read */
@@ -241,18 +247,23 @@ static ssize_t mtd_write(struct file *fi if (!count) return 0;
+ if (count > MAX_KMALLOC_SIZE) + kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL); + else + kbuf=kmalloc(count, GFP_KERNEL); + + if (!kbuf) { + printk("kmalloc is null\n"); + return -ENOMEM; + } + while (count) { + if (count > MAX_KMALLOC_SIZE) len = MAX_KMALLOC_SIZE; else len = count;
- kbuf=kmalloc(len,GFP_KERNEL); - if (!kbuf) { - printk("kmalloc is null\n"); - return -ENOMEM; - } - if (copy_from_user(kbuf, buf, len)) { kfree(kbuf); return -EFAULT; @@ -282,10 +293,9 @@ static ssize_t mtd_write(struct file *fi kfree(kbuf); return ret; } - - kfree(kbuf); }
+ kfree(kbuf); return total_retlen; } /* mtd_write */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |