diff options
-rw-r--r-- | include/uapi/linux/ethtool.h | 12 | ||||
-rw-r--r-- | net/core/ethtool.c | 12 |
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 | */ |
869 | struct ethtool_rxfh { | 870 | struct 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, |