Dave Hansen wrote: > On Fri, 2009-03-20 at 15:34 -0400, Oren Laadan wrote: >> 3) In checkpoint, for each task we'll do: >> if (nsproxy seen first time) { >> alloc nsproxy_objref >> for each ns in nsproxy { >> if (ns seen first time) { >> alloc ns_objref >> save state of ns >> } else { >> save existing ns_objref >> } >> } >> } else { >> save existing nsproxy_objref >> } > > The problem with this is that the nsproxy is in no way, shape, or form > exposed to userspace. It is wholly an internal implementation detail. > > Take out all the nsproxy bits you have above, and do this for each task: > >> for each ns in nsproxy { >> if (ns seen first time) { >> alloc ns_objref >> save state of ns >> } else { >> save existing ns_objref >> } >> } > > And it will still _function_ *exactly* the same. It won't be quite as > cache or space compact, but that's fine. > > If you're worried about this extra space or cache impact, it can be > fixed up at restart with: > > if (nsproxy_equal(tsk->nsproxy, parent->nsproxy)) { > get_nsproxy(parent->nsproxy); > put_nsproxy(tsk->nsproxy); > tsk->nsproxy = parent->nsproxy; > } > > Voila. It won't be perfect. If the parent doesn't work we could also > try the siblings. Yup. Does that scale well with many (1000's) of tasks ? (The motivation to expose 'nsproxy_objref' to user space was to allow user-space to decide on a sequence of clones/unshared that will create an equivalent process tree with space-efficient nsproxy's). Perhaps instead of nsproxy_equal() we could use an 'nsproxy_objref' to know a-priori that it is common, and save the "compare-and-swap" phase altogether. Oren. _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers