ethtool: add tx aggregation parameters
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>
This commit is contained in:
parent
9a06cce6e3
commit
31de284239
@ -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.
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user