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