Patchwork [net-next-2.6] ethtool: update get_rx_ntuple to correctly interpret string count

login
register
mail settings
Submitter Alexander Duyck
Date Jan. 4, 2011, 11:29 p.m.
Message ID <20110104232947.3451.91153.stgit@gitlad.jf.intel.com>
Download mbox | patch
Permalink /patch/77548/
State Changes Requested
Delegated to: David Miller
Headers show

Comments

Alexander Duyck - Jan. 4, 2011, 11:29 p.m.
Currently any strings returned via the get_rx_ntuple call will just be
dropped because the num_strings will be zero.  In order to correct this I
am updating things so that the return value of get_rx_ntuple is the number
of strings that were written, or a negative value if there was an error.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
---

 net/core/ethtool.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ben Hutchings - Jan. 5, 2011, 12:01 a.m.
On Tue, 2011-01-04 at 15:29 -0800, Alexander Duyck wrote:
> Currently any strings returned via the get_rx_ntuple call will just be
> dropped because the num_strings will be zero.  In order to correct this I
> am updating things so that the return value of get_rx_ntuple is the number
> of strings that were written, or a negative value if there was an error.
[...]

Nothing implements ethtool_ops::get_rx_ntuple, anyway.

The fallback implementation is totally bogus, too.  Maximum of 1024
filters?  Erm, sfc can handle more than that.  And doing complex string
formatting in the kernel, even though all the parsing is in ethtool?

Please, let's write off ETHTOOL_GRXNTUPLE as a failed experiment and
replace it with a command that behaves more like ETHTOOL_GRXCLSRLALL.

Ben.
Alexander Duyck - Jan. 5, 2011, 1:06 a.m.
On 1/4/2011 4:01 PM, Ben Hutchings wrote:
> On Tue, 2011-01-04 at 15:29 -0800, Alexander Duyck wrote:
>> Currently any strings returned via the get_rx_ntuple call will just be
>> dropped because the num_strings will be zero.  In order to correct this I
>> am updating things so that the return value of get_rx_ntuple is the number
>> of strings that were written, or a negative value if there was an error.
> [...]
>
> Nothing implements ethtool_ops::get_rx_ntuple, anyway.
>
> The fallback implementation is totally bogus, too.  Maximum of 1024
> filters?  Erm, sfc can handle more than that.  And doing complex string
> formatting in the kernel, even though all the parsing is in ethtool?
>
> Please, let's write off ETHTOOL_GRXNTUPLE as a failed experiment and
> replace it with a command that behaves more like ETHTOOL_GRXCLSRLALL.
>
> Ben.

In order to address several different issues in the perfect filters 
provided by 82599 I found it necessary to implement get_rx_ntuple so 
that the driver could maintain the filter list inside of the driver 
instead of having it maintained by the stack.  In doing so though I 
found the bug.

I agree the fallback implementation has a limitation on the number and 
format of filters it supports.  However declaring the function a "failed 
experiment" and just dropping it isn't exactly constructive since we 
have customers that are making use of the feature.  The fallback 
implementation is meant to be just that, and the patch I provided makes 
it possible to support more filters if needed by implementing a means of 
tracking/displaying the filters within the driver itself.

Thanks,

Alex
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ben Hutchings - Jan. 5, 2011, 3:26 p.m.
On Tue, 2011-01-04 at 17:06 -0800, Alexander Duyck wrote:
> On 1/4/2011 4:01 PM, Ben Hutchings wrote:
> > On Tue, 2011-01-04 at 15:29 -0800, Alexander Duyck wrote:
> >> Currently any strings returned via the get_rx_ntuple call will just be
> >> dropped because the num_strings will be zero.  In order to correct this I
> >> am updating things so that the return value of get_rx_ntuple is the number
> >> of strings that were written, or a negative value if there was an error.
> > [...]
> >
> > Nothing implements ethtool_ops::get_rx_ntuple, anyway.
> >
> > The fallback implementation is totally bogus, too.  Maximum of 1024
> > filters?  Erm, sfc can handle more than that.  And doing complex string
> > formatting in the kernel, even though all the parsing is in ethtool?
> >
> > Please, let's write off ETHTOOL_GRXNTUPLE as a failed experiment and
> > replace it with a command that behaves more like ETHTOOL_GRXCLSRLALL.
> >
> > Ben.
> 
> In order to address several different issues in the perfect filters 
> provided by 82599 I found it necessary to implement get_rx_ntuple so 
> that the driver could maintain the filter list inside of the driver 
> instead of having it maintained by the stack.  In doing so though I 
> found the bug.
> 
> I agree the fallback implementation has a limitation on the number and 
> format of filters it supports.  However declaring the function a "failed 
> experiment" and just dropping it isn't exactly constructive since we 
> have customers that are making use of the feature.
[...]

