• Michal Wilczynski's avatar
    ice: Implement devlink-rate API · 42c2eb6b
    Michal Wilczynski authored
    There is a need to support modification of Tx scheduler tree, in the
    ice driver. This will allow user to control Tx settings of each node in
    the internal hierarchy of nodes. As a result user will be able to use
    Hierarchy QoS implemented entirely in the hardware.
    
    This patch implemenents devlink-rate API. It also exports initial
    default hierarchy. It's mostly dictated by the fact that the tree
    can't be removed entirely, all we can do is enable the user to modify
    it. For example root node shouldn't ever be removed, also nodes that
    have children are off-limits.
    
    Example initial tree with 2 VF's:
    
    [root@fedora ~]# devlink port function rate show
    
    pci/0000:4b:00.0/node_27: type node parent node_26
    pci/0000:4b:00.0/node_26: type node parent node_0
    pci/0000:4b:00.0/node_34: type node parent node_33
    pci/0000:4b:00.0/node_33: type node parent node_32
    pci/0000:4b:00.0/node_32: type node parent node_16
    pci/0000:4b:00.0/node_19: type node parent node_18
    pci/0000:4b:00.0/node_18: type node parent node_17
    pci/0000:4b:00.0/node_17: type node parent node_16
    pci/0000:4b:00.0/node_21: type node parent node_20
    pci/0000:4b:00.0/node_20: type node parent node_3
    pci/0000:4b:00.0/node_14: type node parent node_5
    pci/0000:4b:00.0/node_5: type node parent node_3
    pci/0000:4b:00.0/node_13: type node parent node_4
    pci/0000:4b:00.0/node_12: type node parent node_4
    pci/0000:4b:00.0/node_11: type node parent node_4
    pci/0000:4b:00.0/node_10: type node parent node_4
    pci/0000:4b:00.0/node_9: type node parent node_4
    pci/0000:4b:00.0/node_8: type node parent node_4
    pci/0000:4b:00.0/node_7: type node parent node_4
    pci/0000:4b:00.0/node_6: type node parent node_4
    pci/0000:4b:00.0/node_4: type node parent node_3
    pci/0000:4b:00.0/node_3: type node parent node_16
    pci/0000:4b:00.0/node_16: type node parent node_15
    pci/0000:4b:00.0/node_15: type node parent node_0
    pci/0000:4b:00.0/node_2: type node parent node_1
    pci/0000:4b:00.0/node_1: type node parent node_0
    pci/0000:4b:00.0/node_0: type node
    pci/0000:4b:00.0/1: type leaf parent node_27
    pci/0000:4b:00.0/2: type leaf parent node_27
    
    Let me visualize part of the tree:
    
                        +---------+
                        |  node_0 |
                        +---------+
                             |
                        +----v----+
                        | node_26 |
                        +----+----+
                             |
                        +----v----+
                        | node_27 |
                        +----+----+
                             |
                    |-----------------|
               +----v----+       +----v----+
               |   VF 1  |       |   VF 2  |
               +----+----+       +----+----+
    
    So at this point there is a couple things that can be done.
    For example we could only assign parameters to VF's.
    
    [root@fedora ~]# devlink port function rate set pci/0000:4b:00.0/1 \
                     tx_max 5Gbps
    
    This would cap the VF 1 BW to 5Gbps.
    
    But let's say you would like to create a completely new branch.
    This can be done like this:
    
    [root@fedora ~]# devlink port function rate add \
                     pci/0000:4b:00.0/node_custom parent node_0
    [root@fedora ~]# devlink port function rate add \
                     pci/0000:4b:00.0/node_custom_1 parent node_custom
    [root@fedora ~]# devlink port function rate set \
                     pci/0000:4b:00.0/1 parent node_custom_1
    
    This creates a completely new branch and reassigns VF 1 to it.
    
    A number of parameters is supported per each node: tx_max, tx_share,
    tx_priority and tx_weight.
    Signed-off-by: default avatarMichal Wilczynski <michal.wilczynski@intel.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    42c2eb6b
ice_devlink.c 50.3 KB