tech-kern archive

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

RFC: IRQ affinity (aka interrupt routing)



Hi,

I implement IRQ affinity (aka interrupt routing) for amd64. Here is
the implementation.
    https://github.com/knakahara/netbsd-src/compare/rfc/irq-affinity
But the UI is rough, so could you comment aboud the UI?

The implementation is consist of following three pathes:
    (1) IRQ affinity implementation itself
        The usage is "sysctl -w  kern.cpu_affinity.irq=18:1" ("18" is
        IRQ number, "1" is cpuid). This mean the IRQ 18 interrupts
        route to cpuid 1 cpu core.
            
https://github.com/knakahara/netbsd-src/commit/2ccaf5152fe41175a9192164b939d00f957e42cb

    (2) new kernfs file to show interrupt numbers per cpu
        "vmstat -i" cannot show interrupt numbers per cpu. So I
        implement new kernfs file to show per cpu. The usage is "cat
        /kern/interrupts". For example, we can see below output
        which is like linux's /proc/interrupts
        ====================
         IRQ      CPU#00          CPU#01
           1           0*              0
           3           0*              0
           4           0*              0
           6           0*              0
           7           0*              0
           9           0*              0
          12           0*              0
          14           0*              0
          15           0*              0
          16         108*              0
          17     1193055*              0
          18      680358             150*
        ====================
        "*" mean the cpu is routed the IRQ number interrupts.
            
https://github.com/knakahara/netbsd-src/commit/dc7c17dd2f0cd78a03983849feb8fdd8cbe0d9c6

    (3) add new API to show device name in /kern/interrupts
        To use efficiently interrupt routing, device name is needed.
        I implement new API borrow an idea from OpenBSD's
        pci_intr_establish(). If device drivers use this new API,
        /kern/interrupts can show device names as below
        ====================
         IRQ      CPU#00          CPU#01
           1           0*              0        unknown
           3           0*              0        unknown
           4           0*              0        unknown
           6           0*              0        unknown
           7           0*              0        unknown
           9           0*              0        unknown
          12           0*              0        unknown
          14           0*              0        unknown
          15           0*              0        unknown
          16         331*              0        unknown
          17     1193149*              0        wm0
          18      680358             436*       vmx0
        ====================
        Device driver can use such as "device_xname(sc->sc_dev)" as
        "xname" parameter.
            
https://github.com/knakahara/netbsd-src/commit/97adb1f9b2eea4c95cb6b3e6688c6639c17a025d

Above implementation works well, but I think the UI is not so good.
So, I am going to implement new command intrctl(8). The usage is consist
of below two sub command.
    (A) "intrctl list"
        This sub command show interrupt numbers per cpu (like
        /kern/interrupts).

    (B) "intrctl -i 18 -c 1"
        This sub command let interrupts route other cpu. "18" is IRQ
        number, "1" is cpuid (like "sysctl -w kern.cpu_affinity.irq=18:1").

Could you comment which UI is good, current "sysctl and /kern/interrupts"
or new "intrctl"?

Thanks,
-- 
//////////////////////////////////////////////////////////////////////
Internet Initiative Japan Inc.

Device Engineering Section,
Core Product Development Department,
Product Division,
Technology Unit

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


Home | Main Index | Thread Index | Old Index