ethtool: add two coalesce attributes for CQE mode
Currently, there are many drivers who support CQE mode configuration, some configure it as a fixed when initialized, some provide an interface to change it by ethtool private flags. In order to make it more generic, add two new 'ETHTOOL_A_COALESCE_USE_CQE_TX' and 'ETHTOOL_A_COALESCE_USE_CQE_RX' coalesce attributes, then these parameters can be accessed by ethtool netlink coalesce uAPI. Also add an new structure kernel_ethtool_coalesce, then the new parameter can be added into this struct. Signed-off-by: Yufeng Mo <moyufeng@huawei.com> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: hongrongxuan <hongrongxuan@huawei.com> Conflicts: net/ethtool/coalesce.c net/ethtool/netlink.h include/linux/ethtool.h
This commit is contained in:
parent
f7f663bb03
commit
69ccb372dc
|
@ -922,12 +922,25 @@ Kernel response contents:
|
|||
``ETHTOOL_A_COALESCE_TX_USECS_HIGH`` u32 delay (us), high Tx
|
||||
``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH`` u32 max packets, high Tx
|
||||
``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
|
||||
=========================================== ====== =======================
|
||||
|
||||
Attributes are only included in reply if their value is not zero or the
|
||||
corresponding bit in ``ethtool_ops::supported_coalesce_params`` is set (i.e.
|
||||
they are declared as supported by driver).
|
||||
|
||||
Timer reset mode (``ETHTOOL_A_COALESCE_USE_CQE_TX`` and
|
||||
``ETHTOOL_A_COALESCE_USE_CQE_RX``) controls the interaction between packet
|
||||
arrival and the various time based delay parameters. By default timers are
|
||||
expected to limit the max delay between any packet arrival/departure and a
|
||||
corresponding interrupt. In this mode timer should be started by packet
|
||||
arrival (sometimes delivery of previous interrupt) and reset when interrupt
|
||||
is delivered.
|
||||
Setting the appropriate attribute to 1 will enable ``CQE`` mode, where
|
||||
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.
|
||||
|
||||
COALESCE_SET
|
||||
============
|
||||
|
@ -960,6 +973,8 @@ Request contents:
|
|||
``ETHTOOL_A_COALESCE_TX_USECS_HIGH`` u32 delay (us), high Tx
|
||||
``ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH`` u32 max packets, high Tx
|
||||
``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
|
||||
=========================================== ====== =======================
|
||||
|
||||
Request is rejected if it attributes declared as unsupported by driver (i.e.
|
||||
|
|
|
@ -177,6 +177,11 @@ extern int
|
|||
__ethtool_get_link_ksettings(struct net_device *dev,
|
||||
struct ethtool_link_ksettings *link_ksettings);
|
||||
|
||||
struct kernel_ethtool_coalesce {
|
||||
u8 use_cqe_mode_tx;
|
||||
u8 use_cqe_mode_rx;
|
||||
};
|
||||
|
||||
/**
|
||||
* ethtool_intersect_link_masks - Given two link masks, AND them together
|
||||
* @dst: first mask and where result is stored
|
||||
|
@ -216,7 +221,9 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
#define ETHTOOL_COALESCE_TX_USECS_HIGH BIT(19)
|
||||
#define ETHTOOL_COALESCE_TX_MAX_FRAMES_HIGH BIT(20)
|
||||
#define ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL BIT(21)
|
||||
#define ETHTOOL_COALESCE_ALL_PARAMS GENMASK(21, 0)
|
||||
#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_USECS \
|
||||
(ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_TX_USECS)
|
||||
|
@ -229,6 +236,8 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
ETHTOOL_COALESCE_TX_MAX_FRAMES_IRQ)
|
||||
#define ETHTOOL_COALESCE_USE_ADAPTIVE \
|
||||
(ETHTOOL_COALESCE_USE_ADAPTIVE_RX | ETHTOOL_COALESCE_USE_ADAPTIVE_TX)
|
||||
#define ETHTOOL_COALESCE_USE_CQE \
|
||||
(ETHTOOL_COALESCE_USE_CQE_RX | ETHTOOL_COALESCE_USE_CQE_TX)
|
||||
|
||||
#define ETHTOOL_STAT_NOT_SET (~0ULL)
|
||||
|
||||
|
|
|
@ -360,6 +360,8 @@ enum {
|
|||
ETHTOOL_A_COALESCE_TX_USECS_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL, /* u32 */
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_TX, /* u8 */
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_RX, /* u8 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_COALESCE_CNT,
|
||||
|
|
|
@ -10,6 +10,7 @@ struct coalesce_req_info {
|
|||
struct coalesce_reply_data {
|
||||
struct ethnl_reply_data base;
|
||||
struct ethtool_coalesce coalesce;
|
||||
struct kernel_ethtool_coalesce kernel_coalesce;
|
||||
u32 supported_params;
|
||||
};
|
||||
|
||||
|
@ -123,7 +124,9 @@ static int coalesce_reply_size(const struct ethnl_req_info *req_base,
|
|||
nla_total_size(sizeof(u32)) + /* _RX_MAX_FRAMES_HIGH */
|
||||
nla_total_size(sizeof(u32)) + /* _TX_USECS_HIGH */
|
||||
nla_total_size(sizeof(u32)) + /* _TX_MAX_FRAMES_HIGH */
|
||||
nla_total_size(sizeof(u32)); /* _RATE_SAMPLE_INTERVAL */
|
||||
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 */
|
||||
}
|
||||
|
||||
static bool coalesce_put_u32(struct sk_buff *skb, u16 attr_type, u32 val,
|
||||
|
@ -147,6 +150,7 @@ static int coalesce_fill_reply(struct sk_buff *skb,
|
|||
const struct ethnl_reply_data *reply_base)
|
||||
{
|
||||
const struct coalesce_reply_data *data = COALESCE_REPDATA(reply_base);
|
||||
const struct kernel_ethtool_coalesce *kcoal = &data->kernel_coalesce;
|
||||
const struct ethtool_coalesce *coal = &data->coalesce;
|
||||
u32 supported = data->supported_params;
|
||||
|
||||
|
@ -193,7 +197,11 @@ static int coalesce_fill_reply(struct sk_buff *skb,
|
|||
coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH,
|
||||
coal->tx_max_coalesced_frames_high, supported) ||
|
||||
coalesce_put_u32(skb, ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL,
|
||||
coal->rate_sample_interval, supported))
|
||||
coal->rate_sample_interval, supported) ||
|
||||
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))
|
||||
return -EMSGSIZE;
|
||||
|
||||
return 0;
|
||||
|
@ -241,11 +249,14 @@ coalesce_set_policy[ETHTOOL_A_COALESCE_MAX + 1] = {
|
|||
[ETHTOOL_A_COALESCE_TX_USECS_HIGH] = { .type = NLA_U32 },
|
||||
[ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH] = { .type = NLA_U32 },
|
||||
[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),
|
||||
};
|
||||
|
||||
int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct nlattr *tb[ETHTOOL_A_COALESCE_MAX + 1];
|
||||
struct kernel_ethtool_coalesce kernel_coalesce = {};
|
||||
struct ethtool_coalesce coalesce = {};
|
||||
struct ethnl_req_info req_info = {};
|
||||
const struct ethtool_ops *ops;
|
||||
|
@ -334,6 +345,10 @@ int ethnl_set_coalesce(struct sk_buff *skb, struct genl_info *info)
|
|||
tb[ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH], &mod);
|
||||
ethnl_update_u32(&coalesce.rate_sample_interval,
|
||||
tb[ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL], &mod);
|
||||
ethnl_update_u8(&kernel_coalesce.use_cqe_mode_tx,
|
||||
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);
|
||||
ret = 0;
|
||||
if (!mod)
|
||||
goto out_ops;
|
||||
|
|
Loading…
Reference in New Issue