On Fri, 12 Mar 2010 14:34:35 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > +static int mem_cgroup_oom_register_event(struct cgroup *cgrp, > + struct cftype *cft, struct eventfd_ctx *eventfd, const char *args) > +{ > + struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp); > + struct mem_cgroup_eventfd_list *event; > + int type = MEMFILE_TYPE(cft->private); > + int ret = -ENOMEM; > + > + BUG_ON(type != _OOM_TYPE); > + > + mutex_lock(&memcg_oom_mutex); > + > + event = kmalloc(sizeof(*event), GFP_KERNEL); > + if (!event) > + goto unlock; > + > + event->eventfd = eventfd; > + list_add(&event->list, &memcg->oom_notify); > + > + /* already in OOM ? */ > + if (atomic_read(&memcg->oom_lock)) > + eventfd_signal(eventfd, 1); > + ret = 0; > +unlock: > + mutex_unlock(&memcg_oom_mutex); > + > + return ret; > +} We can move that kmalloc() outside the lock. It's more scalable and the code's cleaner. --- a/mm/memcontrol.c~memcg-oom-notifier-fix +++ a/mm/memcontrol.c @@ -3603,27 +3603,23 @@ static int mem_cgroup_oom_register_event struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp); struct mem_cgroup_eventfd_list *event; int type = MEMFILE_TYPE(cft->private); - int ret = -ENOMEM; BUG_ON(type != _OOM_TYPE); - mutex_lock(&memcg_oom_mutex); - event = kmalloc(sizeof(*event), GFP_KERNEL); if (!event) - goto unlock; + return -ENOMEM; + mutex_lock(&memcg_oom_mutex); event->eventfd = eventfd; list_add(&event->list, &memcg->oom_notify); /* already in OOM ? */ if (atomic_read(&memcg->oom_lock)) eventfd_signal(eventfd, 1); - ret = 0; -unlock: mutex_unlock(&memcg_oom_mutex); - return ret; + return 0; } static int mem_cgroup_oom_unregister_event(struct cgroup *cgrp, _ -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>