gve_ethtool.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. // SPDX-License-Identifier: (GPL-2.0 OR MIT)
  2. /* Google virtual Ethernet (gve) driver
  3. *
  4. * Copyright (C) 2015-2024 Google LLC
  5. */
  6. #include <linux/rtnetlink.h>
  7. #include "gve.h"
  8. #include "gve_adminq.h"
  9. #include "gve_dqo.h"
  10. #include "gve_utils.h"
  11. static void gve_get_drvinfo(struct net_device *netdev,
  12. struct ethtool_drvinfo *info)
  13. {
  14. struct gve_priv *priv = netdev_priv(netdev);
  15. strscpy(info->driver, gve_driver_name, sizeof(info->driver));
  16. strscpy(info->version, gve_version_str, sizeof(info->version));
  17. strscpy(info->bus_info, pci_name(priv->pdev), sizeof(info->bus_info));
  18. }
  19. static void gve_set_msglevel(struct net_device *netdev, u32 value)
  20. {
  21. struct gve_priv *priv = netdev_priv(netdev);
  22. priv->msg_enable = value;
  23. }
  24. static u32 gve_get_msglevel(struct net_device *netdev)
  25. {
  26. struct gve_priv *priv = netdev_priv(netdev);
  27. return priv->msg_enable;
  28. }
  29. /* For the following stats column string names, make sure the order
  30. * matches how it is filled in the code. For xdp_aborted, xdp_drop,
  31. * xdp_pass, xdp_tx, xdp_redirect, make sure it also matches the order
  32. * as declared in enum xdp_action inside file uapi/linux/bpf.h .
  33. */
  34. static const char gve_gstrings_main_stats[][ETH_GSTRING_LEN] = {
  35. "rx_packets", "rx_hsplit_pkt", "tx_packets", "rx_bytes",
  36. "tx_bytes", "rx_dropped", "tx_dropped", "tx_timeouts",
  37. "rx_skb_alloc_fail", "rx_buf_alloc_fail", "rx_desc_err_dropped_pkt",
  38. "rx_hsplit_unsplit_pkt",
  39. "interface_up_cnt", "interface_down_cnt", "reset_cnt",
  40. "page_alloc_fail", "dma_mapping_error", "stats_report_trigger_cnt",
  41. };
  42. static const char gve_gstrings_rx_stats[][ETH_GSTRING_LEN] = {
  43. "rx_posted_desc[%u]", "rx_completed_desc[%u]", "rx_consumed_desc[%u]",
  44. "rx_bytes[%u]", "rx_hsplit_bytes[%u]", "rx_cont_packet_cnt[%u]",
  45. "rx_frag_flip_cnt[%u]", "rx_frag_copy_cnt[%u]", "rx_frag_alloc_cnt[%u]",
  46. "rx_dropped_pkt[%u]", "rx_copybreak_pkt[%u]", "rx_copied_pkt[%u]",
  47. "rx_queue_drop_cnt[%u]", "rx_no_buffers_posted[%u]",
  48. "rx_drops_packet_over_mru[%u]", "rx_drops_invalid_checksum[%u]",
  49. "rx_xdp_aborted[%u]", "rx_xdp_drop[%u]", "rx_xdp_pass[%u]",
  50. "rx_xdp_tx[%u]", "rx_xdp_redirect[%u]",
  51. "rx_xdp_tx_errors[%u]", "rx_xdp_redirect_errors[%u]", "rx_xdp_alloc_fails[%u]",
  52. };
  53. static const char gve_gstrings_tx_stats[][ETH_GSTRING_LEN] = {
  54. "tx_posted_desc[%u]", "tx_completed_desc[%u]", "tx_consumed_desc[%u]", "tx_bytes[%u]",
  55. "tx_wake[%u]", "tx_stop[%u]", "tx_event_counter[%u]",
  56. "tx_dma_mapping_error[%u]", "tx_xsk_wakeup[%u]",
  57. "tx_xsk_done[%u]", "tx_xsk_sent[%u]", "tx_xdp_xmit[%u]", "tx_xdp_xmit_errors[%u]"
  58. };
  59. static const char gve_gstrings_adminq_stats[][ETH_GSTRING_LEN] = {
  60. "adminq_prod_cnt", "adminq_cmd_fail", "adminq_timeouts",
  61. "adminq_describe_device_cnt", "adminq_cfg_device_resources_cnt",
  62. "adminq_register_page_list_cnt", "adminq_unregister_page_list_cnt",
  63. "adminq_create_tx_queue_cnt", "adminq_create_rx_queue_cnt",
  64. "adminq_destroy_tx_queue_cnt", "adminq_destroy_rx_queue_cnt",
  65. "adminq_dcfg_device_resources_cnt", "adminq_set_driver_parameter_cnt",
  66. "adminq_report_stats_cnt", "adminq_report_link_speed_cnt", "adminq_get_ptype_map_cnt",
  67. "adminq_query_flow_rules", "adminq_cfg_flow_rule", "adminq_cfg_rss_cnt",
  68. "adminq_query_rss_cnt",
  69. };
  70. static const char gve_gstrings_priv_flags[][ETH_GSTRING_LEN] = {
  71. "report-stats",
  72. };
  73. #define GVE_MAIN_STATS_LEN ARRAY_SIZE(gve_gstrings_main_stats)
  74. #define GVE_ADMINQ_STATS_LEN ARRAY_SIZE(gve_gstrings_adminq_stats)
  75. #define NUM_GVE_TX_CNTS ARRAY_SIZE(gve_gstrings_tx_stats)
  76. #define NUM_GVE_RX_CNTS ARRAY_SIZE(gve_gstrings_rx_stats)
  77. #define GVE_PRIV_FLAGS_STR_LEN ARRAY_SIZE(gve_gstrings_priv_flags)
  78. static void gve_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
  79. {
  80. struct gve_priv *priv = netdev_priv(netdev);
  81. u8 *s = (char *)data;
  82. int num_tx_queues;
  83. int i, j;
  84. num_tx_queues = gve_num_tx_queues(priv);
  85. switch (stringset) {
  86. case ETH_SS_STATS:
  87. for (i = 0; i < ARRAY_SIZE(gve_gstrings_main_stats); i++)
  88. ethtool_puts(&s, gve_gstrings_main_stats[i]);
  89. for (i = 0; i < priv->rx_cfg.num_queues; i++)
  90. for (j = 0; j < NUM_GVE_RX_CNTS; j++)
  91. ethtool_sprintf(&s, gve_gstrings_rx_stats[j],
  92. i);
  93. for (i = 0; i < num_tx_queues; i++)
  94. for (j = 0; j < NUM_GVE_TX_CNTS; j++)
  95. ethtool_sprintf(&s, gve_gstrings_tx_stats[j],
  96. i);
  97. for (i = 0; i < ARRAY_SIZE(gve_gstrings_adminq_stats); i++)
  98. ethtool_puts(&s, gve_gstrings_adminq_stats[i]);
  99. break;
  100. case ETH_SS_PRIV_FLAGS:
  101. for (i = 0; i < ARRAY_SIZE(gve_gstrings_priv_flags); i++)
  102. ethtool_puts(&s, gve_gstrings_priv_flags[i]);
  103. break;
  104. default:
  105. break;
  106. }
  107. }
  108. static int gve_get_sset_count(struct net_device *netdev, int sset)
  109. {
  110. struct gve_priv *priv = netdev_priv(netdev);
  111. int num_tx_queues;
  112. num_tx_queues = gve_num_tx_queues(priv);
  113. switch (sset) {
  114. case ETH_SS_STATS:
  115. return GVE_MAIN_STATS_LEN + GVE_ADMINQ_STATS_LEN +
  116. (priv->rx_cfg.num_queues * NUM_GVE_RX_CNTS) +
  117. (num_tx_queues * NUM_GVE_TX_CNTS);
  118. case ETH_SS_PRIV_FLAGS:
  119. return GVE_PRIV_FLAGS_STR_LEN;
  120. default:
  121. return -EOPNOTSUPP;
  122. }
  123. }
  124. static void
  125. gve_get_ethtool_stats(struct net_device *netdev,
  126. struct ethtool_stats *stats, u64 *data)
  127. {
  128. u64 tmp_rx_pkts, tmp_rx_hsplit_pkt, tmp_rx_bytes, tmp_rx_hsplit_bytes,
  129. tmp_rx_skb_alloc_fail, tmp_rx_buf_alloc_fail,
  130. tmp_rx_desc_err_dropped_pkt, tmp_rx_hsplit_unsplit_pkt,
  131. tmp_tx_pkts, tmp_tx_bytes;
  132. u64 rx_buf_alloc_fail, rx_desc_err_dropped_pkt, rx_hsplit_unsplit_pkt,
  133. rx_pkts, rx_hsplit_pkt, rx_skb_alloc_fail, rx_bytes, tx_pkts, tx_bytes,
  134. tx_dropped;
  135. int stats_idx, base_stats_idx, max_stats_idx;
  136. struct stats *report_stats;
  137. int *rx_qid_to_stats_idx;
  138. int *tx_qid_to_stats_idx;
  139. int num_stopped_rxqs = 0;
  140. int num_stopped_txqs = 0;
  141. struct gve_priv *priv;
  142. bool skip_nic_stats;
  143. unsigned int start;
  144. int num_tx_queues;
  145. int ring;
  146. int i, j;
  147. ASSERT_RTNL();
  148. priv = netdev_priv(netdev);
  149. num_tx_queues = gve_num_tx_queues(priv);
  150. report_stats = priv->stats_report->stats;
  151. rx_qid_to_stats_idx = kmalloc_array(priv->rx_cfg.num_queues,
  152. sizeof(int), GFP_KERNEL);
  153. if (!rx_qid_to_stats_idx)
  154. return;
  155. for (ring = 0; ring < priv->rx_cfg.num_queues; ring++) {
  156. rx_qid_to_stats_idx[ring] = -1;
  157. if (!gve_rx_was_added_to_block(priv, ring))
  158. num_stopped_rxqs++;
  159. }
  160. tx_qid_to_stats_idx = kmalloc_array(num_tx_queues,
  161. sizeof(int), GFP_KERNEL);
  162. if (!tx_qid_to_stats_idx) {
  163. kfree(rx_qid_to_stats_idx);
  164. return;
  165. }
  166. for (ring = 0; ring < num_tx_queues; ring++) {
  167. tx_qid_to_stats_idx[ring] = -1;
  168. if (!gve_tx_was_added_to_block(priv, ring))
  169. num_stopped_txqs++;
  170. }
  171. for (rx_pkts = 0, rx_bytes = 0, rx_hsplit_pkt = 0,
  172. rx_skb_alloc_fail = 0, rx_buf_alloc_fail = 0,
  173. rx_desc_err_dropped_pkt = 0, rx_hsplit_unsplit_pkt = 0,
  174. ring = 0;
  175. ring < priv->rx_cfg.num_queues; ring++) {
  176. if (priv->rx) {
  177. do {
  178. struct gve_rx_ring *rx = &priv->rx[ring];
  179. start =
  180. u64_stats_fetch_begin(&priv->rx[ring].statss);
  181. tmp_rx_pkts = rx->rpackets;
  182. tmp_rx_hsplit_pkt = rx->rx_hsplit_pkt;
  183. tmp_rx_bytes = rx->rbytes;
  184. tmp_rx_skb_alloc_fail = rx->rx_skb_alloc_fail;
  185. tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
  186. tmp_rx_desc_err_dropped_pkt =
  187. rx->rx_desc_err_dropped_pkt;
  188. tmp_rx_hsplit_unsplit_pkt =
  189. rx->rx_hsplit_unsplit_pkt;
  190. } while (u64_stats_fetch_retry(&priv->rx[ring].statss,
  191. start));
  192. rx_pkts += tmp_rx_pkts;
  193. rx_hsplit_pkt += tmp_rx_hsplit_pkt;
  194. rx_bytes += tmp_rx_bytes;
  195. rx_skb_alloc_fail += tmp_rx_skb_alloc_fail;
  196. rx_buf_alloc_fail += tmp_rx_buf_alloc_fail;
  197. rx_desc_err_dropped_pkt += tmp_rx_desc_err_dropped_pkt;
  198. rx_hsplit_unsplit_pkt += tmp_rx_hsplit_unsplit_pkt;
  199. }
  200. }
  201. for (tx_pkts = 0, tx_bytes = 0, tx_dropped = 0, ring = 0;
  202. ring < num_tx_queues; ring++) {
  203. if (priv->tx) {
  204. do {
  205. start =
  206. u64_stats_fetch_begin(&priv->tx[ring].statss);
  207. tmp_tx_pkts = priv->tx[ring].pkt_done;
  208. tmp_tx_bytes = priv->tx[ring].bytes_done;
  209. } while (u64_stats_fetch_retry(&priv->tx[ring].statss,
  210. start));
  211. tx_pkts += tmp_tx_pkts;
  212. tx_bytes += tmp_tx_bytes;
  213. tx_dropped += priv->tx[ring].dropped_pkt;
  214. }
  215. }
  216. i = 0;
  217. data[i++] = rx_pkts;
  218. data[i++] = rx_hsplit_pkt;
  219. data[i++] = tx_pkts;
  220. data[i++] = rx_bytes;
  221. data[i++] = tx_bytes;
  222. /* total rx dropped packets */
  223. data[i++] = rx_skb_alloc_fail + rx_buf_alloc_fail +
  224. rx_desc_err_dropped_pkt;
  225. data[i++] = tx_dropped;
  226. data[i++] = priv->tx_timeo_cnt;
  227. data[i++] = rx_skb_alloc_fail;
  228. data[i++] = rx_buf_alloc_fail;
  229. data[i++] = rx_desc_err_dropped_pkt;
  230. data[i++] = rx_hsplit_unsplit_pkt;
  231. data[i++] = priv->interface_up_cnt;
  232. data[i++] = priv->interface_down_cnt;
  233. data[i++] = priv->reset_cnt;
  234. data[i++] = priv->page_alloc_fail;
  235. data[i++] = priv->dma_mapping_error;
  236. data[i++] = priv->stats_report_trigger_cnt;
  237. i = GVE_MAIN_STATS_LEN;
  238. /* For rx cross-reporting stats, start from nic rx stats in report */
  239. base_stats_idx = GVE_TX_STATS_REPORT_NUM * num_tx_queues +
  240. GVE_RX_STATS_REPORT_NUM * priv->rx_cfg.num_queues;
  241. /* The boundary between driver stats and NIC stats shifts if there are
  242. * stopped queues.
  243. */
  244. base_stats_idx += NIC_RX_STATS_REPORT_NUM * num_stopped_rxqs +
  245. NIC_TX_STATS_REPORT_NUM * num_stopped_txqs;
  246. max_stats_idx = NIC_RX_STATS_REPORT_NUM *
  247. (priv->rx_cfg.num_queues - num_stopped_rxqs) +
  248. base_stats_idx;
  249. /* Preprocess the stats report for rx, map queue id to start index */
  250. skip_nic_stats = false;
  251. for (stats_idx = base_stats_idx; stats_idx < max_stats_idx;
  252. stats_idx += NIC_RX_STATS_REPORT_NUM) {
  253. u32 stat_name = be32_to_cpu(report_stats[stats_idx].stat_name);
  254. u32 queue_id = be32_to_cpu(report_stats[stats_idx].queue_id);
  255. if (stat_name == 0) {
  256. /* no stats written by NIC yet */
  257. skip_nic_stats = true;
  258. break;
  259. }
  260. if (queue_id < 0 || queue_id >= priv->rx_cfg.num_queues) {
  261. net_err_ratelimited("Invalid rxq id in NIC stats\n");
  262. continue;
  263. }
  264. rx_qid_to_stats_idx[queue_id] = stats_idx;
  265. }
  266. /* walk RX rings */
  267. if (priv->rx) {
  268. for (ring = 0; ring < priv->rx_cfg.num_queues; ring++) {
  269. struct gve_rx_ring *rx = &priv->rx[ring];
  270. data[i++] = rx->fill_cnt;
  271. data[i++] = rx->cnt;
  272. data[i++] = rx->fill_cnt - rx->cnt;
  273. do {
  274. start =
  275. u64_stats_fetch_begin(&priv->rx[ring].statss);
  276. tmp_rx_bytes = rx->rbytes;
  277. tmp_rx_hsplit_bytes = rx->rx_hsplit_bytes;
  278. tmp_rx_skb_alloc_fail = rx->rx_skb_alloc_fail;
  279. tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
  280. tmp_rx_desc_err_dropped_pkt =
  281. rx->rx_desc_err_dropped_pkt;
  282. } while (u64_stats_fetch_retry(&priv->rx[ring].statss,
  283. start));
  284. data[i++] = tmp_rx_bytes;
  285. data[i++] = tmp_rx_hsplit_bytes;
  286. data[i++] = rx->rx_cont_packet_cnt;
  287. data[i++] = rx->rx_frag_flip_cnt;
  288. data[i++] = rx->rx_frag_copy_cnt;
  289. data[i++] = rx->rx_frag_alloc_cnt;
  290. /* rx dropped packets */
  291. data[i++] = tmp_rx_skb_alloc_fail +
  292. tmp_rx_buf_alloc_fail +
  293. tmp_rx_desc_err_dropped_pkt;
  294. data[i++] = rx->rx_copybreak_pkt;
  295. data[i++] = rx->rx_copied_pkt;
  296. /* stats from NIC */
  297. stats_idx = rx_qid_to_stats_idx[ring];
  298. if (skip_nic_stats || stats_idx < 0) {
  299. /* skip NIC rx stats */
  300. i += NIC_RX_STATS_REPORT_NUM;
  301. } else {
  302. for (j = 0; j < NIC_RX_STATS_REPORT_NUM; j++) {
  303. u64 value =
  304. be64_to_cpu(report_stats[stats_idx + j].value);
  305. data[i++] = value;
  306. }
  307. }
  308. /* XDP rx counters */
  309. do {
  310. start = u64_stats_fetch_begin(&priv->rx[ring].statss);
  311. for (j = 0; j < GVE_XDP_ACTIONS; j++)
  312. data[i + j] = rx->xdp_actions[j];
  313. data[i + j++] = rx->xdp_tx_errors;
  314. data[i + j++] = rx->xdp_redirect_errors;
  315. data[i + j++] = rx->xdp_alloc_fails;
  316. } while (u64_stats_fetch_retry(&priv->rx[ring].statss,
  317. start));
  318. i += GVE_XDP_ACTIONS + 3; /* XDP rx counters */
  319. }
  320. } else {
  321. i += priv->rx_cfg.num_queues * NUM_GVE_RX_CNTS;
  322. }
  323. /* For tx cross-reporting stats, start from nic tx stats in report */
  324. base_stats_idx = max_stats_idx;
  325. max_stats_idx = NIC_TX_STATS_REPORT_NUM *
  326. (num_tx_queues - num_stopped_txqs) +
  327. max_stats_idx;
  328. /* Preprocess the stats report for tx, map queue id to start index */
  329. skip_nic_stats = false;
  330. for (stats_idx = base_stats_idx; stats_idx < max_stats_idx;
  331. stats_idx += NIC_TX_STATS_REPORT_NUM) {
  332. u32 stat_name = be32_to_cpu(report_stats[stats_idx].stat_name);
  333. u32 queue_id = be32_to_cpu(report_stats[stats_idx].queue_id);
  334. if (stat_name == 0) {
  335. /* no stats written by NIC yet */
  336. skip_nic_stats = true;
  337. break;
  338. }
  339. if (queue_id < 0 || queue_id >= num_tx_queues) {
  340. net_err_ratelimited("Invalid txq id in NIC stats\n");
  341. continue;
  342. }
  343. tx_qid_to_stats_idx[queue_id] = stats_idx;
  344. }
  345. /* walk TX rings */
  346. if (priv->tx) {
  347. for (ring = 0; ring < num_tx_queues; ring++) {
  348. struct gve_tx_ring *tx = &priv->tx[ring];
  349. if (gve_is_gqi(priv)) {
  350. data[i++] = tx->req;
  351. data[i++] = tx->done;
  352. data[i++] = tx->req - tx->done;
  353. } else {
  354. /* DQO doesn't currently support
  355. * posted/completed descriptor counts;
  356. */
  357. data[i++] = 0;
  358. data[i++] = 0;
  359. data[i++] =
  360. (tx->dqo_tx.tail - tx->dqo_tx.head) &
  361. tx->mask;
  362. }
  363. do {
  364. start =
  365. u64_stats_fetch_begin(&priv->tx[ring].statss);
  366. tmp_tx_bytes = tx->bytes_done;
  367. } while (u64_stats_fetch_retry(&priv->tx[ring].statss,
  368. start));
  369. data[i++] = tmp_tx_bytes;
  370. data[i++] = tx->wake_queue;
  371. data[i++] = tx->stop_queue;
  372. data[i++] = gve_tx_load_event_counter(priv, tx);
  373. data[i++] = tx->dma_mapping_error;
  374. /* stats from NIC */
  375. stats_idx = tx_qid_to_stats_idx[ring];
  376. if (skip_nic_stats || stats_idx < 0) {
  377. /* skip NIC tx stats */
  378. i += NIC_TX_STATS_REPORT_NUM;
  379. } else {
  380. for (j = 0; j < NIC_TX_STATS_REPORT_NUM; j++) {
  381. u64 value =
  382. be64_to_cpu(report_stats[stats_idx + j].value);
  383. data[i++] = value;
  384. }
  385. }
  386. /* XDP xsk counters */
  387. data[i++] = tx->xdp_xsk_wakeup;
  388. data[i++] = tx->xdp_xsk_done;
  389. do {
  390. start = u64_stats_fetch_begin(&priv->tx[ring].statss);
  391. data[i] = tx->xdp_xsk_sent;
  392. data[i + 1] = tx->xdp_xmit;
  393. data[i + 2] = tx->xdp_xmit_errors;
  394. } while (u64_stats_fetch_retry(&priv->tx[ring].statss,
  395. start));
  396. i += 3; /* XDP tx counters */
  397. }
  398. } else {
  399. i += num_tx_queues * NUM_GVE_TX_CNTS;
  400. }
  401. kfree(rx_qid_to_stats_idx);
  402. kfree(tx_qid_to_stats_idx);
  403. /* AQ Stats */
  404. data[i++] = priv->adminq_prod_cnt;
  405. data[i++] = priv->adminq_cmd_fail;
  406. data[i++] = priv->adminq_timeouts;
  407. data[i++] = priv->adminq_describe_device_cnt;
  408. data[i++] = priv->adminq_cfg_device_resources_cnt;
  409. data[i++] = priv->adminq_register_page_list_cnt;
  410. data[i++] = priv->adminq_unregister_page_list_cnt;
  411. data[i++] = priv->adminq_create_tx_queue_cnt;
  412. data[i++] = priv->adminq_create_rx_queue_cnt;
  413. data[i++] = priv->adminq_destroy_tx_queue_cnt;
  414. data[i++] = priv->adminq_destroy_rx_queue_cnt;
  415. data[i++] = priv->adminq_dcfg_device_resources_cnt;
  416. data[i++] = priv->adminq_set_driver_parameter_cnt;
  417. data[i++] = priv->adminq_report_stats_cnt;
  418. data[i++] = priv->adminq_report_link_speed_cnt;
  419. data[i++] = priv->adminq_get_ptype_map_cnt;
  420. data[i++] = priv->adminq_query_flow_rules_cnt;
  421. data[i++] = priv->adminq_cfg_flow_rule_cnt;
  422. data[i++] = priv->adminq_cfg_rss_cnt;
  423. data[i++] = priv->adminq_query_rss_cnt;
  424. }
  425. static void gve_get_channels(struct net_device *netdev,
  426. struct ethtool_channels *cmd)
  427. {
  428. struct gve_priv *priv = netdev_priv(netdev);
  429. cmd->max_rx = priv->rx_cfg.max_queues;
  430. cmd->max_tx = priv->tx_cfg.max_queues;
  431. cmd->max_other = 0;
  432. cmd->max_combined = 0;
  433. cmd->rx_count = priv->rx_cfg.num_queues;
  434. cmd->tx_count = priv->tx_cfg.num_queues;
  435. cmd->other_count = 0;
  436. cmd->combined_count = 0;
  437. }
  438. static int gve_set_channels(struct net_device *netdev,
  439. struct ethtool_channels *cmd)
  440. {
  441. struct gve_priv *priv = netdev_priv(netdev);
  442. struct gve_queue_config new_tx_cfg = priv->tx_cfg;
  443. struct gve_queue_config new_rx_cfg = priv->rx_cfg;
  444. struct ethtool_channels old_settings;
  445. int new_tx = cmd->tx_count;
  446. int new_rx = cmd->rx_count;
  447. gve_get_channels(netdev, &old_settings);
  448. /* Changing combined is not allowed */
  449. if (cmd->combined_count != old_settings.combined_count)
  450. return -EINVAL;
  451. if (!new_rx || !new_tx)
  452. return -EINVAL;
  453. if (priv->num_xdp_queues &&
  454. (new_tx != new_rx || (2 * new_tx > priv->tx_cfg.max_queues))) {
  455. dev_err(&priv->pdev->dev, "XDP load failed: The number of configured RX queues should be equal to the number of configured TX queues and the number of configured RX/TX queues should be less than or equal to half the maximum number of RX/TX queues");
  456. return -EINVAL;
  457. }
  458. if (!netif_running(netdev)) {
  459. priv->tx_cfg.num_queues = new_tx;
  460. priv->rx_cfg.num_queues = new_rx;
  461. return 0;
  462. }
  463. new_tx_cfg.num_queues = new_tx;
  464. new_rx_cfg.num_queues = new_rx;
  465. return gve_adjust_queues(priv, new_rx_cfg, new_tx_cfg);
  466. }
  467. static void gve_get_ringparam(struct net_device *netdev,
  468. struct ethtool_ringparam *cmd,
  469. struct kernel_ethtool_ringparam *kernel_cmd,
  470. struct netlink_ext_ack *extack)
  471. {
  472. struct gve_priv *priv = netdev_priv(netdev);
  473. cmd->rx_max_pending = priv->max_rx_desc_cnt;
  474. cmd->tx_max_pending = priv->max_tx_desc_cnt;
  475. cmd->rx_pending = priv->rx_desc_cnt;
  476. cmd->tx_pending = priv->tx_desc_cnt;
  477. if (!gve_header_split_supported(priv))
  478. kernel_cmd->tcp_data_split = ETHTOOL_TCP_DATA_SPLIT_UNKNOWN;
  479. else if (priv->header_split_enabled)
  480. kernel_cmd->tcp_data_split = ETHTOOL_TCP_DATA_SPLIT_ENABLED;
  481. else
  482. kernel_cmd->tcp_data_split = ETHTOOL_TCP_DATA_SPLIT_DISABLED;
  483. }
  484. static int gve_adjust_ring_sizes(struct gve_priv *priv,
  485. u16 new_tx_desc_cnt,
  486. u16 new_rx_desc_cnt)
  487. {
  488. struct gve_tx_alloc_rings_cfg tx_alloc_cfg = {0};
  489. struct gve_rx_alloc_rings_cfg rx_alloc_cfg = {0};
  490. int err;
  491. /* get current queue configuration */
  492. gve_get_curr_alloc_cfgs(priv, &tx_alloc_cfg, &rx_alloc_cfg);
  493. /* copy over the new ring_size from ethtool */
  494. tx_alloc_cfg.ring_size = new_tx_desc_cnt;
  495. rx_alloc_cfg.ring_size = new_rx_desc_cnt;
  496. if (netif_running(priv->dev)) {
  497. err = gve_adjust_config(priv, &tx_alloc_cfg, &rx_alloc_cfg);
  498. if (err)
  499. return err;
  500. }
  501. /* Set new ring_size for the next up */
  502. priv->tx_desc_cnt = new_tx_desc_cnt;
  503. priv->rx_desc_cnt = new_rx_desc_cnt;
  504. return 0;
  505. }
  506. static int gve_validate_req_ring_size(struct gve_priv *priv, u16 new_tx_desc_cnt,
  507. u16 new_rx_desc_cnt)
  508. {
  509. /* check for valid range */
  510. if (new_tx_desc_cnt < priv->min_tx_desc_cnt ||
  511. new_tx_desc_cnt > priv->max_tx_desc_cnt ||
  512. new_rx_desc_cnt < priv->min_rx_desc_cnt ||
  513. new_rx_desc_cnt > priv->max_rx_desc_cnt) {
  514. dev_err(&priv->pdev->dev, "Requested descriptor count out of range\n");
  515. return -EINVAL;
  516. }
  517. if (!is_power_of_2(new_tx_desc_cnt) || !is_power_of_2(new_rx_desc_cnt)) {
  518. dev_err(&priv->pdev->dev, "Requested descriptor count has to be a power of 2\n");
  519. return -EINVAL;
  520. }
  521. return 0;
  522. }
  523. static int gve_set_ringparam(struct net_device *netdev,
  524. struct ethtool_ringparam *cmd,
  525. struct kernel_ethtool_ringparam *kernel_cmd,
  526. struct netlink_ext_ack *extack)
  527. {
  528. struct gve_priv *priv = netdev_priv(netdev);
  529. u16 new_tx_cnt, new_rx_cnt;
  530. int err;
  531. err = gve_set_hsplit_config(priv, kernel_cmd->tcp_data_split);
  532. if (err)
  533. return err;
  534. if (cmd->tx_pending == priv->tx_desc_cnt && cmd->rx_pending == priv->rx_desc_cnt)
  535. return 0;
  536. if (!priv->modify_ring_size_enabled) {
  537. dev_err(&priv->pdev->dev, "Modify ring size is not supported.\n");
  538. return -EOPNOTSUPP;
  539. }
  540. new_tx_cnt = cmd->tx_pending;
  541. new_rx_cnt = cmd->rx_pending;
  542. if (gve_validate_req_ring_size(priv, new_tx_cnt, new_rx_cnt))
  543. return -EINVAL;
  544. return gve_adjust_ring_sizes(priv, new_tx_cnt, new_rx_cnt);
  545. }
  546. static int gve_user_reset(struct net_device *netdev, u32 *flags)
  547. {
  548. struct gve_priv *priv = netdev_priv(netdev);
  549. if (*flags == ETH_RESET_ALL) {
  550. *flags = 0;
  551. return gve_reset(priv, true);
  552. }
  553. return -EOPNOTSUPP;
  554. }
  555. static int gve_get_tunable(struct net_device *netdev,
  556. const struct ethtool_tunable *etuna, void *value)
  557. {
  558. struct gve_priv *priv = netdev_priv(netdev);
  559. switch (etuna->id) {
  560. case ETHTOOL_RX_COPYBREAK:
  561. *(u32 *)value = priv->rx_copybreak;
  562. return 0;
  563. default:
  564. return -EOPNOTSUPP;
  565. }
  566. }
  567. static int gve_set_tunable(struct net_device *netdev,
  568. const struct ethtool_tunable *etuna,
  569. const void *value)
  570. {
  571. struct gve_priv *priv = netdev_priv(netdev);
  572. u32 len;
  573. switch (etuna->id) {
  574. case ETHTOOL_RX_COPYBREAK:
  575. {
  576. u32 max_copybreak = gve_is_gqi(priv) ?
  577. GVE_DEFAULT_RX_BUFFER_SIZE : priv->data_buffer_size_dqo;
  578. len = *(u32 *)value;
  579. if (len > max_copybreak)
  580. return -EINVAL;
  581. priv->rx_copybreak = len;
  582. return 0;
  583. }
  584. default:
  585. return -EOPNOTSUPP;
  586. }
  587. }
  588. static u32 gve_get_priv_flags(struct net_device *netdev)
  589. {
  590. struct gve_priv *priv = netdev_priv(netdev);
  591. u32 ret_flags = 0;
  592. /* Only 1 flag exists currently: report-stats (BIT(O)), so set that flag. */
  593. if (priv->ethtool_flags & BIT(0))
  594. ret_flags |= BIT(0);
  595. return ret_flags;
  596. }
  597. static int gve_set_priv_flags(struct net_device *netdev, u32 flags)
  598. {
  599. struct gve_priv *priv = netdev_priv(netdev);
  600. u64 ori_flags, new_flags;
  601. int num_tx_queues;
  602. num_tx_queues = gve_num_tx_queues(priv);
  603. ori_flags = READ_ONCE(priv->ethtool_flags);
  604. new_flags = ori_flags;
  605. /* Only one priv flag exists: report-stats (BIT(0))*/
  606. if (flags & BIT(0))
  607. new_flags |= BIT(0);
  608. else
  609. new_flags &= ~(BIT(0));
  610. priv->ethtool_flags = new_flags;
  611. /* start report-stats timer when user turns report stats on. */
  612. if (flags & BIT(0)) {
  613. mod_timer(&priv->stats_report_timer,
  614. round_jiffies(jiffies +
  615. msecs_to_jiffies(priv->stats_report_timer_period)));
  616. }
  617. /* Zero off gve stats when report-stats turned off and */
  618. /* delete report stats timer. */
  619. if (!(flags & BIT(0)) && (ori_flags & BIT(0))) {
  620. int tx_stats_num = GVE_TX_STATS_REPORT_NUM *
  621. num_tx_queues;
  622. int rx_stats_num = GVE_RX_STATS_REPORT_NUM *
  623. priv->rx_cfg.num_queues;
  624. memset(priv->stats_report->stats, 0, (tx_stats_num + rx_stats_num) *
  625. sizeof(struct stats));
  626. del_timer_sync(&priv->stats_report_timer);
  627. }
  628. return 0;
  629. }
  630. static int gve_get_link_ksettings(struct net_device *netdev,
  631. struct ethtool_link_ksettings *cmd)
  632. {
  633. struct gve_priv *priv = netdev_priv(netdev);
  634. int err = 0;
  635. if (priv->link_speed == 0)
  636. err = gve_adminq_report_link_speed(priv);
  637. cmd->base.speed = priv->link_speed;
  638. cmd->base.duplex = DUPLEX_FULL;
  639. return err;
  640. }
  641. static int gve_get_coalesce(struct net_device *netdev,
  642. struct ethtool_coalesce *ec,
  643. struct kernel_ethtool_coalesce *kernel_ec,
  644. struct netlink_ext_ack *extack)
  645. {
  646. struct gve_priv *priv = netdev_priv(netdev);
  647. if (gve_is_gqi(priv))
  648. return -EOPNOTSUPP;
  649. ec->tx_coalesce_usecs = priv->tx_coalesce_usecs;
  650. ec->rx_coalesce_usecs = priv->rx_coalesce_usecs;
  651. return 0;
  652. }
  653. static int gve_set_coalesce(struct net_device *netdev,
  654. struct ethtool_coalesce *ec,
  655. struct kernel_ethtool_coalesce *kernel_ec,
  656. struct netlink_ext_ack *extack)
  657. {
  658. struct gve_priv *priv = netdev_priv(netdev);
  659. u32 tx_usecs_orig = priv->tx_coalesce_usecs;
  660. u32 rx_usecs_orig = priv->rx_coalesce_usecs;
  661. int idx;
  662. if (gve_is_gqi(priv))
  663. return -EOPNOTSUPP;
  664. if (ec->tx_coalesce_usecs > GVE_MAX_ITR_INTERVAL_DQO ||
  665. ec->rx_coalesce_usecs > GVE_MAX_ITR_INTERVAL_DQO)
  666. return -EINVAL;
  667. priv->tx_coalesce_usecs = ec->tx_coalesce_usecs;
  668. priv->rx_coalesce_usecs = ec->rx_coalesce_usecs;
  669. if (tx_usecs_orig != priv->tx_coalesce_usecs) {
  670. for (idx = 0; idx < priv->tx_cfg.num_queues; idx++) {
  671. int ntfy_idx = gve_tx_idx_to_ntfy(priv, idx);
  672. struct gve_notify_block *block = &priv->ntfy_blocks[ntfy_idx];
  673. gve_set_itr_coalesce_usecs_dqo(priv, block,
  674. priv->tx_coalesce_usecs);
  675. }
  676. }
  677. if (rx_usecs_orig != priv->rx_coalesce_usecs) {
  678. for (idx = 0; idx < priv->rx_cfg.num_queues; idx++) {
  679. int ntfy_idx = gve_rx_idx_to_ntfy(priv, idx);
  680. struct gve_notify_block *block = &priv->ntfy_blocks[ntfy_idx];
  681. gve_set_itr_coalesce_usecs_dqo(priv, block,
  682. priv->rx_coalesce_usecs);
  683. }
  684. }
  685. return 0;
  686. }
  687. static int gve_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
  688. {
  689. struct gve_priv *priv = netdev_priv(netdev);
  690. int err = 0;
  691. if (!(netdev->features & NETIF_F_NTUPLE))
  692. return -EOPNOTSUPP;
  693. switch (cmd->cmd) {
  694. case ETHTOOL_SRXCLSRLINS:
  695. err = gve_add_flow_rule(priv, cmd);
  696. break;
  697. case ETHTOOL_SRXCLSRLDEL:
  698. err = gve_del_flow_rule(priv, cmd);
  699. break;
  700. case ETHTOOL_SRXFH:
  701. err = -EOPNOTSUPP;
  702. break;
  703. default:
  704. err = -EOPNOTSUPP;
  705. break;
  706. }
  707. return err;
  708. }
  709. static int gve_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd, u32 *rule_locs)
  710. {
  711. struct gve_priv *priv = netdev_priv(netdev);
  712. int err = 0;
  713. switch (cmd->cmd) {
  714. case ETHTOOL_GRXRINGS:
  715. cmd->data = priv->rx_cfg.num_queues;
  716. break;
  717. case ETHTOOL_GRXCLSRLCNT:
  718. if (!priv->max_flow_rules)
  719. return -EOPNOTSUPP;
  720. err = gve_adminq_query_flow_rules(priv, GVE_FLOW_RULE_QUERY_STATS, 0);
  721. if (err)
  722. return err;
  723. cmd->rule_cnt = priv->num_flow_rules;
  724. cmd->data = priv->max_flow_rules;
  725. break;
  726. case ETHTOOL_GRXCLSRULE:
  727. err = gve_get_flow_rule_entry(priv, cmd);
  728. break;
  729. case ETHTOOL_GRXCLSRLALL:
  730. err = gve_get_flow_rule_ids(priv, cmd, (u32 *)rule_locs);
  731. break;
  732. case ETHTOOL_GRXFH:
  733. err = -EOPNOTSUPP;
  734. break;
  735. default:
  736. err = -EOPNOTSUPP;
  737. break;
  738. }
  739. return err;
  740. }
  741. static u32 gve_get_rxfh_key_size(struct net_device *netdev)
  742. {
  743. struct gve_priv *priv = netdev_priv(netdev);
  744. return priv->rss_key_size;
  745. }
  746. static u32 gve_get_rxfh_indir_size(struct net_device *netdev)
  747. {
  748. struct gve_priv *priv = netdev_priv(netdev);
  749. return priv->rss_lut_size;
  750. }
  751. static int gve_get_rxfh(struct net_device *netdev, struct ethtool_rxfh_param *rxfh)
  752. {
  753. struct gve_priv *priv = netdev_priv(netdev);
  754. if (!priv->rss_key_size || !priv->rss_lut_size)
  755. return -EOPNOTSUPP;
  756. return gve_adminq_query_rss_config(priv, rxfh);
  757. }
  758. static int gve_set_rxfh(struct net_device *netdev, struct ethtool_rxfh_param *rxfh,
  759. struct netlink_ext_ack *extack)
  760. {
  761. struct gve_priv *priv = netdev_priv(netdev);
  762. if (!priv->rss_key_size || !priv->rss_lut_size)
  763. return -EOPNOTSUPP;
  764. return gve_adminq_configure_rss(priv, rxfh);
  765. }
  766. const struct ethtool_ops gve_ethtool_ops = {
  767. .supported_coalesce_params = ETHTOOL_COALESCE_USECS,
  768. .supported_ring_params = ETHTOOL_RING_USE_TCP_DATA_SPLIT,
  769. .get_drvinfo = gve_get_drvinfo,
  770. .get_strings = gve_get_strings,
  771. .get_sset_count = gve_get_sset_count,
  772. .get_ethtool_stats = gve_get_ethtool_stats,
  773. .set_msglevel = gve_set_msglevel,
  774. .get_msglevel = gve_get_msglevel,
  775. .set_channels = gve_set_channels,
  776. .get_channels = gve_get_channels,
  777. .set_rxnfc = gve_set_rxnfc,
  778. .get_rxnfc = gve_get_rxnfc,
  779. .get_rxfh_indir_size = gve_get_rxfh_indir_size,
  780. .get_rxfh_key_size = gve_get_rxfh_key_size,
  781. .get_rxfh = gve_get_rxfh,
  782. .set_rxfh = gve_set_rxfh,
  783. .get_link = ethtool_op_get_link,
  784. .get_coalesce = gve_get_coalesce,
  785. .set_coalesce = gve_set_coalesce,
  786. .get_ringparam = gve_get_ringparam,
  787. .set_ringparam = gve_set_ringparam,
  788. .reset = gve_user_reset,
  789. .get_tunable = gve_get_tunable,
  790. .set_tunable = gve_set_tunable,
  791. .get_priv_flags = gve_get_priv_flags,
  792. .set_priv_flags = gve_set_priv_flags,
  793. .get_link_ksettings = gve_get_link_ksettings,
  794. .get_ts_info = ethtool_op_get_ts_info,
  795. };