]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ethtool: add tx aggregation parameters
authorDaniele Palmas <dnlplm@gmail.com>
Wed, 11 Jan 2023 13:05:18 +0000 (14:05 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Jan 2023 10:23:52 +0000 (10:23 +0000)
Add the following ethtool tx aggregation parameters:

ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES
Maximum size in bytes of a tx aggregated block of frames.

ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES
Maximum number of frames that can be aggregated into a block.

ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS
Time in usecs after the first packet arrival in an aggregated
block for the block to be sent.

Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ethtool-netlink.rst
include/linux/ethtool.h
include/uapi/linux/ethtool_netlink.h
net/ethtool/coalesce.c

index c59b542eb6936fd005f6f1d6639f6887062c1c1c..d345f5df248e60f8ae3a07854cc1364653303804 100644 (file)
@@ -1004,6 +1004,9 @@ Kernel response contents:
   ``ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL``  u32     rate sampling interval
   ``ETHTOOL_A_COALESCE_USE_CQE_TX``            bool    timer reset mode, Tx
   ``ETHTOOL_A_COALESCE_USE_CQE_RX``            bool    timer reset mode, Rx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES``     u32     max aggr size, Tx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES``    u32     max aggr packets, Tx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS``    u32     time (us), aggr, Tx
   ===========================================  ======  =======================
 
 Attributes are only included in reply if their value is not zero or the
@@ -1022,6 +1025,17 @@ each packet event resets the timer. In this mode timer is used to force
 the interrupt if queue goes idle, while busy queues depend on the packet
 limit to trigger interrupts.
 
+Tx aggregation consists of copying frames into a contiguous buffer so that they
+can be submitted as a single IO operation. ``ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES``
+describes the maximum size in bytes for the submitted buffer.
+``ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES`` describes the maximum number of frames
+that can be aggregated into a single buffer.
+``ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS`` describes the amount of time in usecs,
+counted since the first packet arrival in an aggregated block, after which the
+block should be sent.
+This feature is mainly of interest for specific USB devices which does not cope
+well with frequent small-sized URBs transmissions.
+
 COALESCE_SET
 ============
 
@@ -1055,6 +1069,9 @@ Request contents:
   ``ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL``  u32     rate sampling interval
   ``ETHTOOL_A_COALESCE_USE_CQE_TX``            bool    timer reset mode, Tx
   ``ETHTOOL_A_COALESCE_USE_CQE_RX``            bool    timer reset mode, Rx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES``     u32     max aggr size, Tx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES``    u32     max aggr packets, Tx
+  ``ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS``    u32     time (us), aggr, Tx
   ===========================================  ======  =======================
 
 Request is rejected if it attributes declared as unsupported by driver (i.e.
index d0da303f6634eaab568b75dab170596b34104a58..20d197693d34192ac7356b7bd79351b2e555fefe 100644 (file)
@@ -217,6 +217,9 @@ __ethtool_get_link_ksettings(struct net_device *dev,
 struct kernel_ethtool_coalesce {
        u8 use_cqe_mode_tx;
        u8 use_cqe_mode_rx;
+       u32 tx_aggr_max_bytes;
+       u32 tx_aggr_max_frames;
+       u32 tx_aggr_time_usecs;
 };
 
 /**
@@ -260,7 +263,10 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
 #define ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL  BIT(21)
 #define ETHTOOL_COALESCE_USE_CQE_RX            BIT(22)
 #define ETHTOOL_COALESCE_USE_CQE_TX            BIT(23)
-#define ETHTOOL_COALESCE_ALL_PARAMS            GENMASK(23, 0)
+#define ETHTOOL_COALESCE_TX_AGGR_MAX_BYTES     BIT(24)
+#define ETHTOOL_COALESCE_TX_AGGR_MAX_FRAMES    BIT(25)
+#define ETHTOOL_COALESCE_TX_AGGR_TIME_USECS    BIT(26)
+#define ETHTOOL_COALESCE_ALL_PARAMS            GENMASK(26, 0)
 
 #define ETHTOOL_COALESCE_USECS                                         \
        (ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_TX_USECS)
@@ -288,6 +294,10 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
         ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL)
 #define ETHTOOL_COALESCE_USE_CQE                                       \
        (ETHTOOL_COALESCE_USE_CQE_RX | ETHTOOL_COALESCE_USE_CQE_TX)
+#define ETHTOOL_COALESCE_TX_AGGR               \
+       (ETHTOOL_COALESCE_TX_AGGR_MAX_BYTES |   \
+        ETHTOOL_COALESCE_TX_AGGR_MAX_FRAMES |  \
+        ETHTOOL_COALESCE_TX_AGGR_TIME_USECS)
 
 #define ETHTOOL_STAT_NOT_SET   (~0ULL)
 
index 75b3d6d476ffc77363eec08a1b22095f292afd8c..83557cae0b87d6acd4a42824a9f1c8b081013cc0 100644 (file)
@@ -406,6 +406,9 @@ enum {
        ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL,        /* u32 */
        ETHTOOL_A_COALESCE_USE_CQE_MODE_TX,             /* u8 */
        ETHTOOL_A_COALESCE_USE_CQE_MODE_RX,             /* u8 */
+       ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES,           /* u32 */
+       ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES,          /* u32 */
+       ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS,          /* u32 */
 
        /* add new constants above here */
        __ETHTOOL_A_COALESCE_CNT,
index 487bdf345541ad1966702e600335a015edd9feda..e405b47f7eed6f8e9b12180d656970ade1175ec3 100644 (file)
@@ -105,7 +105,10 @@ static int coalesce_reply_size(const struct ethnl_req_info *req_base,
               nla_total_size(sizeof(u32)) +    /* _TX_MAX_FRAMES_HIGH */
               nla_total_size(sizeof(u32)) +    /* _RATE_SAMPLE_INTERVAL */
               nla_total_size(sizeof(u8)) +     /* _USE_CQE_MODE_TX */
-              nla_total_size(sizeof(u8));      /* _USE_CQE_MODE_RX */
+              nla_total_size(sizeof(u8)) +     /* _USE_CQE_MODE_RX */
+              nla_total_size(sizeof(u32)) +    /* _TX_AGGR_MAX_BYTES */
+              nla_total_size(sizeof(u32)) +    /* _TX_AGGR_MAX_FRAMES */
+              nla_total_size(sizeof(u32));     /* _TX_AGGR_TIME_USECS */
 }
 
 static bool coalesce_put_u32(struct sk_buff *skb, u16 attr_type, u32 val,
@@ -180,7 +183,13 @@ static int coalesce_fill_reply(struct sk_buff *skb,
            coalesce_put_bool(skb, ETHTOOL_A_COALESCE_USE_CQE_MODE_TX,
                              kcoal->use_cqe_mode_tx, supported) ||
            coalesce_put_bool(skb, ETHTOOL_A_COALESCE_USE_CQE_MODE_RX,
-                             kcoal->use_cqe_mode_rx, supported))
+                             kcoal->use_cqe_mode_rx, supported) ||
+           coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES,
+                            kcoal->tx_aggr_max_bytes, supported) ||
+           coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES,
+                            kcoal->tx_aggr_max_frames, supported) ||
+           coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS,
+                            kcoal->tx_aggr_time_usecs, supported))
                return -EMSGSIZE;
 
        return 0;
