Message ID | 20170502101103.30444-4-mlichvar@redhat.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, May 2, 2017 at 6:10 AM, Miroslav Lichvar <mlichvar@redhat.com> wrote: > Since commit b68581778cd0 ("net: Make skb->skb_iif always track > skb->dev") skbs don't have the original index of the interface which > received the packet. This information is now needed for a new control > message related to hardware timestamping. > > Instead of adding a new field to skb, we can find the device by the NAPI > ID if it is available, i.e. CONFIG_NET_RX_BUSY_POLL is enabled and the > driver is using NAPI. Add dev_get_by_napi_id() and also skb_napi_id() to > hide the CONFIG_NET_RX_BUSY_POLL ifdef. > > CC: Richard Cochran <richardcochran@gmail.com> > CC: Willem de Bruijn <willemb@google.com> > Suggested-by: Willem de Bruijn <willemb@google.com> > Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com> > /** > + * dev_get_by_napi_id - find a device by napi_id > + * @napi_id: ID of the NAPI struct > + * > + * Search for an interface by NAPI ID. Returns %NULL if the device > + * is not found or a pointer to the device. The device has not had > + * its reference counter increased so the caller must be careful > + * about locking. The caller must hold RCU lock. Instead of a comment, can check with WARN_ON_ONCE(!rcu_read_lock_held()); > + */ > + > +struct net_device *dev_get_by_napi_id(unsigned int napi_id) > +{ > + struct napi_struct *napi; > + > + if (napi_id < MIN_NAPI_ID) > + return NULL; > + > + napi = napi_by_id(napi_id); > + if (napi) > + return napi->dev; > + > + return NULL; make return NULL the branch expected not taken. return napi ? napi->dev : NULL;
On Tue, May 02, 2017 at 12:16:13PM -0400, Willem de Bruijn wrote: > On Tue, May 2, 2017 at 6:10 AM, Miroslav Lichvar <mlichvar@redhat.com> wrote: > > /** > > + * dev_get_by_napi_id - find a device by napi_id > > + * @napi_id: ID of the NAPI struct > > + * > > + * Search for an interface by NAPI ID. Returns %NULL if the device > > + * is not found or a pointer to the device. The device has not had > > + * its reference counter increased so the caller must be careful > > + * about locking. The caller must hold RCU lock. > > Instead of a comment, can check with > > WARN_ON_ONCE(!rcu_read_lock_held()); The other dev_get_* functions have the same comment, so I think it's better to keep it for consistency. I'll add the warning and sent a new series with the other changes you have suggested. Thanks,
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9c23bd2..4ca2a16 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2456,6 +2456,7 @@ static inline int dev_recursion_level(void) struct net_device *dev_get_by_index(struct net *net, int ifindex); struct net_device *__dev_get_by_index(struct net *net, int ifindex); struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); +struct net_device *dev_get_by_napi_id(unsigned int napi_id); int netdev_get_name(struct net *net, char *name, int ifindex); int dev_restart(struct net_device *dev); int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb); diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 81ef53f..bfe6ec3 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -915,6 +915,15 @@ static inline bool skb_pkt_type_ok(u32 ptype) return ptype <= PACKET_OTHERHOST; } +static inline unsigned int skb_napi_id(const struct sk_buff *skb) +{ +#ifdef CONFIG_NET_RX_BUSY_POLL + return skb->napi_id; +#else + return 0; +#endif +} + void kfree_skb(struct sk_buff *skb); void kfree_skb_list(struct sk_buff *segs); void skb_tx_error(struct sk_buff *skb); diff --git a/net/core/dev.c b/net/core/dev.c index 35a06ce..fe079b2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -160,6 +160,7 @@ static int netif_rx_internal(struct sk_buff *skb); static int call_netdevice_notifiers_info(unsigned long val, struct net_device *dev, struct netdev_notifier_info *info); +static struct napi_struct *napi_by_id(unsigned int napi_id); /* * The @dev_base_head list is protected by @dev_base_lock and the rtnl @@ -864,6 +865,31 @@ struct net_device *dev_get_by_index(struct net *net, int ifindex) EXPORT_SYMBOL(dev_get_by_index); /** + * dev_get_by_napi_id - find a device by napi_id + * @napi_id: ID of the NAPI struct + * + * Search for an interface by NAPI ID. Returns %NULL if the device + * is not found or a pointer to the device. The device has not had + * its reference counter increased so the caller must be careful + * about locking. The caller must hold RCU lock. + */ + +struct net_device *dev_get_by_napi_id(unsigned int napi_id) +{ + struct napi_struct *napi; + + if (napi_id < MIN_NAPI_ID) + return NULL; + + napi = napi_by_id(napi_id); + if (napi) + return napi->dev; + + return NULL; +} +EXPORT_SYMBOL(dev_get_by_napi_id); + +/** * netdev_get_name - get a netdevice name, knowing its ifindex. * @net: network namespace * @name: a pointer to the buffer where the name will be stored.
Since commit b68581778cd0 ("net: Make skb->skb_iif always track skb->dev") skbs don't have the original index of the interface which received the packet. This information is now needed for a new control message related to hardware timestamping. Instead of adding a new field to skb, we can find the device by the NAPI ID if it is available, i.e. CONFIG_NET_RX_BUSY_POLL is enabled and the driver is using NAPI. Add dev_get_by_napi_id() and also skb_napi_id() to hide the CONFIG_NET_RX_BUSY_POLL ifdef. CC: Richard Cochran <richardcochran@gmail.com> CC: Willem de Bruijn <willemb@google.com> Suggested-by: Willem de Bruijn <willemb@google.com> Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com> --- include/linux/netdevice.h | 1 + include/linux/skbuff.h | 9 +++++++++ net/core/dev.c | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+)