We can at least drop that fallback implementation since it apparently
doesn't work properly for either of the drivers that currently use it.

In the medium term, I do want to replace it with a binary interface and
move that formatting to ethtool.  ETHTOOL_GRXNTUPLE could be kept around
for a while for ixgbe only, while your customers have a chance to get
the updated ethtool.

Ben.
Alexander Duyck - Jan. 5, 2011, 4:57 p.m.
On 1/5/2011 7:26 AM, Ben Hutchings wrote:
> On Tue, 2011-01-04 at 17:06 -0800, Alexander Duyck wrote:
>> On 1/4/2011 4:01 PM, Ben Hutchings wrote:
>>> On Tue, 2011-01-04 at 15:29 -0800, Alexander Duyck wrote:
>>>> Currently any strings returned via the get_rx_ntuple call will just be
>>>> dropped because the num_strings will be zero.  In order to correct this I
>>>> am updating things so that the return value of get_rx_ntuple is the number
>>>> of strings that were written, or a negative value if there was an error.
>>> [...]
>>>
>>> Nothing implements ethtool_ops::get_rx_ntuple, anyway.
>>>
>>> The fallback implementation is totally bogus, too.  Maximum of 1024
>>> filters?  Erm, sfc can handle more than that.  And doing complex string
>>> formatting in the kernel, even though all the parsing is in ethtool?
>>>
>>> Please, let's write off ETHTOOL_GRXNTUPLE as a failed experiment and
>>> replace it with a command that behaves more like ETHTOOL_GRXCLSRLALL.
>>>
>>> Ben.
>>
>> In order to address several different issues in the perfect filters
>> provided by 82599 I found it necessary to implement get_rx_ntuple so
>> that the driver could maintain the filter list inside of the driver
>> instead of having it maintained by the stack.  In doing so though I
>> found the bug.
>>
>> I agree the fallback implementation has a limitation on the number and
>> format of filters it supports.  However declaring the function a "failed
>> experiment" and just dropping it isn't exactly constructive since we
>> have customers that are making use of the feature.
> [...]
>
> We can at least drop that fallback implementation since it apparently
> doesn't work properly for either of the drivers that currently use it.
>
> In the medium term, I do want to replace it with a binary interface and
> move that formatting to ethtool.  ETHTOOL_GRXNTUPLE could be kept around
> for a while for ixgbe only, while your customers have a chance to get
> the updated ethtool.
>
> Ben.
>

I'm fine with us replacing the ETHTOOL_GRXNTUPLE interface, but I would 
prefer to do it after the merge windows for 2.6.39 has opened.  For now 
I would like to get this patch accepted as my main concern is getting a 
minor fix in versus rewriting the entire interface.

While we're at it how would you feel about us inverting the masks for 
setting up an ntuple by making them an inclusion mask instead of an 
exclusion one?  The reason why I ask is because I have to perform an and 
operation over all the input anyway before I can use it to compute the 
hashes and as such I am having to invert almost all of the mask bits, 
and it appears you are having to do this as well for many of the masks 
in sfc.

Thanks,

Alex
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ben Hutchings - Jan. 5, 2011, 5:28 p.m.
On Wed, 2011-01-05 at 08:57 -0800, Alexander Duyck wrote:
[...]
> I'm fine with us replacing the ETHTOOL_GRXNTUPLE interface, but I would 
> prefer to do it after the merge windows for 2.6.39 has opened.  For now 
> I would like to get this patch accepted as my main concern is getting a 
> minor fix in versus rewriting the entire interface.

So long as there are no in-tree implementations of
ethtool_ops::get_rx_ntuple then it's a valid candidate for removal.
Since you now want to implement it, I think you should submit the
implementation along with the fix for the calling code.

> While we're at it how would you feel about us inverting the masks for 
> setting up an ntuple by making them an inclusion mask instead of an 
> exclusion one?  The reason why I ask is because I have to perform an and 
> operation over all the input anyway before I can use it to compute the 
> hashes and as such I am having to invert almost all of the mask bits, 
> and it appears you are having to do this as well for many of the masks 
> in sfc.

We can't change the userland interface but we could potentially invert
the masks in the ethtool core.  I'm really not convinced that this is
worth the trouble though.  (And it would be a massive pain for the OOT
versions of our drivers.)

Ben.

Patch

diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 1774178..7ade13b 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -587,6 +587,9 @@  static int ethtool_get_rx_ntuple(struct net_device *dev, void __user *useraddr)
 	if (ops->get_rx_ntuple) {
 		/* driver-specific filter grab */
 		ret = ops->get_rx_ntuple(dev, gstrings.string_set, data);
+		if (ret < 0)
+			goto out;
+		num_strings = ret;
 		goto copy;
 	}