Currently, memcg_oom_lock is used for this, but I'm going to get rid of it in the following patch, so introduce a dedicated lock.
Signed-off-by: Vladimir Davydov <[email protected]> --- mm/memcontrol.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 9f2d1d518df4..df98b3dfe0f1 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5766,12 +5766,18 @@ static int compare_thresholds(const void *a, const void *b) return 0; } +static DEFINE_SPINLOCK(memcg_oom_notify_lock); + static int mem_cgroup_oom_notify_cb(struct mem_cgroup *memcg) { struct mem_cgroup_eventfd_list *ev; + spin_lock(&memcg_oom_notify_lock); + list_for_each_entry(ev, &memcg->oom_notify, list) eventfd_signal(ev->eventfd, 1); + + spin_unlock(&memcg_oom_notify_lock); return 0; } @@ -5957,7 +5963,7 @@ static int mem_cgroup_oom_register_event(struct cgroup *cgrp, if (!event) return -ENOMEM; - spin_lock(&memcg_oom_lock); + spin_lock(&memcg_oom_notify_lock); event->eventfd = eventfd; list_add(&event->list, &memcg->oom_notify); @@ -5965,7 +5971,7 @@ static int mem_cgroup_oom_register_event(struct cgroup *cgrp, /* already in OOM ? */ if (atomic_read(&memcg->under_oom)) eventfd_signal(eventfd, 1); - spin_unlock(&memcg_oom_lock); + spin_unlock(&memcg_oom_notify_lock); return 0; } @@ -5979,7 +5985,7 @@ static void mem_cgroup_oom_unregister_event(struct cgroup *cgrp, BUG_ON(type != _OOM_TYPE); - spin_lock(&memcg_oom_lock); + spin_lock(&memcg_oom_notify_lock); list_for_each_entry_safe(ev, tmp, &memcg->oom_notify, list) { if (ev->eventfd == eventfd) { @@ -5988,7 +5994,7 @@ static void mem_cgroup_oom_unregister_event(struct cgroup *cgrp, } } - spin_unlock(&memcg_oom_lock); + spin_unlock(&memcg_oom_notify_lock); } static int mem_cgroup_oom_control_read(struct cgroup *cgrp, -- 2.1.4 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
