Prev: [tip:sched/core] sched: Add a comment to get_cpu_idle_time_us()
Next: cgroups: make cftype.unregister_event() void-returning
From: wzt.wzt on 10 May 2010 02:10 Check major number before allocate the buffer, if the major number is not exist, and the register_blkdev() called many times, kmalloc()/kfree() will be no need to invoked many times. So check the major number before use kmalloc() to allocate the buffer will be better. Signed-off-by: Zhitong Wang <zhitong.wangzt(a)alibaba-inc.com> --- block/genhd.c | 25 ++++++++++++------------- 1 files changed, 12 insertions(+), 13 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index d13ba76..15360cc 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -300,30 +300,29 @@ int register_blkdev(unsigned int major, const char *name) ret = major; } - p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL); - if (p == NULL) { - ret = -ENOMEM; - goto out; - } - - p->major = major; - strlcpy(p->name, name, sizeof(p->name)); - p->next = NULL; index = major_to_index(major); for (n = &major_names[index]; *n; n = &(*n)->next) { if ((*n)->major == major) break; } - if (!*n) + if (!*n) { + p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL); + if (p == NULL) { + ret = -ENOMEM; + goto out; + } + + p->major = major; + strlcpy(p->name, name, sizeof(p->name)); + p->next = NULL; *n = p; - else + } + else { ret = -EBUSY; - if (ret < 0) { printk("register_blkdev: cannot get major %d for %s\n", major, name); - kfree(p); } out: mutex_unlock(&block_class_lock); -- 1.6.5.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |