* [PATCH] [NET] ethtool: Add LRO support
@ 2007-07-31 20:21 Auke Kok
0 siblings, 0 replies; 8+ messages in thread
From: Auke Kok @ 2007-07-31 20:21 UTC (permalink / raw)
To: netdev; +Cc: jgarzik, davem
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
---
include/linux/ethtool.h | 8 +++++++
include/linux/netdevice.h | 1 +
net/core/ethtool.c | 54 ++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 62 insertions(+), 1 deletions(-)
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 3a63224..ab9d688 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -274,6 +274,8 @@ int ethtool_op_get_perm_addr(struct net_device *dev,
struct ethtool_perm_addr *addr, u8 *data);
u32 ethtool_op_get_ufo(struct net_device *dev);
int ethtool_op_set_ufo(struct net_device *dev, u32 data);
+u32 ethtool_op_get_lro(struct net_device *dev);
+int ethtool_op_set_lro(struct net_device *dev, u32 data);
/**
* ðtool_ops - Alter and report network device settings
@@ -305,6 +307,8 @@ int ethtool_op_set_ufo(struct net_device *dev, u32 data);
* set_tso: Turn TCP segmentation offload on or off
* get_ufo: Report whether UDP fragmentation offload is enabled
* set_ufo: Turn UDP fragmentation offload on or off
+ * get_lro: Report whether large receive offload is enabled
+ * set_lro: Turn large receive offload on or off
* self_test: Run specified self-tests
* get_strings: Return a set of strings that describe the requested objects
* phys_id: Identify the device
@@ -373,6 +377,8 @@ struct ethtool_ops {
void (*complete)(struct net_device *);
u32 (*get_ufo)(struct net_device *);
int (*set_ufo)(struct net_device *, u32);
+ u32 (*get_lro)(struct net_device *);
+ int (*set_lro)(struct net_device *, u32);
};
#endif /* __KERNEL__ */
@@ -414,6 +420,8 @@ struct ethtool_ops {
#define ETHTOOL_SUFO 0x00000022 /* Set UFO enable (ethtool_value) */
#define ETHTOOL_GGSO 0x00000023 /* Get GSO enable (ethtool_value) */
#define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */
+#define ETHTOOL_GLRO 0x00000025 /* Get LRO enable (ethtool_value) */
+#define ETHTOOL_SLRO 0x00000026 /* Set LRO enable (ethtool_value) */
/* compatibility with older code */
#define SPARC_ETH_GSET ETHTOOL_GSET
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 4a616d7..4863ffc 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -341,6 +341,7 @@ struct net_device
#define NETIF_F_GSO 2048 /* Enable software GSO. */
#define NETIF_F_LLTX 4096 /* LockLess TX */
#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
+#define NETIF_F_LRO 32768 /* Has large receive offload */
/* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 0b531e9..23ccaa1 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -104,7 +104,6 @@ int ethtool_op_get_perm_addr(struct net_device *dev, struct ethtool_perm_addr *a
return 0;
}
-
u32 ethtool_op_get_ufo(struct net_device *dev)
{
return (dev->features & NETIF_F_UFO) != 0;
@@ -119,6 +118,20 @@ int ethtool_op_set_ufo(struct net_device *dev, u32 data)
return 0;
}
+u32 ethtool_op_get_lro(struct net_device *dev)
+{
+ return (dev->features & NETIF_F_LRO) != 0;
+}
+
+int ethtool_op_set_lro(struct net_device *dev, u32 data)
+{
+ if (data)
+ dev->features |= NETIF_F_LRO;
+ else
+ dev->features &= ~NETIF_F_LRO;
+ return 0;
+}
+
/* Handlers for each ethtool command */
static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
@@ -514,6 +527,13 @@ static int __ethtool_set_sg(struct net_device *dev, u32 data)
if (err)
return err;
}
+
+ if (!data && dev->ethtool_ops->set_lro) {
+ err = dev->ethtool_ops->set_lro(dev, 0);
+ if (err)
+ return err;
+ }
+
return dev->ethtool_ops->set_sg(dev, data);
}
@@ -625,6 +645,29 @@ static int ethtool_set_ufo(struct net_device *dev, char __user *useraddr)
return dev->ethtool_ops->set_ufo(dev, edata.data);
}
+static int ethtool_get_lro(struct net_device *dev, char __user *useraddr)
+{
+ struct ethtool_value edata = { ETHTOOL_GLRO };
+
+ edata.data = dev->features & NETIF_F_LRO;
+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
+ return -EFAULT;
+ return 0;
+}
+
+static int ethtool_set_lro(struct net_device *dev, char __user *useraddr)
+{
+ struct ethtool_value edata;
+
+ if (copy_from_user(&edata, useraddr, sizeof(edata)))
+ return -EFAULT;
+ if (edata.data)
+ dev->features |= NETIF_F_LRO;
+ else
+ dev->features &= ~NETIF_F_LRO;
+ return 0;
+}
+
static int ethtool_get_gso(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GGSO };
@@ -840,6 +883,7 @@ int dev_ethtool(struct ifreq *ifr)
case ETHTOOL_GTSO:
case ETHTOOL_GPERMADDR:
case ETHTOOL_GUFO:
+ case ETHTOOL_GLRO:
case ETHTOOL_GGSO:
break;
default:
@@ -953,6 +997,12 @@ int dev_ethtool(struct ifreq *ifr)
case ETHTOOL_SUFO:
rc = ethtool_set_ufo(dev, useraddr);
break;
+ case ETHTOOL_GLRO:
+ rc = ethtool_get_lro(dev, useraddr);
+ break;
+ case ETHTOOL_SLRO:
+ rc = ethtool_set_lro(dev, useraddr);
+ break;
case ETHTOOL_GGSO:
rc = ethtool_get_gso(dev, useraddr);
break;
@@ -994,3 +1044,5 @@ EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum);
EXPORT_SYMBOL(ethtool_op_set_ufo);
EXPORT_SYMBOL(ethtool_op_get_ufo);
+EXPORT_SYMBOL(ethtool_op_set_lro);
+EXPORT_SYMBOL(ethtool_op_get_lro);
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH] [NET] ethtool: Add LRO support
@ 2007-08-09 16:41 Auke Kok
2007-08-09 22:00 ` David Miller
2007-08-10 8:42 ` Jeff Garzik
0 siblings, 2 replies; 8+ messages in thread
From: Auke Kok @ 2007-08-09 16:41 UTC (permalink / raw)
To: davem, jeff; +Cc: netdev, ossthema
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
---
include/linux/ethtool.h | 8 +++++++
include/linux/netdevice.h | 1 +
net/core/ethtool.c | 53 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 23ccea8..a97248e 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -272,6 +272,8 @@ u32 ethtool_op_get_tso(struct net_device *dev);
int ethtool_op_set_tso(struct net_device *dev, u32 data);
u32 ethtool_op_get_ufo(struct net_device *dev);
int ethtool_op_set_ufo(struct net_device *dev, u32 data);
+u32 ethtool_op_get_lro(struct net_device *dev);
+int ethtool_op_set_lro(struct net_device *dev, u32 data);
/**
* ðtool_ops - Alter and report network device settings
@@ -303,6 +305,8 @@ int ethtool_op_set_ufo(struct net_device *dev, u32 data);
* set_tso: Turn TCP segmentation offload on or off
* get_ufo: Report whether UDP fragmentation offload is enabled
* set_ufo: Turn UDP fragmentation offload on or off
+ * get_lro: Report whether large receive offload is enabled
+ * set_lro: Turn large receive offload on or off
* self_test: Run specified self-tests
* get_strings: Return a set of strings that describe the requested objects
* phys_id: Identify the device
@@ -369,6 +373,8 @@ struct ethtool_ops {
void (*complete)(struct net_device *);
u32 (*get_ufo)(struct net_device *);
int (*set_ufo)(struct net_device *, u32);
+ u32 (*get_lro)(struct net_device *);
+ int (*set_lro)(struct net_device *, u32);
};
#endif /* __KERNEL__ */
@@ -410,6 +416,8 @@ struct ethtool_ops {
#define ETHTOOL_SUFO 0x00000022 /* Set UFO enable (ethtool_value) */
#define ETHTOOL_GGSO 0x00000023 /* Get GSO enable (ethtool_value) */
#define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (ethtool_value) */
+#define ETHTOOL_GLRO 0x00000025 /* Get LRO enable (ethtool_value) */
+#define ETHTOOL_SLRO 0x00000026 /* Set LRO enable (ethtool_value) */
/* compatibility with older code */
#define SPARC_ETH_GSET ETHTOOL_GSET
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 4a616d7..4863ffc 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -341,6 +341,7 @@ struct net_device
#define NETIF_F_GSO 2048 /* Enable software GSO. */
#define NETIF_F_LLTX 4096 /* LockLess TX */
#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
+#define NETIF_F_LRO 32768 /* Has large receive offload */
/* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 2ab0a60..65f751b 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -109,6 +109,20 @@ int ethtool_op_set_ufo(struct net_device *dev, u32 data)
return 0;
}
+u32 ethtool_op_get_lro(struct net_device *dev)
+{
+ return (dev->features & NETIF_F_LRO) != 0;
+}
+
+int ethtool_op_set_lro(struct net_device *dev, u32 data)
+{
+ if (data)
+ dev->features |= NETIF_F_LRO;
+ else
+ dev->features &= ~NETIF_F_LRO;
+ return 0;
+}
+
/* Handlers for each ethtool command */
static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
@@ -504,6 +518,13 @@ static int __ethtool_set_sg(struct net_device *dev, u32 data)
if (err)
return err;
}
+
+ if (!data && dev->ethtool_ops->set_lro) {
+ err = dev->ethtool_ops->set_lro(dev, 0);
+ if (err)
+ return err;
+ }
+
return dev->ethtool_ops->set_sg(dev, data);
}
@@ -615,6 +636,29 @@ static int ethtool_set_ufo(struct net_device *dev, char __user *useraddr)
return dev->ethtool_ops->set_ufo(dev, edata.data);
}
+static int ethtool_get_lro(struct net_device *dev, char __user *useraddr)
+{
+ struct ethtool_value edata = { ETHTOOL_GLRO };
+
+ edata.data = dev->features & NETIF_F_LRO;
+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
+ return -EFAULT;
+ return 0;
+}
+
+static int ethtool_set_lro(struct net_device *dev, char __user *useraddr)
+{
+ struct ethtool_value edata;
+
+ if (copy_from_user(&edata, useraddr, sizeof(edata)))
+ return -EFAULT;
+ if (edata.data)
+ dev->features |= NETIF_F_LRO;
+ else
+ dev->features &= ~NETIF_F_LRO;
+ return 0;
+}
+
static int ethtool_get_gso(struct net_device *dev, char __user *useraddr)
{
struct ethtool_value edata = { ETHTOOL_GGSO };
@@ -816,6 +860,7 @@ int dev_ethtool(struct ifreq *ifr)
case ETHTOOL_GTSO:
case ETHTOOL_GPERMADDR:
case ETHTOOL_GUFO:
+ case ETHTOOL_GLRO:
case ETHTOOL_GGSO:
break;
default:
@@ -929,6 +974,12 @@ int dev_ethtool(struct ifreq *ifr)
case ETHTOOL_SUFO:
rc = ethtool_set_ufo(dev, useraddr);
break;
+ case ETHTOOL_GLRO:
+ rc = ethtool_get_lro(dev, useraddr);
+ break;
+ case ETHTOOL_SLRO:
+ rc = ethtool_set_lro(dev, useraddr);
+ break;
case ETHTOOL_GGSO:
rc = ethtool_get_gso(dev, useraddr);
break;
@@ -960,3 +1011,5 @@ EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum);
EXPORT_SYMBOL(ethtool_op_set_ufo);
EXPORT_SYMBOL(ethtool_op_get_ufo);
+EXPORT_SYMBOL(ethtool_op_set_lro);
+EXPORT_SYMBOL(ethtool_op_get_lro);
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-09 16:41 [PATCH] [NET] ethtool: Add LRO support Auke Kok
@ 2007-08-09 22:00 ` David Miller
2007-08-10 7:47 ` Jan-Bernd Themann
2007-08-10 8:42 ` Jeff Garzik
1 sibling, 1 reply; 8+ messages in thread
From: David Miller @ 2007-08-09 22:00 UTC (permalink / raw)
To: auke-jan.h.kok; +Cc: jeff, netdev, ossthema
From: Auke Kok <auke-jan.h.kok@intel.com>
Date: Thu, 09 Aug 2007 09:41:17 -0700
> Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
I think this is definitely how we should handle LRO
configuration instead of the ad-hoc module parameters
current LRO drivers use now.
I'll put this infrastructure into net-2.6.24, it would
be nice if the EHEA and myri10g folks submitted conversions.
Thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-09 22:00 ` David Miller
@ 2007-08-10 7:47 ` Jan-Bernd Themann
0 siblings, 0 replies; 8+ messages in thread
From: Jan-Bernd Themann @ 2007-08-10 7:47 UTC (permalink / raw)
To: David Miller; +Cc: auke-jan.h.kok, jeff, netdev
Hi
On Friday 10 August 2007 00:00, David Miller wrote:
> From: Auke Kok <auke-jan.h.kok@intel.com>
> Date: Thu, 09 Aug 2007 09:41:17 -0700
>
> > Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
>
> I think this is definitely how we should handle LRO
> configuration instead of the ad-hoc module parameters
> current LRO drivers use now.
>
> I'll put this infrastructure into net-2.6.24, it would
> be nice if the EHEA and myri10g folks submitted conversions.
>
yes, I'll submit a patch soon
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-09 16:41 [PATCH] [NET] ethtool: Add LRO support Auke Kok
2007-08-09 22:00 ` David Miller
@ 2007-08-10 8:42 ` Jeff Garzik
2007-08-10 9:28 ` David Miller
2007-08-10 16:24 ` Kok, Auke
1 sibling, 2 replies; 8+ messages in thread
From: Jeff Garzik @ 2007-08-10 8:42 UTC (permalink / raw)
To: Auke Kok, davem; +Cc: netdev, ossthema
Auke Kok wrote:
> Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
> ---
>
> include/linux/ethtool.h | 8 +++++++
> include/linux/netdevice.h | 1 +
> net/core/ethtool.c | 53 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 62 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
> index 23ccea8..a97248e 100644
> --- a/include/linux/ethtool.h
> +++ b/include/linux/ethtool.h
> @@ -272,6 +272,8 @@ u32 ethtool_op_get_tso(struct net_device *dev);
> int ethtool_op_set_tso(struct net_device *dev, u32 data);
> u32 ethtool_op_get_ufo(struct net_device *dev);
> int ethtool_op_set_ufo(struct net_device *dev, u32 data);
> +u32 ethtool_op_get_lro(struct net_device *dev);
> +int ethtool_op_set_lro(struct net_device *dev, u32 data);
I'm thinking we don't need to keep adding two function pointers for each
boolean choice.
I propose adding two operations:
get-flags: return 32-bit (even on 64-bit platforms) flags bitmap
set-flags: set 32-bit flags bitmap
The 32 bits shall be divided as follows:
bits 0-23: ETHTOOL_FLAG_xxx defined in linux/ethtool.h
bits 24-31: driver-specific boolean flags
The driver-specific flags are first enumerated by userland via an
ETHTOOL_GSTRINGS call, using new string set ETH_SS_FLAGS. The first
string returned names the first driver-private flag (bit 24). This also
indicates that driver-private bit 24 is a valid flag for this driver and
network interface.
The overall goal is to replace get-LRO/set-LRO operations with the
setting/clearing of ETH_FLAG_LRO, and as well, provide a more-scalable
ethtool interface.
I'll code this up, along with the associated generic helpers
(net/core/ethtool.c), if there are no objections.
Jeff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-10 8:42 ` Jeff Garzik
@ 2007-08-10 9:28 ` David Miller
2007-08-10 9:32 ` Jeff Garzik
2007-08-10 16:24 ` Kok, Auke
1 sibling, 1 reply; 8+ messages in thread
From: David Miller @ 2007-08-10 9:28 UTC (permalink / raw)
To: jeff; +Cc: auke-jan.h.kok, netdev, ossthema
From: Jeff Garzik <jeff@garzik.org>
Date: Fri, 10 Aug 2007 04:42:44 -0400
> I'll code this up, along with the associated generic helpers
> (net/core/ethtool.c), if there are no objections.
No objections except I would give the driver private it's
own set of flags.
Otherwise the number of bits you choose is arbitrary and
the potential for mistakes is definitely there is you mix
the two uses.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-10 9:28 ` David Miller
@ 2007-08-10 9:32 ` Jeff Garzik
0 siblings, 0 replies; 8+ messages in thread
From: Jeff Garzik @ 2007-08-10 9:32 UTC (permalink / raw)
To: David Miller; +Cc: auke-jan.h.kok, netdev, ossthema
David Miller wrote:
> From: Jeff Garzik <jeff@garzik.org>
> Date: Fri, 10 Aug 2007 04:42:44 -0400
>
>> I'll code this up, along with the associated generic helpers
>> (net/core/ethtool.c), if there are no objections.
>
> No objections except I would give the driver private it's
> own set of flags.
Great minds think alike, I started leaning towards that as I coded up
ETHTOOL_[GS]FLAGS...
Jeff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] [NET] ethtool: Add LRO support
2007-08-10 8:42 ` Jeff Garzik
2007-08-10 9:28 ` David Miller
@ 2007-08-10 16:24 ` Kok, Auke
1 sibling, 0 replies; 8+ messages in thread
From: Kok, Auke @ 2007-08-10 16:24 UTC (permalink / raw)
To: Jeff Garzik; +Cc: davem, netdev, ossthema
Jeff Garzik wrote:
> Auke Kok wrote:
>> Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
>> ---
>>
>> include/linux/ethtool.h | 8 +++++++
>> include/linux/netdevice.h | 1 +
>> net/core/ethtool.c | 53 +++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 62 insertions(+), 0 deletions(-)
>>
>> diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
>> index 23ccea8..a97248e 100644
>> --- a/include/linux/ethtool.h
>> +++ b/include/linux/ethtool.h
>> @@ -272,6 +272,8 @@ u32 ethtool_op_get_tso(struct net_device *dev);
>> int ethtool_op_set_tso(struct net_device *dev, u32 data);
>> u32 ethtool_op_get_ufo(struct net_device *dev);
>> int ethtool_op_set_ufo(struct net_device *dev, u32 data);
>> +u32 ethtool_op_get_lro(struct net_device *dev);
>> +int ethtool_op_set_lro(struct net_device *dev, u32 data);
>
> I'm thinking we don't need to keep adding two function pointers for each
> boolean choice.
>
> I propose adding two operations:
>
> get-flags: return 32-bit (even on 64-bit platforms) flags bitmap
> set-flags: set 32-bit flags bitmap
>
> The 32 bits shall be divided as follows:
>
> bits 0-23: ETHTOOL_FLAG_xxx defined in linux/ethtool.h
> bits 24-31: driver-specific boolean flags
>
> The driver-specific flags are first enumerated by userland via an
> ETHTOOL_GSTRINGS call, using new string set ETH_SS_FLAGS. The first
> string returned names the first driver-private flag (bit 24). This also
> indicates that driver-private bit 24 is a valid flag for this driver and
> network interface.
>
> The overall goal is to replace get-LRO/set-LRO operations with the
> setting/clearing of ETH_FLAG_LRO, and as well, provide a more-scalable
> ethtool interface.
>
> I'll code this up, along with the associated generic helpers
> (net/core/ethtool.c), if there are no objections.
absolutely not. While going over the flags in netdevice.h I can already see that
the room for more flags is rapidly becoming smaller. Unfortunately we're stuck
with the current flags for compatiblity :)
The above idea sounds good to me and should give that room.
Auke
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2007-08-10 16:24 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-09 16:41 [PATCH] [NET] ethtool: Add LRO support Auke Kok
2007-08-09 22:00 ` David Miller
2007-08-10 7:47 ` Jan-Bernd Themann
2007-08-10 8:42 ` Jeff Garzik
2007-08-10 9:28 ` David Miller
2007-08-10 9:32 ` Jeff Garzik
2007-08-10 16:24 ` Kok, Auke
-- strict thread matches above, loose matches on Subject: below --
2007-07-31 20:21 Auke Kok
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).