TODO.smpnet revision 1.17
11.17Sozaki$NetBSD: TODO.smpnet,v 1.17 2017/11/20 09:01:20 ozaki-r Exp $
21.1Sozaki
31.2SozakiMP-safe components
41.2Sozaki==================
51.1Sozaki
61.7Sozaki - Device drivers
71.7Sozaki   - vioif(4)
81.7Sozaki   - vmx(4)
91.7Sozaki   - wm(4)
101.8Sozaki   - ixg(4)
111.9Smsaitoh   - ixv(4)
121.7Sozaki - Layer 2
131.7Sozaki   - Ethernet (if_ethersubr.c)
141.7Sozaki   - bridge(4)
151.7Sozaki     - STP
161.7Sozaki   - Fast forward (ipflow)
171.7Sozaki - Layer 3
181.7Sozaki   - All except for items in the below section
191.7Sozaki - Interfaces
201.7Sozaki   - gif(4)
211.7Sozaki   - l2tp(4)
221.7Sozaki   - pppoe(4)
231.7Sozaki     - if_spppsubr.c
241.7Sozaki   - tun(4)
251.12Sozaki   - vlan(4)
261.7Sozaki - Packet filters
271.7Sozaki   - npf(7)
281.7Sozaki - Others
291.7Sozaki   - bpf(4)
301.12Sozaki   - ipsec(4)
311.12Sozaki   - opencrypto(9)
321.7Sozaki   - pfil(9)
331.2Sozaki
341.2SozakiNon MP-safe components and kernel options
351.2Sozaki=========================================
361.2Sozaki
371.7Sozaki - Device drivers
381.7Sozaki   - Most drivers other than ones listed in the above section
391.6Sozaki - Layer 2
401.6Sozaki   - ARCNET (if_arcsubr.c)
411.6Sozaki   - ATM (if_atmsubr.c)
421.6Sozaki   - BRIDGE_IPF
431.6Sozaki   - if_ecosubr.c
441.6Sozaki   - FDDI (if_fddisubr.c)
451.6Sozaki   - HIPPI (if_hippisubr.c)
461.6Sozaki   - IEEE 1394 (if_ieee1394subr.c)
471.6Sozaki   - IEEE 802.11 (ieee80211(4))
481.6Sozaki   - Token ring (if_tokensubr.c)
491.6Sozaki - Layer 3
501.6Sozaki   - IPSELSRC
511.6Sozaki   - MROUTING
521.6Sozaki   - PIM
531.6Sozaki   - MPLS (mpls(4))
541.17Sozaki   - IPv6 address selection policy
551.2Sozaki - Layer 4
561.6Sozaki   - DCCP
571.6Sozaki   - SCTP
581.6Sozaki   - TCP
591.6Sozaki   - UDP
601.6Sozaki - Interfaces
611.6Sozaki   - agr(4)
621.6Sozaki   - carp(4)
631.6Sozaki   - etherip(4)
641.6Sozaki   - faith(4)
651.6Sozaki   - gre(4)
661.6Sozaki   - ppp(4)
671.6Sozaki   - sl(4)
681.6Sozaki   - stf(4)
691.6Sozaki   - strip(4)
701.6Sozaki   - if_srt
711.6Sozaki   - tap(4)
721.6Sozaki - Packet filters
731.6Sozaki   - ipf(4)
741.6Sozaki   - pf(4)
751.6Sozaki - Others
761.6Sozaki   - AppleTalk (sys/netatalk/)
771.6Sozaki   - ATM (sys/netnatm/)
781.6Sozaki   - Bluetooth (sys/netbt/)
791.6Sozaki   - altq(4)
801.6Sozaki   - CIFS (sys/netsmb/)
811.6Sozaki   - ISDN (sys/netisbn/)
821.6Sozaki   - kttcp(4)
831.6Sozaki   - NFS
841.2Sozaki
851.2SozakiKnow issues
861.2Sozaki===========
871.1Sozaki
881.15SozakiNOMPSAFE
891.15Sozaki--------
901.15Sozaki
911.15SozakiWe use "NOMPSAFE" as a mark that indicates that the code around it isn't MP-safe
921.15Sozakiyet.  We use it in comments and also use as part of function names, for example
931.15Sozakim_get_rcvif_NOMPSAFE.  Let's use "NOMPSAFE" to make it easy to find non-MP-safe
941.15Sozakicodes by grep.
951.15Sozaki
961.1Sozakibpf
971.2Sozaki---
981.1Sozaki
991.1SozakiMP-ification of bpf requires all of bpf_mtap* are called in normal LWP context
1001.1Sozakior softint context, i.e., not in hardware interrupt context.  For Tx, all
1011.1Sozakibpf_mtap satisfy the requrement.  For Rx, most of bpf_mtap are called in softint.
1021.1SozakiUnfortunately some bpf_mtap on Rx are still called in hardware interrupt context.
1031.1Sozaki
1041.1SozakiThis is the list of the functions that have such bpf_mtap:
1051.1Sozaki
1061.1Sozaki - sca_frame_process() @ sys/dev/ic/hd64570.c
1071.1Sozaki - en_intr() @ sys/dev/ic/midway.c
1081.1Sozaki - rxintr_cleanup() and txintr_cleanup() @ sys/dev/pci/if_lmc.c
1091.1Sozaki - ipr_rx_data_rdy() @ sys/netisdn/i4b_ipr.c
1101.1Sozaki
1111.1SozakiIdeally we should make the functions run in softint somehow, but we don't have
1121.1Sozakiactual devices, no time (or interest/love) to work on the task, so instead we
1131.1Sozakiprovide a deferred bpf_mtap mechanism that forcibly runs bpf_mtap in softint
1141.1Sozakicontext.  It's a workaround and once the functions run in softint, we should use
1151.1Sozakithe original bpf_mtap again.
1161.10Sozaki
1171.10SozakiLingering obsolete variables
1181.10Sozaki-----------------------------
1191.10Sozaki
1201.10SozakiSome obsolete global variables and member variables of structures remain to
1211.10Sozakiavoid breaking old userland programs which directly access such variables via
1221.10Sozakikvm(3).
1231.10Sozaki
1241.10SozakiThe following programs still use kvm(3) to get some information related to
1251.10Sozakithe network stack.
1261.10Sozaki
1271.10Sozaki - netstat(1)
1281.10Sozaki - vmstat(1)
1291.10Sozaki - fstat(1)
1301.10Sozaki
1311.10Sozakinetstat(1) accesses ifnet_list, the head of a list of interface objects
1321.10Sozaki(struct ifnet), and traverses each object through ifnet#if_list member variable.
1331.10Sozakiifnet_list and ifnet#if_list is obsoleted by ifnet_pslist and
1341.10Sozakiifnet#if_pslist_entry respectively. netstat also accesses the IP address list
1351.10Sozakiof an interface throught ifnet#if_addrlist. struct ifaddr, struct in_ifaddr
1361.10Sozakiand struct in6_ifaddr are accessed and the following obsolete member variables
1371.10Sozakiare stuck: ifaddr#ifa_list, in_ifaddr#ia_hash, in_ifaddr#ia_list,
1381.10Sozakiin6_ifaddr#ia_next and in6_ifaddr#_ia6_multiaddrs. Note that netstat already
1391.10Sozakiimplements alternative methods to fetch the above information via sysctl(3).
1401.10Sozaki
1411.10Sozakivmstat(1) shows statistics of hash tables created by hashinit(9) in the kernel.
1421.10SozakiThe statistic information is retrieved via kvm(3). The global variables
1431.10Sozakiin_ifaddrhash and in_ifaddrhashtbl, which are for a hash table of IPv4
1441.10Sozakiaddresses and obsoleted by in_ifaddrhash_pslist and in_ifaddrhashtbl_pslist,
1451.10Sozakiare kept for this purpose. We should provide a means to fetch statistics of
1461.10Sozakihash tables via sysctl(3).
1471.10Sozaki
1481.10Sozakifstat(1) shows information of bpf instances. Each bpf instance (struct bpf) is
1491.10Sozakiobtained via kvm(3). bpf_d#_bd_next, bpf_d#_bd_filter and bpf_d#_bd_list
1501.10Sozakimember variables are obsolete but remain. ifnet#if_xname is also accessed
1511.10Sozakivia struct bpf_if and obsolete ifnet#if_list is required to remain to not change
1521.11Sozakithe offset of ifnet#if_xname. The statistic counters (bpf#bd_rcount,
1531.11Sozakibpf#bd_dcount and bpf#bd_ccount) are also victims of this restriction; for
1541.11Sozakiscalability the statistic counters should be per-CPU and we should stop using
1551.11Sozakiatomic operations for them however we have to remain the counters and atomic
1561.11Sozakioperations.
1571.13Sozaki
1581.13SozakiScalability
1591.13Sozaki-----------
1601.13Sozaki
1611.13Sozaki - Per-CPU rtcaches (used in say IP forwarding) aren't scalable on multiple
1621.13Sozaki   flows per CPU
1631.13Sozaki - ipsec(4) isn't scalable on the number of SA/SP; the cost of a look-up
1641.13Sozaki   is O(n)
1651.14Sknakahar - opencrypto(9)'s crypto_newsession()/crypto_freesession() aren't scalable
1661.14Sknakahar   as they are serialized by one mutex
1671.16Sozaki
1681.16Sozakiec_multi* of ethercom
1691.16Sozaki---------------------
1701.16Sozaki
1711.16Sozakiec_multiaddrs and ec_multicnt of struct ethercom and items listed in
1721.16Sozakiec_multiaddrs must be protected by ec_lock.  The core of ethernet subsystem is
1731.16Sozakialready MP-safe, however, device drivers that use the data should also be fixed.
1741.16SozakiA typical change should be to protect manipulations of the data via ETHER_*
1751.16Sozakimacros such as ETHER_FIRST_MULTI by ETHER_LOCK and ETHER_UNLOCK.
176