gve: add per-queue dmabuff binding flag

Add a gVNIC flag that will indicate whether the given rx queue
is bounded to dmabuf memory or not.

Tested:
  # with RxDM on
  ethtool -S <ifname> | grep rx_dmabuf_bound
     rx_dmabuf_bound[0]: 0
     rx_dmabuf_bound[1]: 0
     rx_dmabuf_bound[2]: 0
     rx_dmabuf_bound[3]: 0
     rx_dmabuf_bound[4]: 0
     rx_dmabuf_bound[5]: 0
     rx_dmabuf_bound[6]: 0
     rx_dmabuf_bound[7]: 0
     rx_dmabuf_bound[8]: 1
     rx_dmabuf_bound[9]: 1
     rx_dmabuf_bound[10]: 1
     rx_dmabuf_bound[11]: 1
     rx_dmabuf_bound[12]: 1
     rx_dmabuf_bound[13]: 1
     rx_dmabuf_bound[14]: 1
     rx_dmabuf_bound[15]: 1

  # with RxDM off
  ethtool -S <ifname> | grep rx_dmabuf_bound
     rx_dmabuf_bound[0]: 0
     rx_dmabuf_bound[1]: 0
     rx_dmabuf_bound[2]: 0
     rx_dmabuf_bound[3]: 0
     rx_dmabuf_bound[4]: 0
     rx_dmabuf_bound[5]: 0
     rx_dmabuf_bound[6]: 0
     rx_dmabuf_bound[7]: 0
     rx_dmabuf_bound[8]: 0
     rx_dmabuf_bound[9]: 0
     rx_dmabuf_bound[10]: 0
     rx_dmabuf_bound[11]: 0
     rx_dmabuf_bound[12]: 0
     rx_dmabuf_bound[13]: 0
     rx_dmabuf_bound[14]: 0
     rx_dmabuf_bound[15]: 0

cos-patch: bug
Google-Bug-Id: 291145287
Change-Id: Icd65af3b5f7ab5f66bc0674c614aa10333f9dc37
Reviewed-on: https://cos-review.googlesource.com/c/third_party/kernel/+/61694
Tested-by: Minh-Anh Nguyen <minhanhdn@google.com>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com>
Reviewed-on: https://cos-review.googlesource.com/c/third_party/kernel/+/66494
Main-Branch-Verified: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Oleksandr Tymoshenko <ovt@google.com>
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h
index 75f98e9..b39bca5 100644
--- a/drivers/net/ethernet/google/gve/gve.h
+++ b/drivers/net/ethernet/google/gve/gve.h
@@ -277,6 +277,7 @@
 	u32 cnt; /* free-running total number of completed packets */
 	u32 fill_cnt; /* free-running total number of descs and buffs posted */
 	u32 mask; /* masks the cnt and fill_cnt to the size of the ring */
+	u32 rx_dmabuf_bound; /* rx queue bound to dmabuf */
 	u64 rx_hsplit_pkt; /* free-running packets with headers split */
 	u64 rx_hsplit_hbo_pkt; /* free-running packets with header buffer overflow */
 	u64 rx_devmem_pkt; /* devmem packets processed */
diff --git a/drivers/net/ethernet/google/gve/gve_ethtool.c b/drivers/net/ethernet/google/gve/gve_ethtool.c
index 6ccb669..fbb30bd 100644
--- a/drivers/net/ethernet/google/gve/gve_ethtool.c
+++ b/drivers/net/ethernet/google/gve/gve_ethtool.c
@@ -45,7 +45,7 @@
 
 static const char gve_gstrings_rx_stats[][ETH_GSTRING_LEN] = {
 	"rx_posted_desc[%u]", "rx_completed_desc[%u]", "rx_consumed_desc[%u]",
-	"rx_bytes[%u]", "rx_header_bytes[%u]",
+	"rx_bytes[%u]", "rx_dmabuf_bound[%u]", "rx_header_bytes[%u]",
 	"rx_cont_packet_cnt[%u]", "rx_frag_flip_cnt[%u]", "rx_frag_copy_cnt[%u]",
 	"rx_frag_alloc_cnt[%u]",
 	"rx_dropped_pkt[%u]", "rx_copybreak_pkt[%u]", "rx_copied_pkt[%u]",
@@ -298,6 +298,7 @@
 			} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
 						       start));
 			data[i++] = tmp_rx_bytes;
+			data[i++] = !! __netif_get_rx_queue(priv->dev, rx->q_num)->dmabuf_pages;
 			data[i++] = tmp_rx_hbytes;
 			data[i++] = rx->rx_cont_packet_cnt;
 			data[i++] = rx->rx_frag_flip_cnt;