Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'add-ethtool-coalesce_rx_cqe_frames-nsecs-and-use-it-in-mana-driver'

Haiyang Zhang says:

====================
add ethtool COALESCE_RX_CQE_FRAMES/NSECS and use it in MANA driver

Add two parameters for drivers supporting Rx CQE Coalescing.

ETHTOOL_A_COALESCE_RX_CQE_FRAMES:
Maximum number of frames that can be coalesced into a CQE or
writeback.

ETHTOOL_A_COALESCE_RX_CQE_NSECS:
Max time in nanoseconds after the first packet arrival in a
coalesced CQE or writeback to be sent.

Also implement it in MANA driver with the new parameter and
counters.
====================

Link: https://patch.msgid.link/20260317191826.1346111-1-haiyangz@linux.microsoft.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+183 -38
+8
Documentation/netlink/specs/ethtool.yaml
··· 857 857 name: tx-profile 858 858 type: nest 859 859 nested-attributes: profile 860 + - 861 + name: rx-cqe-frames 862 + type: u32 863 + - 864 + name: rx-cqe-nsecs 865 + type: u32 860 866 861 867 - 862 868 name: pause-stat ··· 2259 2253 - tx-aggr-time-usecs 2260 2254 - rx-profile 2261 2255 - tx-profile 2256 + - rx-cqe-frames 2257 + - rx-cqe-nsecs 2262 2258 dump: *coalesce-get-op 2263 2259 - 2264 2260 name: coalesce-set
+11
Documentation/networking/ethtool-netlink.rst
··· 1076 1076 ``ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS`` u32 time (us), aggr, Tx 1077 1077 ``ETHTOOL_A_COALESCE_RX_PROFILE`` nested profile of DIM, Rx 1078 1078 ``ETHTOOL_A_COALESCE_TX_PROFILE`` nested profile of DIM, Tx 1079 + ``ETHTOOL_A_COALESCE_RX_CQE_FRAMES`` u32 max packets, Rx CQE 1080 + ``ETHTOOL_A_COALESCE_RX_CQE_NSECS`` u32 delay (ns), Rx CQE 1079 1081 =========================================== ====== ======================= 1080 1082 1081 1083 Attributes are only included in reply if their value is not zero or the ··· 1110 1108 ``ETHTOOL_A_COALESCE_RX_PROFILE`` and ``ETHTOOL_A_COALESCE_TX_PROFILE`` refer 1111 1109 to DIM parameters, see `Generic Network Dynamic Interrupt Moderation (Net DIM) 1112 1110 <https://www.kernel.org/doc/Documentation/networking/net_dim.rst>`_. 1111 + 1112 + Rx CQE coalescing allows multiple received packets to be coalesced into a 1113 + single Completion Queue Entry (CQE) or descriptor writeback. 1114 + ``ETHTOOL_A_COALESCE_RX_CQE_FRAMES`` describes the maximum number of 1115 + frames that can be coalesced into a CQE or writeback. 1116 + ``ETHTOOL_A_COALESCE_RX_CQE_NSECS`` describes max time in nanoseconds after 1117 + the first packet arrival in a coalesced CQE or writeback to be sent. 1113 1118 1114 1119 COALESCE_SET 1115 1120 ============ ··· 1156 1147 ``ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS`` u32 time (us), aggr, Tx 1157 1148 ``ETHTOOL_A_COALESCE_RX_PROFILE`` nested profile of DIM, Rx 1158 1149 ``ETHTOOL_A_COALESCE_TX_PROFILE`` nested profile of DIM, Tx 1150 + ``ETHTOOL_A_COALESCE_RX_CQE_FRAMES`` u32 max packets, Rx CQE 1151 + ``ETHTOOL_A_COALESCE_RX_CQE_NSECS`` u32 delay (ns), Rx CQE 1159 1152 =========================================== ====== ======================= 1160 1153 1161 1154 Request is rejected if it attributes declared as unsupported by driver (i.e.
+60 -28
drivers/net/ethernet/microsoft/mana/mana_en.c
··· 1365 1365 sizeof(resp)); 1366 1366 1367 1367 req->hdr.req.msg_version = GDMA_MESSAGE_V2; 1368 + req->hdr.resp.msg_version = GDMA_MESSAGE_V2; 1368 1369 1369 1370 req->vport = apc->port_handle; 1370 1371 req->num_indir_entries = apc->indir_table_sz; ··· 1377 1376 req->update_hashkey = update_key; 1378 1377 req->update_indir_tab = update_tab; 1379 1378 req->default_rxobj = apc->default_rxobj; 1380 - req->cqe_coalescing_enable = 0; 1379 + 1380 + if (rx != TRI_STATE_FALSE) 1381 + req->cqe_coalescing_enable = apc->cqe_coalescing_enable; 1381 1382 1382 1383 if (update_key) 1383 1384 memcpy(&req->hashkey, apc->hashkey, MANA_HASH_KEY_SIZE); ··· 1408 1405 netdev_err(ndev, "vPort RX configuration failed: 0x%x\n", 1409 1406 resp.hdr.status); 1410 1407 err = -EPROTO; 1408 + goto out; 1411 1409 } 1410 + 1411 + if (resp.hdr.response.msg_version >= GDMA_MESSAGE_V2) 1412 + apc->cqe_coalescing_timeout_ns = 1413 + resp.cqe_coalescing_timeout_ns; 1412 1414 1413 1415 netdev_info(ndev, "Configured steering vPort %llu entries %u\n", 1414 1416 apc->port_handle, apc->indir_table_sz); ··· 1923 1915 } 1924 1916 1925 1917 static void mana_rx_skb(void *buf_va, bool from_pool, 1926 - struct mana_rxcomp_oob *cqe, struct mana_rxq *rxq) 1918 + struct mana_rxcomp_oob *cqe, struct mana_rxq *rxq, 1919 + int i) 1927 1920 { 1928 1921 struct mana_stats_rx *rx_stats = &rxq->stats; 1929 1922 struct net_device *ndev = rxq->ndev; 1930 - uint pkt_len = cqe->ppi[0].pkt_len; 1923 + uint pkt_len = cqe->ppi[i].pkt_len; 1931 1924 u16 rxq_idx = rxq->rxq_idx; 1932 1925 struct napi_struct *napi; 1933 1926 struct xdp_buff xdp = {}; ··· 1972 1963 } 1973 1964 1974 1965 if (cqe->rx_hashtype != 0 && (ndev->features & NETIF_F_RXHASH)) { 1975 - hash_value = cqe->ppi[0].pkt_hash; 1966 + hash_value = cqe->ppi[i].pkt_hash; 1976 1967 1977 1968 if (cqe->rx_hashtype & MANA_HASH_L4) 1978 1969 skb_set_hash(skb, hash_value, PKT_HASH_TYPE_L4); ··· 2107 2098 struct mana_recv_buf_oob *rxbuf_oob; 2108 2099 struct mana_port_context *apc; 2109 2100 struct device *dev = gc->dev; 2101 + bool coalesced = false; 2110 2102 void *old_buf = NULL; 2111 2103 u32 curr, pktlen; 2112 2104 bool old_fp; 2105 + int i; 2113 2106 2114 2107 apc = netdev_priv(ndev); 2115 2108 ··· 2123 2112 ++ndev->stats.rx_dropped; 2124 2113 rxbuf_oob = &rxq->rx_oobs[rxq->buf_index]; 2125 2114 netdev_warn_once(ndev, "Dropped a truncated packet\n"); 2126 - goto drop; 2115 + 2116 + mana_move_wq_tail(rxq->gdma_rq, 2117 + rxbuf_oob->wqe_inf.wqe_size_in_bu); 2118 + mana_post_pkt_rxq(rxq); 2119 + return; 2127 2120 2128 2121 case CQE_RX_COALESCED_4: 2129 - netdev_err(ndev, "RX coalescing is unsupported\n"); 2130 - apc->eth_stats.rx_coalesced_err++; 2131 - return; 2122 + coalesced = true; 2123 + break; 2132 2124 2133 2125 case CQE_RX_OBJECT_FENCE: 2134 2126 complete(&rxq->fence_event); ··· 2144 2130 return; 2145 2131 } 2146 2132 2147 - pktlen = oob->ppi[0].pkt_len; 2133 + for (i = 0; i < MANA_RXCOMP_OOB_NUM_PPI; i++) { 2134 + old_buf = NULL; 2135 + pktlen = oob->ppi[i].pkt_len; 2136 + if (pktlen == 0) 2137 + break; 2148 2138 2149 - if (pktlen == 0) { 2150 - /* data packets should never have packetlength of zero */ 2151 - netdev_err(ndev, "RX pkt len=0, rq=%u, cq=%u, rxobj=0x%llx\n", 2152 - rxq->gdma_id, cq->gdma_id, rxq->rxobj); 2153 - return; 2139 + curr = rxq->buf_index; 2140 + rxbuf_oob = &rxq->rx_oobs[curr]; 2141 + WARN_ON_ONCE(rxbuf_oob->wqe_inf.wqe_size_in_bu != 1); 2142 + 2143 + mana_refill_rx_oob(dev, rxq, rxbuf_oob, &old_buf, &old_fp); 2144 + 2145 + /* Unsuccessful refill will have old_buf == NULL. 2146 + * In this case, mana_rx_skb() will drop the packet. 2147 + */ 2148 + mana_rx_skb(old_buf, old_fp, oob, rxq, i); 2149 + 2150 + mana_move_wq_tail(rxq->gdma_rq, 2151 + rxbuf_oob->wqe_inf.wqe_size_in_bu); 2152 + 2153 + mana_post_pkt_rxq(rxq); 2154 + 2155 + if (!coalesced) 2156 + break; 2154 2157 } 2155 2158 2156 - curr = rxq->buf_index; 2157 - rxbuf_oob = &rxq->rx_oobs[curr]; 2158 - WARN_ON_ONCE(rxbuf_oob->wqe_inf.wqe_size_in_bu != 1); 2159 - 2160 - mana_refill_rx_oob(dev, rxq, rxbuf_oob, &old_buf, &old_fp); 2161 - 2162 - /* Unsuccessful refill will have old_buf == NULL. 2163 - * In this case, mana_rx_skb() will drop the packet. 2159 + /* Collect coalesced CQE count based on packets processed. 2160 + * Coalesced CQEs have at least 2 packets, so index is i - 2. 2164 2161 */ 2165 - mana_rx_skb(old_buf, old_fp, oob, rxq); 2166 - 2167 - drop: 2168 - mana_move_wq_tail(rxq->gdma_rq, rxbuf_oob->wqe_inf.wqe_size_in_bu); 2169 - 2170 - mana_post_pkt_rxq(rxq); 2162 + if (i > 1) { 2163 + u64_stats_update_begin(&rxq->stats.syncp); 2164 + rxq->stats.coalesced_cqe[i - 2]++; 2165 + u64_stats_update_end(&rxq->stats.syncp); 2166 + } else if (!i && !pktlen) { 2167 + u64_stats_update_begin(&rxq->stats.syncp); 2168 + rxq->stats.pkt_len0_err++; 2169 + u64_stats_update_end(&rxq->stats.syncp); 2170 + netdev_err_once(ndev, 2171 + "RX pkt len=0, rq=%u, cq=%u, rxobj=0x%llx\n", 2172 + rxq->gdma_id, cq->gdma_id, rxq->rxobj); 2173 + } 2171 2174 } 2172 2175 2173 2176 static void mana_poll_rx_cq(struct mana_cq *cq) ··· 3363 3332 apc->port_handle = INVALID_MANA_HANDLE; 3364 3333 apc->pf_filter_handle = INVALID_MANA_HANDLE; 3365 3334 apc->port_idx = port_idx; 3335 + apc->cqe_coalescing_enable = 0; 3366 3336 3367 3337 mutex_init(&apc->vport_mutex); 3368 3338 apc->vport_use_count = 0;
+71 -4
drivers/net/ethernet/microsoft/mana/mana_ethtool.c
··· 20 20 tx_cqe_unknown_type)}, 21 21 {"tx_linear_pkt_cnt", offsetof(struct mana_ethtool_stats, 22 22 tx_linear_pkt_cnt)}, 23 - {"rx_coalesced_err", offsetof(struct mana_ethtool_stats, 24 - rx_coalesced_err)}, 25 23 {"rx_cqe_unknown_type", offsetof(struct mana_ethtool_stats, 26 24 rx_cqe_unknown_type)}, 27 25 }; ··· 149 151 { 150 152 struct mana_port_context *apc = netdev_priv(ndev); 151 153 unsigned int num_queues = apc->num_queues; 152 - int i; 154 + int i, j; 153 155 154 156 if (stringset != ETH_SS_STATS) 155 157 return; ··· 168 170 ethtool_sprintf(&data, "rx_%d_xdp_drop", i); 169 171 ethtool_sprintf(&data, "rx_%d_xdp_tx", i); 170 172 ethtool_sprintf(&data, "rx_%d_xdp_redirect", i); 173 + ethtool_sprintf(&data, "rx_%d_pkt_len0_err", i); 174 + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; j++) 175 + ethtool_sprintf(&data, "rx_%d_coalesced_cqe_%d", i, j + 2); 171 176 } 172 177 173 178 for (i = 0; i < num_queues; i++) { ··· 204 203 u64 xdp_xmit; 205 204 u64 xdp_drop; 206 205 u64 xdp_tx; 206 + u64 pkt_len0_err; 207 + u64 coalesced_cqe[MANA_RXCOMP_OOB_NUM_PPI - 1]; 207 208 u64 tso_packets; 208 209 u64 tso_bytes; 209 210 u64 tso_inner_packets; ··· 214 211 u64 short_pkt_fmt; 215 212 u64 csum_partial; 216 213 u64 mana_map_err; 217 - int q, i = 0; 214 + int q, i = 0, j; 218 215 219 216 if (!apc->port_is_up) 220 217 return; ··· 244 241 xdp_drop = rx_stats->xdp_drop; 245 242 xdp_tx = rx_stats->xdp_tx; 246 243 xdp_redirect = rx_stats->xdp_redirect; 244 + pkt_len0_err = rx_stats->pkt_len0_err; 245 + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; j++) 246 + coalesced_cqe[j] = rx_stats->coalesced_cqe[j]; 247 247 } while (u64_stats_fetch_retry(&rx_stats->syncp, start)); 248 248 249 249 data[i++] = packets; ··· 254 248 data[i++] = xdp_drop; 255 249 data[i++] = xdp_tx; 256 250 data[i++] = xdp_redirect; 251 + data[i++] = pkt_len0_err; 252 + for (j = 0; j < MANA_RXCOMP_OOB_NUM_PPI - 1; j++) 253 + data[i++] = coalesced_cqe[j]; 257 254 } 258 255 259 256 for (q = 0; q < num_queues; q++) { ··· 399 390 channel->combined_count = apc->num_queues; 400 391 } 401 392 393 + #define MANA_RX_CQE_NSEC_DEF 2048 394 + static int mana_get_coalesce(struct net_device *ndev, 395 + struct ethtool_coalesce *ec, 396 + struct kernel_ethtool_coalesce *kernel_coal, 397 + struct netlink_ext_ack *extack) 398 + { 399 + struct mana_port_context *apc = netdev_priv(ndev); 400 + 401 + kernel_coal->rx_cqe_frames = 402 + apc->cqe_coalescing_enable ? MANA_RXCOMP_OOB_NUM_PPI : 1; 403 + 404 + kernel_coal->rx_cqe_nsecs = apc->cqe_coalescing_timeout_ns; 405 + 406 + /* Return the default timeout value for old FW not providing 407 + * this value. 408 + */ 409 + if (apc->port_is_up && apc->cqe_coalescing_enable && 410 + !kernel_coal->rx_cqe_nsecs) 411 + kernel_coal->rx_cqe_nsecs = MANA_RX_CQE_NSEC_DEF; 412 + 413 + return 0; 414 + } 415 + 416 + static int mana_set_coalesce(struct net_device *ndev, 417 + struct ethtool_coalesce *ec, 418 + struct kernel_ethtool_coalesce *kernel_coal, 419 + struct netlink_ext_ack *extack) 420 + { 421 + struct mana_port_context *apc = netdev_priv(ndev); 422 + u8 saved_cqe_coalescing_enable; 423 + int err; 424 + 425 + if (kernel_coal->rx_cqe_frames != 1 && 426 + kernel_coal->rx_cqe_frames != MANA_RXCOMP_OOB_NUM_PPI) { 427 + NL_SET_ERR_MSG_FMT(extack, 428 + "rx-frames must be 1 or %u, got %u", 429 + MANA_RXCOMP_OOB_NUM_PPI, 430 + kernel_coal->rx_cqe_frames); 431 + return -EINVAL; 432 + } 433 + 434 + saved_cqe_coalescing_enable = apc->cqe_coalescing_enable; 435 + apc->cqe_coalescing_enable = 436 + kernel_coal->rx_cqe_frames == MANA_RXCOMP_OOB_NUM_PPI; 437 + 438 + if (!apc->port_is_up) 439 + return 0; 440 + 441 + err = mana_config_rss(apc, TRI_STATE_TRUE, false, false); 442 + if (err) 443 + apc->cqe_coalescing_enable = saved_cqe_coalescing_enable; 444 + 445 + return err; 446 + } 447 + 402 448 static int mana_set_channels(struct net_device *ndev, 403 449 struct ethtool_channels *channels) 404 450 { ··· 574 510 } 575 511 576 512 const struct ethtool_ops mana_ethtool_ops = { 513 + .supported_coalesce_params = ETHTOOL_COALESCE_RX_CQE_FRAMES, 577 514 .get_ethtool_stats = mana_get_ethtool_stats, 578 515 .get_sset_count = mana_get_sset_count, 579 516 .get_strings = mana_get_strings, ··· 585 520 .set_rxfh = mana_set_rxfh, 586 521 .get_channels = mana_get_channels, 587 522 .set_channels = mana_set_channels, 523 + .get_coalesce = mana_get_coalesce, 524 + .set_coalesce = mana_set_coalesce, 588 525 .get_ringparam = mana_get_ringparam, 589 526 .set_ringparam = mana_set_ringparam, 590 527 .get_link_ksettings = mana_get_link_ksettings,
+5 -1
include/linux/ethtool.h
··· 332 332 u32 tx_aggr_max_bytes; 333 333 u32 tx_aggr_max_frames; 334 334 u32 tx_aggr_time_usecs; 335 + u32 rx_cqe_frames; 336 + u32 rx_cqe_nsecs; 335 337 }; 336 338 337 339 /** ··· 382 380 #define ETHTOOL_COALESCE_TX_AGGR_TIME_USECS BIT(26) 383 381 #define ETHTOOL_COALESCE_RX_PROFILE BIT(27) 384 382 #define ETHTOOL_COALESCE_TX_PROFILE BIT(28) 385 - #define ETHTOOL_COALESCE_ALL_PARAMS GENMASK(28, 0) 383 + #define ETHTOOL_COALESCE_RX_CQE_FRAMES BIT(29) 384 + #define ETHTOOL_COALESCE_RX_CQE_NSECS BIT(30) 385 + #define ETHTOOL_COALESCE_ALL_PARAMS GENMASK(30, 0) 386 386 387 387 #define ETHTOOL_COALESCE_USECS \ 388 388 (ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_TX_USECS)
+13 -4
include/net/mana/mana.h
··· 61 61 62 62 #define MAX_PORTS_IN_MANA_DEV 256 63 63 64 + /* Maximum number of packets per coalesced CQE */ 65 + #define MANA_RXCOMP_OOB_NUM_PPI 4 66 + 64 67 /* Update this count whenever the respective structures are changed */ 65 - #define MANA_STATS_RX_COUNT 5 68 + #define MANA_STATS_RX_COUNT (6 + MANA_RXCOMP_OOB_NUM_PPI - 1) 66 69 #define MANA_STATS_TX_COUNT 11 67 70 68 71 #define MANA_RX_FRAG_ALIGNMENT 64 ··· 76 73 u64 xdp_drop; 77 74 u64 xdp_tx; 78 75 u64 xdp_redirect; 76 + u64 pkt_len0_err; 77 + u64 coalesced_cqe[MANA_RXCOMP_OOB_NUM_PPI - 1]; 79 78 struct u64_stats_sync syncp; 80 79 }; 81 80 ··· 232 227 u32 pkt_hash; 233 228 }; /* HW DATA */ 234 229 235 - #define MANA_RXCOMP_OOB_NUM_PPI 4 236 - 237 230 /* Receive completion OOB */ 238 231 struct mana_rxcomp_oob { 239 232 struct mana_cqe_header cqe_hdr; ··· 381 378 u64 tx_cqe_err; 382 379 u64 tx_cqe_unknown_type; 383 380 u64 tx_linear_pkt_cnt; 384 - u64 rx_coalesced_err; 385 381 u64 rx_cqe_unknown_type; 386 382 }; 387 383 ··· 558 556 559 557 bool port_is_up; 560 558 bool port_st_save; /* Saved port state */ 559 + 560 + u8 cqe_coalescing_enable; 561 + u32 cqe_coalescing_timeout_ns; 561 562 562 563 struct mana_ethtool_stats eth_stats; 563 564 ··· 907 902 908 903 struct mana_cfg_rx_steer_resp { 909 904 struct gdma_resp_hdr hdr; 905 + 906 + /* V2 */ 907 + u32 cqe_coalescing_timeout_ns; 908 + u32 reserved1; 910 909 }; /* HW DATA */ 911 910 912 911 /* Register HW vPort */
+13 -1
net/ethtool/coalesce.c
··· 118 118 nla_total_size(sizeof(u32)) + /* _TX_AGGR_MAX_BYTES */ 119 119 nla_total_size(sizeof(u32)) + /* _TX_AGGR_MAX_FRAMES */ 120 120 nla_total_size(sizeof(u32)) + /* _TX_AGGR_TIME_USECS */ 121 + nla_total_size(sizeof(u32)) + /* _RX_CQE_FRAMES */ 122 + nla_total_size(sizeof(u32)) + /* _RX_CQE_NSECS */ 121 123 total_modersz * 2; /* _{R,T}X_PROFILE */ 122 124 } 123 125 ··· 271 269 coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES, 272 270 kcoal->tx_aggr_max_frames, supported) || 273 271 coalesce_put_u32(skb, ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS, 274 - kcoal->tx_aggr_time_usecs, supported)) 272 + kcoal->tx_aggr_time_usecs, supported) || 273 + coalesce_put_u32(skb, ETHTOOL_A_COALESCE_RX_CQE_FRAMES, 274 + kcoal->rx_cqe_frames, supported) || 275 + coalesce_put_u32(skb, ETHTOOL_A_COALESCE_RX_CQE_NSECS, 276 + kcoal->rx_cqe_nsecs, supported)) 275 277 return -EMSGSIZE; 276 278 277 279 if (!req_base->dev || !req_base->dev->irq_moder) ··· 344 338 [ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES] = { .type = NLA_U32 }, 345 339 [ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES] = { .type = NLA_U32 }, 346 340 [ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS] = { .type = NLA_U32 }, 341 + [ETHTOOL_A_COALESCE_RX_CQE_FRAMES] = { .type = NLA_U32 }, 342 + [ETHTOOL_A_COALESCE_RX_CQE_NSECS] = { .type = NLA_U32 }, 347 343 [ETHTOOL_A_COALESCE_RX_PROFILE] = 348 344 NLA_POLICY_NESTED(coalesce_profile_policy), 349 345 [ETHTOOL_A_COALESCE_TX_PROFILE] = ··· 578 570 tb[ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES], &mod); 579 571 ethnl_update_u32(&kernel_coalesce.tx_aggr_time_usecs, 580 572 tb[ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS], &mod); 573 + ethnl_update_u32(&kernel_coalesce.rx_cqe_frames, 574 + tb[ETHTOOL_A_COALESCE_RX_CQE_FRAMES], &mod); 575 + ethnl_update_u32(&kernel_coalesce.rx_cqe_nsecs, 576 + tb[ETHTOOL_A_COALESCE_RX_CQE_NSECS], &mod); 581 577 582 578 if (dev->irq_moder && dev->irq_moder->profile_flags & DIM_PROFILE_RX) { 583 579 ret = ethnl_update_profile(dev, &dev->irq_moder->rx_profile,