drivers/net/ethernet/google/gve/gve_ethtool.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/google/gve/gve_ethtool.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/google/gve/gve_ethtool.c
Extension
.c
Size
30294 bytes
Lines
1016
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (priv->rx) {
			do {
				struct gve_rx_ring *rx = &priv->rx[ring];

				start =
				  u64_stats_fetch_begin(&priv->rx[ring].statss);
				tmp_rx_pkts = rx->rpackets;
				tmp_rx_hsplit_pkt = rx->rx_hsplit_pkt;
				tmp_rx_bytes = rx->rbytes;
				tmp_rx_skb_alloc_fail = rx->rx_skb_alloc_fail;
				tmp_rx_buf_alloc_fail = rx->rx_buf_alloc_fail;
				tmp_rx_desc_err_dropped_pkt =
					rx->rx_desc_err_dropped_pkt;
				tmp_rx_hsplit_unsplit_pkt =
					rx->rx_hsplit_unsplit_pkt;
				tmp_xdp_tx_errors = rx->xdp_tx_errors;
				tmp_xdp_redirect_errors =
					rx->xdp_redirect_errors;
			} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
						       start));
			rx_pkts += tmp_rx_pkts;
			rx_hsplit_pkt += tmp_rx_hsplit_pkt;
			rx_bytes += tmp_rx_bytes;
			rx_skb_alloc_fail += tmp_rx_skb_alloc_fail;
			rx_buf_alloc_fail += tmp_rx_buf_alloc_fail;
			rx_desc_err_dropped_pkt += tmp_rx_desc_err_dropped_pkt;
			rx_hsplit_unsplit_pkt += tmp_rx_hsplit_unsplit_pkt;
			xdp_tx_errors += tmp_xdp_tx_errors;
			xdp_redirect_errors += tmp_xdp_redirect_errors;
		}
	}
	for (tx_pkts = 0, tx_bytes = 0, tx_dropped = 0, ring = 0;
	     ring < num_tx_queues; ring++) {
		if (priv->tx) {
			do {
				start =
				  u64_stats_fetch_begin(&priv->tx[ring].statss);
				tmp_tx_pkts = priv->tx[ring].pkt_done;
				tmp_tx_bytes = priv->tx[ring].bytes_done;
			} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
						       start));
			tx_pkts += tmp_tx_pkts;
			tx_bytes += tmp_tx_bytes;
			tx_dropped += priv->tx[ring].dropped_pkt;
		}
	}

	i = 0;
	data[i++] = rx_pkts;
	data[i++] = rx_hsplit_pkt;
	data[i++] = tx_pkts;
	data[i++] = rx_bytes;
	data[i++] = tx_bytes;
	/* total rx dropped packets */
	data[i++] = rx_skb_alloc_fail + rx_desc_err_dropped_pkt +
		    xdp_tx_errors + xdp_redirect_errors;
	data[i++] = tx_dropped;
	data[i++] = priv->tx_timeo_cnt;
	data[i++] = rx_skb_alloc_fail;
	data[i++] = rx_buf_alloc_fail;
	data[i++] = rx_desc_err_dropped_pkt;
	data[i++] = rx_hsplit_unsplit_pkt;
	data[i++] = priv->interface_up_cnt;
	data[i++] = priv->interface_down_cnt;
	data[i++] = priv->reset_cnt;
	data[i++] = priv->page_alloc_fail;
	data[i++] = priv->dma_mapping_error;
	data[i++] = priv->stats_report_trigger_cnt;
	i = GVE_MAIN_STATS_LEN;

	rx_base_stats_idx = 0;
	max_rx_stats_idx = 0;
	max_tx_stats_idx = 0;
	stats_region_len = priv->stats_report_len -
				sizeof(struct gve_stats_report);
	nic_stats_len = (NIC_RX_STATS_REPORT_NUM * priv->rx_cfg.num_queues +
		NIC_TX_STATS_REPORT_NUM * num_tx_queues) * sizeof(struct stats);
	if (unlikely((stats_region_len -
				nic_stats_len) % sizeof(struct stats))) {
		net_err_ratelimited("Starting index of NIC stats should be multiple of stats size");
	} else {
		/* For rx cross-reporting stats,
		 * start from nic rx stats in report
		 */
		rx_base_stats_idx = (stats_region_len - nic_stats_len) /
							sizeof(struct stats);
		/* The boundary between driver stats and NIC stats
		 * shifts if there are stopped queues
		 */
		rx_base_stats_idx += NIC_RX_STATS_REPORT_NUM *

Annotation

Implementation Notes