Page MenuHomeFreeBSD

Introducing sleepable locks into if_lagg

Authored by mav on Apr 26 2017, 5:32 PM.



if_lagg is now using non-sleepable rmlocks to protect its internal state. In many cases it calls if_ioctl() interface method while still holding the lock. According to my conversation with glebius@ that is not correct, since if_ioctl() should be allowed to sleep. This patch introduces another sx lock to protect code paths that require sleeping, while still uses old rmlock to protect hot non-sleepable data paths.

This change allows to remove taskqueue decoupling used before to change interface addresses without holding the lock. Instead the new code uses sx lock to protect direct if_ioctl() calls.

As another bonus, the new code synchronizes enabled capabilities of member interfaces, and allows to control them with ifconfig laggX, that was impossible before. This part should fix inter-operation with if_bridge, that may need to disable some capabilities, such as TXCSUM or LRO, to allow bridging with non-capable interfaces.

Diff Detail

rS FreeBSD src repository
Automatic diff as part of commit; lint not applicable.
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

I haven't reviewed in detail (yet), but I absolutely agree with the description of the change. This is the right approach to fix multiple issues in this module.

This revision was automatically updated to reflect the committed changes.

Looks like we don't need the lagg_softc struct here.


All other function from where you call lagg_clrmulti does the ASSERT right before call the clrmulti function. And here we don't directly access the lagg_softc struct. So, it seems safe to remove it.

mav marked an inline comment as done.May 3 2017, 2:55 AM
mav added inline comments.

lp_mc_head access require locking, so I'd prefer to leave ASSERT there. The variable is removed though.