All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] net-sysfs: expose IRQ number
@ 2019-04-29  6:01 Rafał Miłecki
  2019-04-29 16:15 ` Willem de Bruijn
  2019-04-29 16:20 ` Stephen Hemminger
  0 siblings, 2 replies; 4+ messages in thread
From: Rafał Miłecki @ 2019-04-29  6:01 UTC (permalink / raw)
  To: David S . Miller; +Cc: netdev, linux-kernel, Rafał Miłecki

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);
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] net-sysfs: expose IRQ number
  2019-04-29  6:01 [PATCH] net-sysfs: expose IRQ number Rafał Miłecki
@ 2019-04-29 16:15 ` Willem de Bruijn
  2019-04-29 16:20 ` Stephen Hemminger
  1 sibling, 0 replies; 4+ messages in thread
From: Willem de Bruijn @ 2019-04-29 16:15 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: David S . Miller, Network Development, LKML, Rafał Miłecki

On Mon, Apr 29, 2019 at 2:01 AM 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 ;)

If parsing /proc/interrupts is problematic, also see the
/sys/kernel/irq interface added in commit ecb3f394c5db ("genirq:
Expose interrupt information through sysfs"). Does that address your
use-case as well? Though it does the inverse mapping from IRQ to name.

Another practical issue is that many network devices register more
than one interrupt. Perhaps one control interrupt, plus one per
receive queue and possibly one per transmit queue. Unfortunately those
cannot be identified in a driver-independent manner. Because an
interface /sys/class/net/$DEV/queues/rx-$i/irq would be useful.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] net-sysfs: expose IRQ number
  2019-04-29  6:01 [PATCH] net-sysfs: expose IRQ number Rafał Miłecki
  2019-04-29 16:15 ` Willem de Bruijn
@ 2019-04-29 16:20 ` Stephen Hemminger
  2019-04-29 16:45   ` Rafał Miłecki
  1 sibling, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2019-04-29 16:20 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: David S . Miller, netdev, linux-kernel, Rafał Miłecki

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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] net-sysfs: expose IRQ number
  2019-04-29 16:20 ` Stephen Hemminger
@ 2019-04-29 16:45   ` Rafał Miłecki
  0 siblings, 0 replies; 4+ messages in thread
From: Rafał Miłecki @ 2019-04-29 16:45 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: David S . Miller, Network Development, Linux Kernel Mailing List,
	Rafał Miłecki

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ł

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-04-29 16:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-29  6:01 [PATCH] net-sysfs: expose IRQ number Rafał Miłecki
2019-04-29 16:15 ` Willem de Bruijn
2019-04-29 16:20 ` Stephen Hemminger
2019-04-29 16:45   ` Rafał Miłecki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.