On 12/04/2011 04:45 PM, Oleg Nesterov wrote: > On 12/04, Daniel Lezcano wrote: >> @@ -32,6 +32,8 @@ struct pid_namespace { >> #endif >> gid_t pid_gid; >> int hide_pid; >> + int reboot; >> + spinlock_t reboot_lock; >> }; > Well. I was thinking about the serialization too, but this > ->reboot_lock asks for v3 imho ;) > > First of all, do we really care? force_sig(SIGKILL, child_reaper) > can't race with itself, it does nothing if init is already killed. > > So why it is important to protect pid_ns->reboot? Yes, it is possible > to change it again if two callers do sys_reboot() "at the same time". > But in this case we can't predict which caller wins anyway, so why > should we worry? > > IOW. Say, we have the 2 tasks doing HALT and RESTART in parallel. > It is possible that HALT sets ->reboot and kills init first, then > RESTART changes ->reboot and the second force_sig() does nothing. > In this case we can simply pretend that RESTART wins and the dying > init kills HALT before it calls sys_reboot(). In the case of racy access, your argument makes sense but it is also to prevent multiple calls to 'reboot'. In the init_pid_ns, when a shutdown is on the way, the lock will prevent another task to invoke a machine restart. But anyway, we can get ride of this lock and the serialization, it is a nit we can fix later if that makes sense with the couple of lines you specified below. > In any case. Even if you want to serialize, instead of adding the > new lock reboot_pid_ns() can simply do: > > if (cmpxchg(&pid_ns->reboot, 0, reboot) != 0) > return -EBUSY; > > this looks much simpler to me. Yes, definitively :) Thanks -- Daniel _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers