Messages in this thread | | | From | Rafał Miłecki <> | Date | Mon, 29 Apr 2019 18:45:28 +0200 | Subject | Re: [PATCH] net-sysfs: expose IRQ number |
| |
On Mon, 29 Apr 2019 at 18:20, Stephen Hemminger <stephen@networkplumber.org> wrote: > On Mon, 29 Apr 2019 08:01:07 +0200 > Rafał Miłecki <zajec5@gmail.com> wrote: > > > From: Rafał Miłecki <rafal@milecki.pl> > > > > Knowing IRQ number makes e.g. reading /proc/interrupts much simpler. > > It's more reliable than guessing device name used by a driver when > > calling request_irq(). > > > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> > > --- > > I found a script parsing /proc/interrupts for a given interface name. It wasn't > > working for me as it assumed request_irq() was called with a device name. It's > > not a case for all drivers. > > > > I also found some other people looking for a proper solution for that: > > https://unix.stackexchange.com/questions/275075/programmatically-determine-the-irqs-associated-with-a-network-interface > > https://stackoverflow.com/questions/7516984/retrieving-irq-number-of-a-nic > > > > Let me know if this solution makes sense. I can say it works for me ;) > > --- > > Documentation/ABI/testing/sysfs-class-net | 7 +++++++ > > net/core/net-sysfs.c | 16 ++++++++++++++++ > > 2 files changed, 23 insertions(+) > > > > diff --git a/Documentation/ABI/testing/sysfs-class-net b/Documentation/ABI/testing/sysfs-class-net > > index 664a8f6a634f..33440fe77ca7 100644 > > --- a/Documentation/ABI/testing/sysfs-class-net > > +++ b/Documentation/ABI/testing/sysfs-class-net > > @@ -301,3 +301,10 @@ Contact: netdev@vger.kernel.org > > Description: > > 32-bit unsigned integer counting the number of times the link has > > been down > > + > > +What: /sys/class/net/<iface>/irq > > +Date: April 2019 > > +KernelVersion: 5.2 > > +Contact: netdev@vger.kernel.org > > +Description: > > + IRQ number used by device > > diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c > > index e4fd68389d6f..a3eb7c3f1f37 100644 > > --- a/net/core/net-sysfs.c > > +++ b/net/core/net-sysfs.c > > @@ -512,6 +512,21 @@ static ssize_t phys_switch_id_show(struct device *dev, > > } > > static DEVICE_ATTR_RO(phys_switch_id); > > > > +static ssize_t irq_show(struct device *dev, struct device_attribute *attr, > > + char *buf) > > +{ > > + const struct net_device *netdev = to_net_dev(dev); > > + ssize_t ret; > > + > > + if (!rtnl_trylock()) > > + return restart_syscall(); > > + ret = sprintf(buf, "%d\n", netdev->irq); > > + rtnl_unlock(); > > + > > + return ret; > > +} > > +static DEVICE_ATTR_RO(irq); > > + > > static struct attribute *net_class_attrs[] __ro_after_init = { > > &dev_attr_netdev_group.attr, > > &dev_attr_type.attr, > > @@ -542,6 +557,7 @@ static struct attribute *net_class_attrs[] __ro_after_init = { > > &dev_attr_proto_down.attr, > > &dev_attr_carrier_up_count.attr, > > &dev_attr_carrier_down_count.attr, > > + &dev_attr_irq.attr, > > NULL, > > }; > > ATTRIBUTE_GROUPS(net_class); > > Can't you find this on the PCI side already? > $ ls /sys/class/net/eno1/device/msi_irqs/ > 37 38 39 40 41
I'm dealing with bgmac supported ethernet device on bcma bus (not PCI). I could make bcma bus provide IRQ numbers, but I thought something at net subsystem level will be more generic.
I'm going to review Willem's solution/idea for now.
-- Rafał
| |