瀏覽代碼

[PATCH] Remove unnecessary kmalloc/kfree calls in mtdchar

This patch removes repeated calls to kmalloc / kfree in mtd_write /
mtd_read functions, replacing them by a single kmalloc / kfree pair.

Signed-off-by: Thiago Galesi <thiagogalesi@gmail.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Thago Galesi 19 年之前
父節點
當前提交
b802c07411
共有 1 個文件被更改,包括 21 次插入13 次删除
  1. 21 13
      drivers/mtd/mtdchar.c

+ 21 - 13
drivers/mtd/mtdchar.c

@@ -170,16 +170,22 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
 
 
 	/* FIXME: Use kiovec in 2.5 to lock down the user's buffers
 	/* FIXME: Use kiovec in 2.5 to lock down the user's buffers
 	   and pass them directly to the MTD functions */
 	   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) {
 	while (count) {
+
 		if (count > MAX_KMALLOC_SIZE)
 		if (count > MAX_KMALLOC_SIZE)
 			len = MAX_KMALLOC_SIZE;
 			len = MAX_KMALLOC_SIZE;
 		else
 		else
 			len = count;
 			len = count;
 
 
-		kbuf=kmalloc(len,GFP_KERNEL);
-		if (!kbuf)
-			return -ENOMEM;
-
 		switch (MTD_MODE(file)) {
 		switch (MTD_MODE(file)) {
 		case MTD_MODE_OTP_FACT:
 		case MTD_MODE_OTP_FACT:
 			ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf);
 			ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf);
@@ -215,9 +221,9 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
 			return ret;
 			return ret;
 		}
 		}
 
 
-		kfree(kbuf);
 	}
 	}
 
 
+	kfree(kbuf);
 	return total_retlen;
 	return total_retlen;
 } /* mtd_read */
 } /* mtd_read */
 
 
@@ -241,18 +247,21 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
 	if (!count)
 	if (!count)
 		return 0;
 		return 0;
 
 
+	if (count > MAX_KMALLOC_SIZE)
+		kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL);
+	else
+		kbuf=kmalloc(count, GFP_KERNEL);
+
+	if (!kbuf)
+		return -ENOMEM;
+
 	while (count) {
 	while (count) {
+
 		if (count > MAX_KMALLOC_SIZE)
 		if (count > MAX_KMALLOC_SIZE)
 			len = MAX_KMALLOC_SIZE;
 			len = MAX_KMALLOC_SIZE;
 		else
 		else
 			len = count;
 			len = count;
 
 
-		kbuf=kmalloc(len,GFP_KERNEL);
-		if (!kbuf) {
-			printk("kmalloc is null\n");
-			return -ENOMEM;
-		}
-
 		if (copy_from_user(kbuf, buf, len)) {
 		if (copy_from_user(kbuf, buf, len)) {
 			kfree(kbuf);
 			kfree(kbuf);
 			return -EFAULT;
 			return -EFAULT;
@@ -282,10 +291,9 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
 			kfree(kbuf);
 			kfree(kbuf);
 			return ret;
 			return ret;
 		}
 		}
-
-		kfree(kbuf);
 	}
 	}
 
 
+	kfree(kbuf);
 	return total_retlen;
 	return total_retlen;
 } /* mtd_write */
 } /* mtd_write */