RFD: Rework/extending functionality of mdev

Natanael Copa ncopa at alpinelinux.org
Mon Mar 9 08:41:57 UTC 2015


On Sun, 08 Mar 2015 16:10:32 +0100
Harald Becker <ralda at gmx.de> wrote:

> Hi,
> 
> I'm currently in the phase of thinking about extending the functionality 
> of mdev. As here are the experts working with this kind of software, I 
> like to here your ideas before I start hacking the code.

...

> 2) I like to use netlink to obtain hotplug information and avoid massive 
> respawning of mdev as hotplug helper when several events arrive quickly.

I am interested in a netlink listener too for 2 reasons:

- serialize the events
- reduce number of forks for perfomance reasons

> That is, I want to auto fork a daemon which just open the netlink 
> socket. When events arrive it forks again, creating a pipe. The new 
> instance read mdev.conf, build a table of rules in memory, then read 
> hotplug operations from the pipe (send by the first instance). When 
> there are no more events for more then a few seconds, the first instance 
> closes the pipe and the second instance exits (freeing the used memory). 
> On next hotplug event a new pipe / second instance is created.

I have a simlar idea, but slightly different. I'd like to separate the
netlink listener and the event handler.

I am thinking of using http://git.r-36.net/nldev/ which basically does the
same thing as s6-devd: minimal daemon that listens on netlink and for
each event it fork/exec mdev.

What I'd like to do is:

change mdev to:
 - be able to read events from stdin. same format as from netlink socket.
 - set a timeout on stdin (1 sec or so by default). when time out is
   reached (no event within a sec) then just exit.

change nldev to:
- have a mdev pipe fd which we forward the kernel events to.
- on kernel event
    if mdev_pipe_fd is -1 then:
      create pipe, fork and exec mdev with args to have
      mdev read from stdin (as explained above)
    else:
      write the kernel event to the pipe fd

- the mdev pipe fd is added to the poll(2) call so we catch POLLHUP to
  detect mdev timeout. When that happens, set the mdev pipe fd to -1 so
  we know that it needs to be respawned on next kernel event.

The benifits:
- the netlink listener who needs to be running all times is very
  minimal.

- when there are many events within short time, (eg coldplugging), we
  avoid the many forks and gain performance.

- when there are no events, mdev will timeout and exit.

- busybox mdev does not need set up netlink socket. (less intrusive
  changes in busybox)

Then I'd like to do something similar with modprobe:
 - add support to read modalias from stdin and have 1 sec timeout.
 - have nldev to pipe/fork/exec modprobe --stdin on MODALIAS events.

That way we can also avoid the many modprobe forks during coldplug.

-nc


More information about the busybox mailing list