lkml.org 
[lkml]   [2021]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 069/290] ethtool: fix the check logic of at least one channel for RX/TX
    Date
    From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    From: Yinjun Zhang <yinjun.zhang@corigine.com>

    commit a4fc088ad4ff4a99d01978aa41065132b574b4b2 upstream.

    The command "ethtool -L <intf> combined 0" may clean the RX/TX channel
    count and skip the error path, since the attrs
    tb[ETHTOOL_A_CHANNELS_RX_COUNT] and tb[ETHTOOL_A_CHANNELS_TX_COUNT]
    are NULL in this case when recent ethtool is used.

    Tested using ethtool v5.10.

    Fixes: 7be92514b99c ("ethtool: check if there is at least one channel for TX/RX in the core")
    Signed-off-by: Yinjun Zhang <yinjun.zhang@corigine.com>
    Signed-off-by: Simon Horman <simon.horman@netronome.com>
    Signed-off-by: Louis Peens <louis.peens@netronome.com>
    Link: https://lore.kernel.org/r/20210225125102.23989-1-simon.horman@netronome.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ethtool/channels.c | 26 +++++++++++++-------------
    1 file changed, 13 insertions(+), 13 deletions(-)

    --- a/net/ethtool/channels.c
    +++ b/net/ethtool/channels.c
    @@ -116,10 +116,9 @@ int ethnl_set_channels(struct sk_buff *s
    struct ethtool_channels channels = {};
    struct ethnl_req_info req_info = {};
    struct nlattr **tb = info->attrs;
    - const struct nlattr *err_attr;
    + u32 err_attr, max_rx_in_use = 0;
    const struct ethtool_ops *ops;
    struct net_device *dev;
    - u32 max_rx_in_use = 0;
    int ret;

    ret = ethnl_parse_header_dev_get(&req_info,
    @@ -157,34 +156,35 @@ int ethnl_set_channels(struct sk_buff *s

    /* ensure new channel counts are within limits */
    if (channels.rx_count > channels.max_rx)
    - err_attr = tb[ETHTOOL_A_CHANNELS_RX_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_RX_COUNT;
    else if (channels.tx_count > channels.max_tx)
    - err_attr = tb[ETHTOOL_A_CHANNELS_TX_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_TX_COUNT;
    else if (channels.other_count > channels.max_other)
    - err_attr = tb[ETHTOOL_A_CHANNELS_OTHER_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_OTHER_COUNT;
    else if (channels.combined_count > channels.max_combined)
    - err_attr = tb[ETHTOOL_A_CHANNELS_COMBINED_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_COMBINED_COUNT;
    else
    - err_attr = NULL;
    + err_attr = 0;
    if (err_attr) {
    ret = -EINVAL;
    - NL_SET_ERR_MSG_ATTR(info->extack, err_attr,
    + NL_SET_ERR_MSG_ATTR(info->extack, tb[err_attr],
    "requested channel count exceeds maximum");
    goto out_ops;
    }

    /* ensure there is at least one RX and one TX channel */
    if (!channels.combined_count && !channels.rx_count)
    - err_attr = tb[ETHTOOL_A_CHANNELS_RX_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_RX_COUNT;
    else if (!channels.combined_count && !channels.tx_count)
    - err_attr = tb[ETHTOOL_A_CHANNELS_TX_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_TX_COUNT;
    else
    - err_attr = NULL;
    + err_attr = 0;
    if (err_attr) {
    if (mod_combined)
    - err_attr = tb[ETHTOOL_A_CHANNELS_COMBINED_COUNT];
    + err_attr = ETHTOOL_A_CHANNELS_COMBINED_COUNT;
    ret = -EINVAL;
    - NL_SET_ERR_MSG_ATTR(info->extack, err_attr, "requested channel counts would result in no RX or TX channel being configured");
    + NL_SET_ERR_MSG_ATTR(info->extack, tb[err_attr],
    + "requested channel counts would result in no RX or TX channel being configured");
    goto out_ops;
    }


    \
     
     \ /
      Last update: 2021-03-15 15:39    [W:8.428 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site