tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

separate L3 output KERNEL_LOCK



Hi,

Currently, L3 output processing call L2 (or L3 tunneling) output routine
holding KERNEL_LOCK. This KERNEL_LOCK is controled by NET_MPSAFE kernel
option. e.g.
    https://nxr.netbsd.org/xref/src/sys/netinet/ip_output.c#215

That is, if NET_MPSAFE is enabled at current implementation, L2 and device
driver output processing run without KERNEL_LOCK whether the L2 component
and the device driver is MP-safe or not.

To enable NET_MPSAFE safely in the future, it is required to separete the
KERNEL_LOCK to each L2 component and device drivers, and then enable
KERNEL_LOCK for each component which is not MP-safe yet.

The design to implement this concept is consisted of below two parts.
    1. at L3 output processing call L2 output routine
       - remove KERNEL_LOCK from caller(L3)
       - wrap callee(L2) ifp->if_output with KERNEL_LOCK if necessary
    2. at L2 output processing call device driver output routine
       - check device driver MP-safe flags (*)
       - if device driver has MP-safe flag, call without KERNEL_LOCK and
         vice versa

      (*) Unfortunately, struct ifnet->if_flags is already used all bit.
          So, I change if__pad1 to if_extflags and use it as flags.

Here is the patch series,
    http://www.netbsd.org/~knakahara/separate-l3-lock/separate-l3-lock.tgz
and unified patch.
    http://www.netbsd.org/~knakahara/separate-l3-lock/unified-separate-l3-lock.patch

Could you comment this design or implementation?


Thanks,

-- 
//////////////////////////////////////////////////////////////////////
Internet Initiative Japan Inc.

Device Engineering Section,
IoT Platform Development Department,
Network Division,
Technology Unit

Kengo NAKAHARA <k-nakahara%iij.ad.jp@localhost>


Home | Main Index | Thread Index | Old Index