Re: [PATCH v2] vmpressure: make sure memcg stays alive until all users are signaled
From: Li Zefan <hidden>
Date: 2013-07-12 09:25:52
Also in:
linux-mm
quoted
especially while shutting down objects as they enter a lingering stage where they're de-registered but not destroyed and you should be careful which parts of the object are still accessible. I haven't read it carefully but here I'm not sure whether it's safe to do event related operations after removal. From cgroup core side, event list is shut down synchronously from cgroup_destroy_locked(). It doesn't seem like that part is explicitly built to remain accessible afterwards./me goes and checks the code vmpressure_event sends signals to _registered_ events but those are unregistered from the work queue context by cgroup_event_remove (via vmpressure_unregister_event) queued from cgroup_destroy_locked. I am not sure what are the guarantees for ordering on the workqueue but this all suggests that either vmpressure_event sees an empty vmpr->events or it can safely send signals as cgroup_event_remove is pending on the queue. cgroup_event_remove drops a reference to cgrp->dentry after everything is unregistered and event->wait removed from the wait queue so cgroup_free_fn couldn't have been called yet and so memcg is still alive. This means that even css_get/put is not necessary. So I guess we are safe with the code as is but this all is really _tricky_ and deserves a fat comment. So rather than adding flushing work item code we should document it properly. Or am I missing something?
But if I read the code correctly, even no one registers a vmpressure event, vmpressure() is always running and queue the work item.