@@ -227,6 +236,9 @@ const struct nla_policy ethnl_coalesce_set_policy[] = {
        [ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL] = { .type = NLA_U32 },
        [ETHTOOL_A_COALESCE_USE_CQE_MODE_TX]    = NLA_POLICY_MAX(NLA_U8, 1),
        [ETHTOOL_A_COALESCE_USE_CQE_MODE_RX]    = NLA_POLICY_MAX(NLA_U8, 1),
+       [ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES] = { .type = NLA_U32 },
+       [ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES] = { .type = NLA_U32 },
+       [ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS] = { .type = NLA_U32 },
 };
 
 int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
@@ -321,6 +333,12 @@ int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
                        tb[ETHTOOL_A_COALESCE_USE_CQE_MODE_TX], &mod);
        ethnl_update_u8(&kernel_coalesce.use_cqe_mode_rx,
                        tb[ETHTOOL_A_COALESCE_USE_CQE_MODE_RX], &mod);
+       ethnl_update_u32(&kernel_coalesce.tx_aggr_max_bytes,
+                        tb[ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES], &mod);
+       ethnl_update_u32(&kernel_coalesce.tx_aggr_max_frames,
+                        tb[ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES], &mod);
+       ethnl_update_u32(&kernel_coalesce.tx_aggr_time_usecs,
+                        tb[ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS], &mod);
        ret = 0;
        if (!mod)
                goto out_ops;