Skip to content
  • John Fastabend's avatar
    ixgbe: DCB, use multiple Tx rings per traffic class · e5b64635
    John Fastabend authored
    
    
    This enables multiple {Tx|Rx} rings per traffic class while in DCB
    mode. In order to get this working as expected the tc_to_tx net
    device mapping is configured as well as the prio_tc_map.
    
    skb priorities are mapped across a range of queue pairs to get
    a distribution per traffic class. The maximum number of
    queue pairs used while in DCB mode is capped at 64. The hardware
    max is actually 128 queues but 64 is sufficient for now and
    allocating more seemed a bit excessive. It is easy enough to
    increase the cap later if need be.
    
    To get the 802.1Q priority tags inserted correctly ixgbe was
    previously using the skb queue_mapping field to directly set
    the 802.1Q priority. This no longer works because we have removed
    the 1:1 mapping between queues and traffic class. Each ring
    is aligned with an 802.1Qaz traffic class so here we add an
    extra field to the ring struct to identify the 802.1Q traffic
    class. This uses an extra byte of the ixgbe_ring struct
    fortunately there was a 2byte hole,
    
    struct ixgbe_ring {
            void *                     desc;                 /*     0     8 */
            struct device *            dev;                  /*     8     8 */
            struct net_device *        netdev;               /*    16     8 */
            union {
                    struct ixgbe_tx_buffer * tx_buffer_info; /*           8 */
                    struct ixgbe_rx_buffer * rx_buffer_info; /*           8 */
            };                                               /*    24     8 */
            long unsigned int          state;                /*    32     8 */
            u8                         atr_sample_rate;      /*    40     1 */
            u8                         atr_count;            /*    41     1 */
            u16                        count;                /*    42     2 */
            u16                        rx_buf_len;           /*    44     2 */
            u16                        next_to_use;          /*    46     2 */
            u16                        next_to_clean;        /*    48     2 */
            u8                         queue_index;          /*    50     1 */
            u8                         reg_idx;              /*    51     1 */
            u16                        work_limit;           /*    52     2 */
    
            /* XXX 2 bytes hole, try to pack */
    
            u8 *                       tail;                 /*    56     8 */
            /* --- cacheline 1 boundary (64 bytes) --- */
    
    Now we can set the VLAN priority directly and it will be
    correct. User space can indicate the 802.1Qaz priority
    using the SO_PRIORITY setsocket() option and QOS layer will
    steer the skb to the correct rings. Additionally using
    the multiq qdisc with a queue_mapping action works as
    well.
    
    Signed-off-by: default avatarJohn Fastabend <john.r.fastabend@intel.com>
    Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    e5b64635