10 Nov, 2020

1 commit

  • After updating userspace Ethtool from 5.7 to 5.9, I noticed that
    NETDEV_FEAT_CHANGE is no more raised when changing netdev features
    through Ethtool.
    That's because the old Ethtool ioctl interface always calls
    netdev_features_change() at the end of user request processing to
    inform the kernel that our netdevice has some features changed, but
    the new Netlink interface does not. Instead, it just notifies itself
    with ETHTOOL_MSG_FEATURES_NTF.
    Replace this ethtool_notify() call with netdev_features_change(), so
    the kernel will be aware of any features changes, just like in case
    with the ioctl interface. This does not omit Ethtool notifications,
    as Ethtool itself listens to NETDEV_FEAT_CHANGE and drops
    ETHTOOL_MSG_FEATURES_NTF on it
    (net/ethtool/netlink.c:ethnl_netdev_event()).

    From v1 [1]:
    - dropped extra new line as advised by Jakub;
    - no functional changes.

    [1] https://lore.kernel.org/netdev/AlZXQ2o5uuTVHCfNGOiGgJ8vJ3KgO5YIWAnQjH0cDE@cp3-web-009.plabs.ch

    Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: Alexander Lobakin
    Reviewed-by: Michal Kubecek
    Link: https://lore.kernel.org/r/ahA2YWXYICz5rbUSQqNG4roJ8OlJzzYQX7PTiG80@cp4-web-028.plabs.ch
    Signed-off-by: Jakub Kicinski

    Alexander Lobakin
     

06 Oct, 2020

4 commits

  • To get the most out of parsing by the core, and to allow dumping
    full policies we need to specify which policy applies to nested
    attrs. For headers it's ethnl_header_policy.

    $ sed -i 's@\(ETHTOOL_A_.*HEADER\].*=\) { .type = NLA_NESTED },@\1\n\t\tNLA_POLICY_NESTED(ethnl_header_policy),@' net/ethtool/*

    Signed-off-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Jakub Kicinski
     
  • Since ethtool uses strict attribute validation there's no need
    to initialize all attributes in policy tables. 0 is NLA_UNSPEC
    which is going to be rejected. Remove the NLA_REJECTs.

    Similarly attributes above maxattrs are rejected, so there's
    no need to always size the policy tables to ETHTOOL_A_..._MAX.

    v2: - new patch

    Suggested-by: Johannes Berg
    Signed-off-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Jakub Kicinski
     
  • Similarly to get commands wire up the policies of set commands
    to get parsing by the core and policy dumps.

    Signed-off-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Jakub Kicinski
     
  • Wire up policies for get commands in struct nla_policy of the ethtool
    family. Make use of genetlink code attr validation and parsing, as well
    as allow dumping policies to user space.

    For every ETHTOOL_MSG_*_GET:
    - add 'ethnl_' prefix to policy name
    - add extern declaration in net/ethtool/netlink.h
    - wire up the policy & attr in ethtool_genl_ops[].
    - remove .request_policy and .max_attr from ethnl_request_ops.

    Obviously core only records the first "layer" of parsed attrs
    so we still need to parse the sub-attrs of the nested header
    attribute.

    v2:
    - merge of patches 1 and 2 from v1
    - remove stray empty lines in ops
    - also remove .max_attr

    Signed-off-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Jakub Kicinski
     

19 Aug, 2020

3 commits

  • The legacy ethtool userspace tool shows an error when no features could
    be changed. It's useful to have a netlink reply to be able to show this
    error when __netdev_update_features wasn't called, for example:

    1. ethtool -k eth0
    large-receive-offload: off
    2. ethtool -K eth0 rx-fcs on
    3. ethtool -K eth0 lro on
    Could not change any device features
    rx-lro: off [requested on]
    4. ethtool -K eth0 lro on
    # The output should be the same, but without this patch the kernel
    # doesn't send the reply, and ethtool is unable to detect the error.

    This commit makes ethtool-netlink always return a reply when requested,
    and it still avoids unnecessary calls to __netdev_update_features if the
    wanted features haven't changed.

    Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: Maxim Mikityanskiy
    Reviewed-by: Michal Kubecek
    Signed-off-by: David S. Miller

    Maxim Mikityanskiy
     
  • ethtool-netlink ignores dev->hw_features and may confuse the drivers by
    asking them to enable features not in the hw_features bitmask. For
    example:

    1. ethtool -k eth0
    tls-hw-tx-offload: off [fixed]
    2. ethtool -K eth0 tls-hw-tx-offload on
    tls-hw-tx-offload: on
    3. ethtool -k eth0
    tls-hw-tx-offload: on [fixed]

    Fitler out dev->hw_features from req_wanted to fix it and to resemble
    the legacy ethtool behavior.

    Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: Maxim Mikityanskiy
    Reviewed-by: Michal Kubecek
    Signed-off-by: David S. Miller

    Maxim Mikityanskiy
     
  • Currently, ethtool-netlink calculates new wanted bits as:
    (req_wanted & req_mask) | (old_active & ~req_mask)

    It completely discards the old wanted bits, so they are forgotten with
    the next ethtool command. Sample steps to reproduce:

    1. ethtool -k eth0
    tx-tcp-segmentation: on # TSO is on from the beginning
    2. ethtool -K eth0 tx off
    tx-tcp-segmentation: off [not requested]
    3. ethtool -k eth0
    tx-tcp-segmentation: off [requested on]
    4. ethtool -K eth0 rx off # Some change unrelated to TSO
    5. ethtool -k eth0
    tx-tcp-segmentation: off # "Wanted on" is forgotten

    This commit fixes it by changing the formula to:
    (req_wanted & req_mask) | (old_wanted & ~req_mask),
    where old_active was replaced by old_wanted to account for the wanted
    bits.

    The shortcut condition for the case where nothing was changed now
    compares wanted bitmasks, instead of wanted to active.

    Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request")
    Signed-off-by: Maxim Mikityanskiy
    Reviewed-by: Michal Kubecek
    Signed-off-by: David S. Miller

    Maxim Mikityanskiy
     

13 Mar, 2020

3 commits

  • Send ETHTOOL_MSG_FEATURES_NTF notification whenever network device features
    are modified using ETHTOOL_MSG_FEATURES_SET netlink message, ethtool ioctl
    request or any other way resulting in call to netdev_update_features() or
    netdev_change_features()

    Signed-off-by: Michal Kubecek
    Signed-off-by: David S. Miller

    Michal Kubecek
     
  • Implement FEATURES_SET netlink request to set network device features.
    These are traditionally set using ETHTOOL_SFEATURES ioctl request.

    Actual change is subject to netdev_change_features() sanity checks so that
    it can differ from what was requested. Unlike with most other SET requests,
    in addition to error code and optional extack, kernel provides an optional
    reply message (ETHTOOL_MSG_FEATURES_SET_REPLY) in the same format but with
    different semantics: information about difference between user request and
    actual result and difference between old and new state of dev->features.
    This reply message can be suppressed by setting ETHTOOL_FLAG_OMIT_REPLY
    flag in request header.

    Signed-off-by: Michal Kubecek
    Signed-off-by: David S. Miller

    Michal Kubecek
     
  • Implement FEATURES_GET request to get network device features. These are
    traditionally available via ETHTOOL_GFEATURES ioctl request.

    v2:
    - style cleanup suggested by Jakub Kicinski

    Signed-off-by: Michal Kubecek
    Reviewed-by: Jakub Kicinski
    Signed-off-by: David S. Miller

    Michal Kubecek