aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,