John Fastabend
2016-Jun-30 04:56 UTC
[PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
On 16-06-29 08:52 PM, Jason Wang wrote:> This patch introduces a new event - NETDEV_CHANGE_TX_QUEUE_LEN, this > will be triggered when tx_queue_len. It could be used by net device > who want to do some processing at that time. An example is tun who may > want to resize tx array when tx_queue_len is changed. > > Signed-off-by: Jason Wang <jasowang at redhat.com> > --- > include/linux/netdevice.h | 1 + > net/core/net-sysfs.c | 15 ++++++++++++++- > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index e84d9d2..7dc2ec7 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -2237,6 +2237,7 @@ struct netdev_lag_lower_state_info { > #define NETDEV_PRECHANGEUPPER 0x001A > #define NETDEV_CHANGELOWERSTATE 0x001B > #define NETDEV_UDP_TUNNEL_PUSH_INFO 0x001C > +#define NETDEV_CHANGE_TX_QUEUE_LEN 0x001E > > int register_netdevice_notifier(struct notifier_block *nb); > int unregister_netdevice_notifier(struct notifier_block *nb); > diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c > index 7a0b616..6e4f347 100644 > --- a/net/core/net-sysfs.c > +++ b/net/core/net-sysfs.c > @@ -322,7 +322,20 @@ NETDEVICE_SHOW_RW(flags, fmt_hex); > > static int change_tx_queue_len(struct net_device *dev, unsigned long new_len) > { > - dev->tx_queue_len = new_len; > + int res, orig_len = dev->tx_queue_len; > + > + if (new_len != orig_len) { > + dev->tx_queue_len = new_len; > + res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev); > + res = notifier_to_errno(res); > + if (res) { > + netdev_err(dev, > + "refused to change device tx_queue_len\n"); > + dev->tx_queue_len = orig_len; > + return -EFAULT; > + } > + } > + > return 0; > } > >Acked-by: John Fastabend <john.r.fastabend at intel.com> Great timing I was just looking into this because I need it for the qdisc side. It looks like this covers the sysfs change but the tx_queue_len can also be changed via rtnetlink as well. So we need another patch for that path right? if (tb[IFLA_TXQLEN]) { unsigned long value = nla_get_u32(tb[IFLA_TXQLEN]); if (dev->tx_queue_len ^ value) status |= DO_SETLINK_NOTIFY; dev->tx_queue_len = value; } Thanks, John
Jason Wang
2016-Jun-30 05:12 UTC
[PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
On 2016?06?30? 12:56, John Fastabend wrote:> On 16-06-29 08:52 PM, Jason Wang wrote: >> This patch introduces a new event - NETDEV_CHANGE_TX_QUEUE_LEN, this >> will be triggered when tx_queue_len. It could be used by net device >> who want to do some processing at that time. An example is tun who may >> want to resize tx array when tx_queue_len is changed. >> >> Signed-off-by: Jason Wang <jasowang at redhat.com> >> --- >> include/linux/netdevice.h | 1 + >> net/core/net-sysfs.c | 15 ++++++++++++++- >> 2 files changed, 15 insertions(+), 1 deletion(-) >> >> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >> index e84d9d2..7dc2ec7 100644 >> --- a/include/linux/netdevice.h >> +++ b/include/linux/netdevice.h >> @@ -2237,6 +2237,7 @@ struct netdev_lag_lower_state_info { >> #define NETDEV_PRECHANGEUPPER 0x001A >> #define NETDEV_CHANGELOWERSTATE 0x001B >> #define NETDEV_UDP_TUNNEL_PUSH_INFO 0x001C >> +#define NETDEV_CHANGE_TX_QUEUE_LEN 0x001E >> >> int register_netdevice_notifier(struct notifier_block *nb); >> int unregister_netdevice_notifier(struct notifier_block *nb); >> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c >> index 7a0b616..6e4f347 100644 >> --- a/net/core/net-sysfs.c >> +++ b/net/core/net-sysfs.c >> @@ -322,7 +322,20 @@ NETDEVICE_SHOW_RW(flags, fmt_hex); >> >> static int change_tx_queue_len(struct net_device *dev, unsigned long new_len) >> { >> - dev->tx_queue_len = new_len; >> + int res, orig_len = dev->tx_queue_len; >> + >> + if (new_len != orig_len) { >> + dev->tx_queue_len = new_len; >> + res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev); >> + res = notifier_to_errno(res); >> + if (res) { >> + netdev_err(dev, >> + "refused to change device tx_queue_len\n"); >> + dev->tx_queue_len = orig_len; >> + return -EFAULT; >> + } >> + } >> + >> return 0; >> } >> >> > Acked-by: John Fastabend <john.r.fastabend at intel.com> > > Great timing I was just looking into this because I need it for the > qdisc side. > > It looks like this covers the sysfs change but the tx_queue_len can > also be changed via rtnetlink as well. So we need another patch for > that path right? > > if (tb[IFLA_TXQLEN]) { > unsigned long value = nla_get_u32(tb[IFLA_TXQLEN]); > > if (dev->tx_queue_len ^ value) > status |= DO_SETLINK_NOTIFY; > > dev->tx_queue_len = value; > } > > Thanks, > John >Right, will do this in next version. Thanks
Jason Wang
2016-Jun-30 05:59 UTC
[PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
On 2016?06?30? 13:12, Jason Wang wrote:> > > On 2016?06?30? 12:56, John Fastabend wrote: >> On 16-06-29 08:52 PM, Jason Wang wrote: >>> This patch introduces a new event - NETDEV_CHANGE_TX_QUEUE_LEN, this >>> will be triggered when tx_queue_len. It could be used by net device >>> who want to do some processing at that time. An example is tun who may >>> want to resize tx array when tx_queue_len is changed. >>> >>> Signed-off-by: Jason Wang <jasowang at redhat.com> >>> --- >>> include/linux/netdevice.h | 1 + >>> net/core/net-sysfs.c | 15 ++++++++++++++- >>> 2 files changed, 15 insertions(+), 1 deletion(-) >>> >>> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >>> index e84d9d2..7dc2ec7 100644 >>> --- a/include/linux/netdevice.h >>> +++ b/include/linux/netdevice.h >>> @@ -2237,6 +2237,7 @@ struct netdev_lag_lower_state_info { >>> #define NETDEV_PRECHANGEUPPER 0x001A >>> #define NETDEV_CHANGELOWERSTATE 0x001B >>> #define NETDEV_UDP_TUNNEL_PUSH_INFO 0x001C >>> +#define NETDEV_CHANGE_TX_QUEUE_LEN 0x001E >>> int register_netdevice_notifier(struct notifier_block *nb); >>> int unregister_netdevice_notifier(struct notifier_block *nb); >>> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c >>> index 7a0b616..6e4f347 100644 >>> --- a/net/core/net-sysfs.c >>> +++ b/net/core/net-sysfs.c >>> @@ -322,7 +322,20 @@ NETDEVICE_SHOW_RW(flags, fmt_hex); >>> static int change_tx_queue_len(struct net_device *dev, unsigned >>> long new_len) >>> { >>> - dev->tx_queue_len = new_len; >>> + int res, orig_len = dev->tx_queue_len; >>> + >>> + if (new_len != orig_len) { >>> + dev->tx_queue_len = new_len; >>> + res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, >>> dev); >>> + res = notifier_to_errno(res); >>> + if (res) { >>> + netdev_err(dev, >>> + "refused to change device tx_queue_len\n"); >>> + dev->tx_queue_len = orig_len; >>> + return -EFAULT; >>> + } >>> + } >>> + >>> return 0; >>> } >>> >> Acked-by: John Fastabend <john.r.fastabend at intel.com> >> >> Great timing I was just looking into this because I need it for the >> qdisc side. >> >> It looks like this covers the sysfs change but the tx_queue_len can >> also be changed via rtnetlink as well. So we need another patch for >> that path right? >> >> if (tb[IFLA_TXQLEN]) { >> unsigned long value = nla_get_u32(tb[IFLA_TXQLEN]); >> >> if (dev->tx_queue_len ^ value) >> status |= DO_SETLINK_NOTIFY; >> >> dev->tx_queue_len = value; >> } >> >> Thanks, >> John >> > > Right, will do this in next version. > > ThanksOk, since Michael has acked on the series, will prepare a patch on top. Thanks
Possibly Parallel Threads
- [PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
- [PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
- [PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
- [PATCH net-next V4 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN
- [PATCH net-next V3 5/6] net: introduce NETDEV_CHANGE_TX_QUEUE_LEN