RFD: Rework/extending functionality of mdev
Michael Conrad
mconrad at intellitree.com
Fri Mar 13 14:46:53 UTC 2015
On 3/13/2015 9:48 AM, Harald Becker wrote:
> On 13.03.2015 12:29, Michael Conrad wrote:
>> On 3/13/2015 3:25 AM, Harald Becker wrote:
>>>> 1 - kernel-spawned hotplug helpers is the traditional way,
>>>> 2 - netlink socket daemon is the "right way to solve the forkbomb
>>>> problem"
>>>
>>> ACK, but #2 blocks usage for those who like / need to stay at #1 / #0
>>>
>>>> In that case, I would offer this idea:
>>>
>>> All you do, is throwing in complex code sharing and the need to chose
>>> a mechanism ahead at build time, to allow for switching to some newer
>>> stuff ... but what about pre-generated binary versions, which
>>> mechanism shall be used in the default options, which mechanism shall
>>> be offered?
>>
>> Please review it again. My solution solves both #1 and #2 in the same
>> binary, with no code duplication.
>
> At first complex code reusage, and then: How will you do it without
> suffering from hotplug handler problem as current mdev? I'm don't
> seeing, that you try to handle this problem. My solution is to enable
> kernel hotplug handler mechanism to also benefit and avoid that
> parallel parsing for each event.
>
> ... beside that, this close / open_netlink look suspicious, looks like
> possible race condition.
I thought pseudocode would be clearer than English text, but I suppose
my pseudocode is still really just English... Maybe some comments will
help.
The new code would not be run like a hotplug helper, it would be run as
a daemon, probably from a supervisor. But the old code is still there
and can still be run as a hotplug helper.
mdev_main() {
read_options();
load_config();
// if user requests "--netlink" mode, we act like a daemon
if (option_netlink) {
// If "--netlink-on-stdin" then netlink is open for us already
// if not, then we need to create our netlink socket
if (!option_netlink_on_stdin) {
close(0); // the new socket will now be file descriptor 0
open_netlink_socket();
}
// use 'select()' to see if a new netlink message is ready.
// if the user gave us a "--timeout" then we exit if no new
// netlink message in a certain amount of time
while (select([0], timeout)) {
if (recv(0, message)) {
// Netlink message is a list of variables. We call 'setenv'
for each.
apply_env_from_message(message);
// Now we have all the hotplug variables. So call the old code.
process_request();
}
// keep running in a loop until timeout (or forever if no timeout)
}
}
else
#endif
process_request();
}
More information about the busybox
mailing list