aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2014-05-14 20:41:23 -0400
committerBen Hutchings <ben@decadent.org.uk>2014-05-18 20:18:19 -0400
commit7455fa2422898eee3464032351d20695930d9542 (patch)
tree7b192d2c78342657dbaa0d226daf6ab0df3973e7
parentfb95cd8d1473b1cc90eccbd6a30641f3851c8506 (diff)
ethtool: Name the 'no change' value for setting RSS hash key but not indir table
We usually allocate special values of u32 fields starting from the top down, so also change the value to 0xffffffff. As these operations haven't been included in a stable release yet, it's not too late to change. Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--include/uapi/linux/ethtool.h12
-rw-r--r--net/core/ethtool.c12
2 files changed, 14 insertions, 10 deletions
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index d47d31d6fa0e..cba18e3f8fab 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -850,7 +850,8 @@ struct ethtool_rxfh_indir {
850 * struct ethtool_rxfh - command to get/set RX flow hash indir or/and hash key. 850 * struct ethtool_rxfh - command to get/set RX flow hash indir or/and hash key.
851 * @cmd: Specific command number - %ETHTOOL_GRSSH or %ETHTOOL_SRSSH 851 * @cmd: Specific command number - %ETHTOOL_GRSSH or %ETHTOOL_SRSSH
852 * @rss_context: RSS context identifier. 852 * @rss_context: RSS context identifier.
853 * @indir_size: On entry, the array size of the user buffer, which may be zero. 853 * @indir_size: On entry, the array size of the user buffer, which may be zero,
854 * or (for %ETHTOOL_SRSSH), %ETH_RXFH_INDIR_NO_CHANGE.
854 * On return from %ETHTOOL_GRSSH, the array size of the hardware 855 * On return from %ETHTOOL_GRSSH, the array size of the hardware
855 * indirection table. 856 * indirection table.
856 * @key_size: On entry, the array size of the user buffer in bytes, 857 * @key_size: On entry, the array size of the user buffer in bytes,
@@ -861,10 +862,10 @@ struct ethtool_rxfh_indir {
861 * of size @indir_size followed by hash key of size @key_size. 862 * of size @indir_size followed by hash key of size @key_size.
862 * 863 *
863 * For %ETHTOOL_GRSSH, a @indir_size and key_size of zero means that only the 864 * For %ETHTOOL_GRSSH, a @indir_size and key_size of zero means that only the
864 * size should be returned. For %ETHTOOL_SRSSH, a @indir_size of 0xDEADBEEF 865 * size should be returned. For %ETHTOOL_SRSSH, an @indir_size of
865 * means that indir table setting is not requested and a @indir_size of zero 866 * %ETH_RXFH_INDIR_NO_CHANGE means that indir table setting is not requested
866 * means the indir table should be reset to default values. This last feature 867 * and a @indir_size of zero means the indir table should be reset to default
867 * is not supported by the original implementations. 868 * values.
868 */ 869 */
869struct ethtool_rxfh { 870struct ethtool_rxfh {
870 __u32 cmd; 871 __u32 cmd;
@@ -874,6 +875,7 @@ struct ethtool_rxfh {
874 __u32 rsvd[2]; 875 __u32 rsvd[2];
875 __u32 rss_config[0]; 876 __u32 rss_config[0];
876}; 877};
878#define ETH_RXFH_INDIR_NO_CHANGE 0xffffffff
877 879
878/** 880/**
879 * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter 881 * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index c834cb29f682..7156fe5ca876 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -803,12 +803,13 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
803 803
804 /* If either indir or hash key is valid, proceed further. 804 /* If either indir or hash key is valid, proceed further.
805 */ 805 */
806 if ((user_indir_size && ((user_indir_size != 0xDEADBEEF) && 806 if ((user_indir_size &&
807 user_indir_size != dev_indir_size)) || 807 user_indir_size != ETH_RXFH_INDIR_NO_CHANGE &&
808 user_indir_size != dev_indir_size) ||
808 (user_key_size && (user_key_size != dev_key_size))) 809 (user_key_size && (user_key_size != dev_key_size)))
809 return -EINVAL; 810 return -EINVAL;
810 811
811 if (user_indir_size != 0xDEADBEEF) 812 if (user_indir_size != ETH_RXFH_INDIR_NO_CHANGE)
812 indir_bytes = dev_indir_size * sizeof(indir[0]); 813 indir_bytes = dev_indir_size * sizeof(indir[0]);
813 814
814 rss_config = kzalloc(indir_bytes + user_key_size, GFP_USER); 815 rss_config = kzalloc(indir_bytes + user_key_size, GFP_USER);
@@ -821,9 +822,10 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
821 goto out; 822 goto out;
822 823
823 /* user_indir_size == 0 means reset the indir table to default. 824 /* user_indir_size == 0 means reset the indir table to default.
824 * user_indir_size == 0xDEADBEEF means indir setting is not requested. 825 * user_indir_size == ETH_RXFH_INDIR_NO_CHANGE means leave it unchanged.
825 */ 826 */
826 if (user_indir_size && user_indir_size != 0xDEADBEEF) { 827 if (user_indir_size &&
828 user_indir_size != ETH_RXFH_INDIR_NO_CHANGE) {
827 indir = (u32 *)rss_config; 829 indir = (u32 *)rss_config;
828 ret = ethtool_copy_validate_indir(indir, 830 ret = ethtool_copy_validate_indir(indir,
829 useraddr + rss_cfg_offset, 831 useraddr + rss_cfg_offset,