cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gve_rx_dqo.c (19606B)


      1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
      2/* Google virtual Ethernet (gve) driver
      3 *
      4 * Copyright (C) 2015-2021 Google, Inc.
      5 */
      6
      7#include "gve.h"
      8#include "gve_dqo.h"
      9#include "gve_adminq.h"
     10#include "gve_utils.h"
     11#include <linux/ip.h>
     12#include <linux/ipv6.h>
     13#include <linux/skbuff.h>
     14#include <linux/slab.h>
     15#include <net/ip6_checksum.h>
     16#include <net/ipv6.h>
     17#include <net/tcp.h>
     18
     19static int gve_buf_ref_cnt(struct gve_rx_buf_state_dqo *bs)
     20{
     21	return page_count(bs->page_info.page) - bs->page_info.pagecnt_bias;
     22}
     23
     24static void gve_free_page_dqo(struct gve_priv *priv,
     25			      struct gve_rx_buf_state_dqo *bs)
     26{
     27	page_ref_sub(bs->page_info.page, bs->page_info.pagecnt_bias - 1);
     28	gve_free_page(&priv->pdev->dev, bs->page_info.page, bs->addr,
     29		      DMA_FROM_DEVICE);
     30	bs->page_info.page = NULL;
     31}
     32
     33static struct gve_rx_buf_state_dqo *gve_alloc_buf_state(struct gve_rx_ring *rx)
     34{
     35	struct gve_rx_buf_state_dqo *buf_state;
     36	s16 buffer_id;
     37
     38	buffer_id = rx->dqo.free_buf_states;
     39	if (unlikely(buffer_id == -1))
     40		return NULL;
     41
     42	buf_state = &rx->dqo.buf_states[buffer_id];
     43
     44	/* Remove buf_state from free list */
     45	rx->dqo.free_buf_states = buf_state->next;
     46
     47	/* Point buf_state to itself to mark it as allocated */
     48	buf_state->next = buffer_id;
     49
     50	return buf_state;
     51}
     52
     53static bool gve_buf_state_is_allocated(struct gve_rx_ring *rx,
     54				       struct gve_rx_buf_state_dqo *buf_state)
     55{
     56	s16 buffer_id = buf_state - rx->dqo.buf_states;
     57
     58	return buf_state->next == buffer_id;
     59}
     60
     61static void gve_free_buf_state(struct gve_rx_ring *rx,
     62			       struct gve_rx_buf_state_dqo *buf_state)
     63{
     64	s16 buffer_id = buf_state - rx->dqo.buf_states;
     65
     66	buf_state->next = rx->dqo.free_buf_states;
     67	rx->dqo.free_buf_states = buffer_id;
     68}
     69
     70static struct gve_rx_buf_state_dqo *
     71gve_dequeue_buf_state(struct gve_rx_ring *rx, struct gve_index_list *list)
     72{
     73	struct gve_rx_buf_state_dqo *buf_state;
     74	s16 buffer_id;
     75
     76	buffer_id = list->head;
     77	if (unlikely(buffer_id == -1))
     78		return NULL;
     79
     80	buf_state = &rx->dqo.buf_states[buffer_id];
     81
     82	/* Remove buf_state from list */
     83	list->head = buf_state->next;
     84	if (buf_state->next == -1)
     85		list->tail = -1;
     86
     87	/* Point buf_state to itself to mark it as allocated */
     88	buf_state->next = buffer_id;
     89
     90	return buf_state;
     91}
     92
     93static void gve_enqueue_buf_state(struct gve_rx_ring *rx,
     94				  struct gve_index_list *list,
     95				  struct gve_rx_buf_state_dqo *buf_state)
     96{
     97	s16 buffer_id = buf_state - rx->dqo.buf_states;
     98
     99	buf_state->next = -1;
    100
    101	if (list->head == -1) {
    102		list->head = buffer_id;
    103		list->tail = buffer_id;
    104	} else {
    105		int tail = list->tail;
    106
    107		rx->dqo.buf_states[tail].next = buffer_id;
    108		list->tail = buffer_id;
    109	}
    110}
    111
    112static struct gve_rx_buf_state_dqo *
    113gve_get_recycled_buf_state(struct gve_rx_ring *rx)
    114{
    115	struct gve_rx_buf_state_dqo *buf_state;
    116	int i;
    117
    118	/* Recycled buf states are immediately usable. */
    119	buf_state = gve_dequeue_buf_state(rx, &rx->dqo.recycled_buf_states);
    120	if (likely(buf_state))
    121		return buf_state;
    122
    123	if (unlikely(rx->dqo.used_buf_states.head == -1))
    124		return NULL;
    125
    126	/* Used buf states are only usable when ref count reaches 0, which means
    127	 * no SKBs refer to them.
    128	 *
    129	 * Search a limited number before giving up.
    130	 */
    131	for (i = 0; i < 5; i++) {
    132		buf_state = gve_dequeue_buf_state(rx, &rx->dqo.used_buf_states);
    133		if (gve_buf_ref_cnt(buf_state) == 0)
    134			return buf_state;
    135
    136		gve_enqueue_buf_state(rx, &rx->dqo.used_buf_states, buf_state);
    137	}
    138
    139	/* If there are no free buf states discard an entry from
    140	 * `used_buf_states` so it can be used.
    141	 */
    142	if (unlikely(rx->dqo.free_buf_states == -1)) {
    143		buf_state = gve_dequeue_buf_state(rx, &rx->dqo.used_buf_states);
    144		if (gve_buf_ref_cnt(buf_state) == 0)
    145			return buf_state;
    146
    147		gve_free_page_dqo(rx->gve, buf_state);
    148		gve_free_buf_state(rx, buf_state);
    149	}
    150
    151	return NULL;
    152}
    153
    154static int gve_alloc_page_dqo(struct gve_priv *priv,
    155			      struct gve_rx_buf_state_dqo *buf_state)
    156{
    157	int err;
    158
    159	err = gve_alloc_page(priv, &priv->pdev->dev, &buf_state->page_info.page,
    160			     &buf_state->addr, DMA_FROM_DEVICE, GFP_KERNEL);
    161	if (err)
    162		return err;
    163
    164	buf_state->page_info.page_offset = 0;
    165	buf_state->page_info.page_address =
    166		page_address(buf_state->page_info.page);
    167	buf_state->last_single_ref_offset = 0;
    168
    169	/* The page already has 1 ref. */
    170	page_ref_add(buf_state->page_info.page, INT_MAX - 1);
    171	buf_state->page_info.pagecnt_bias = INT_MAX;
    172
    173	return 0;
    174}
    175
    176static void gve_rx_free_ring_dqo(struct gve_priv *priv, int idx)
    177{
    178	struct gve_rx_ring *rx = &priv->rx[idx];
    179	struct device *hdev = &priv->pdev->dev;
    180	size_t completion_queue_slots;
    181	size_t buffer_queue_slots;
    182	size_t size;
    183	int i;
    184
    185	completion_queue_slots = rx->dqo.complq.mask + 1;
    186	buffer_queue_slots = rx->dqo.bufq.mask + 1;
    187
    188	gve_rx_remove_from_block(priv, idx);
    189
    190	if (rx->q_resources) {
    191		dma_free_coherent(hdev, sizeof(*rx->q_resources),
    192				  rx->q_resources, rx->q_resources_bus);
    193		rx->q_resources = NULL;
    194	}
    195
    196	for (i = 0; i < rx->dqo.num_buf_states; i++) {
    197		struct gve_rx_buf_state_dqo *bs = &rx->dqo.buf_states[i];
    198
    199		if (bs->page_info.page)
    200			gve_free_page_dqo(priv, bs);
    201	}
    202
    203	if (rx->dqo.bufq.desc_ring) {
    204		size = sizeof(rx->dqo.bufq.desc_ring[0]) * buffer_queue_slots;
    205		dma_free_coherent(hdev, size, rx->dqo.bufq.desc_ring,
    206				  rx->dqo.bufq.bus);
    207		rx->dqo.bufq.desc_ring = NULL;
    208	}
    209
    210	if (rx->dqo.complq.desc_ring) {
    211		size = sizeof(rx->dqo.complq.desc_ring[0]) *
    212			completion_queue_slots;
    213		dma_free_coherent(hdev, size, rx->dqo.complq.desc_ring,
    214				  rx->dqo.complq.bus);
    215		rx->dqo.complq.desc_ring = NULL;
    216	}
    217
    218	kvfree(rx->dqo.buf_states);
    219	rx->dqo.buf_states = NULL;
    220
    221	netif_dbg(priv, drv, priv->dev, "freed rx ring %d\n", idx);
    222}
    223
    224static int gve_rx_alloc_ring_dqo(struct gve_priv *priv, int idx)
    225{
    226	struct gve_rx_ring *rx = &priv->rx[idx];
    227	struct device *hdev = &priv->pdev->dev;
    228	size_t size;
    229	int i;
    230
    231	const u32 buffer_queue_slots =
    232		priv->options_dqo_rda.rx_buff_ring_entries;
    233	const u32 completion_queue_slots = priv->rx_desc_cnt;
    234
    235	netif_dbg(priv, drv, priv->dev, "allocating rx ring DQO\n");
    236
    237	memset(rx, 0, sizeof(*rx));
    238	rx->gve = priv;
    239	rx->q_num = idx;
    240	rx->dqo.bufq.mask = buffer_queue_slots - 1;
    241	rx->dqo.complq.num_free_slots = completion_queue_slots;
    242	rx->dqo.complq.mask = completion_queue_slots - 1;
    243	rx->ctx.skb_head = NULL;
    244	rx->ctx.skb_tail = NULL;
    245
    246	rx->dqo.num_buf_states = min_t(s16, S16_MAX, buffer_queue_slots * 4);
    247	rx->dqo.buf_states = kvcalloc(rx->dqo.num_buf_states,
    248				      sizeof(rx->dqo.buf_states[0]),
    249				      GFP_KERNEL);
    250	if (!rx->dqo.buf_states)
    251		return -ENOMEM;
    252
    253	/* Set up linked list of buffer IDs */
    254	for (i = 0; i < rx->dqo.num_buf_states - 1; i++)
    255		rx->dqo.buf_states[i].next = i + 1;
    256
    257	rx->dqo.buf_states[rx->dqo.num_buf_states - 1].next = -1;
    258	rx->dqo.recycled_buf_states.head = -1;
    259	rx->dqo.recycled_buf_states.tail = -1;
    260	rx->dqo.used_buf_states.head = -1;
    261	rx->dqo.used_buf_states.tail = -1;
    262
    263	/* Allocate RX completion queue */
    264	size = sizeof(rx->dqo.complq.desc_ring[0]) *
    265		completion_queue_slots;
    266	rx->dqo.complq.desc_ring =
    267		dma_alloc_coherent(hdev, size, &rx->dqo.complq.bus, GFP_KERNEL);
    268	if (!rx->dqo.complq.desc_ring)
    269		goto err;
    270
    271	/* Allocate RX buffer queue */
    272	size = sizeof(rx->dqo.bufq.desc_ring[0]) * buffer_queue_slots;
    273	rx->dqo.bufq.desc_ring =
    274		dma_alloc_coherent(hdev, size, &rx->dqo.bufq.bus, GFP_KERNEL);
    275	if (!rx->dqo.bufq.desc_ring)
    276		goto err;
    277
    278	rx->q_resources = dma_alloc_coherent(hdev, sizeof(*rx->q_resources),
    279					     &rx->q_resources_bus, GFP_KERNEL);
    280	if (!rx->q_resources)
    281		goto err;
    282
    283	gve_rx_add_to_block(priv, idx);
    284
    285	return 0;
    286
    287err:
    288	gve_rx_free_ring_dqo(priv, idx);
    289	return -ENOMEM;
    290}
    291
    292void gve_rx_write_doorbell_dqo(const struct gve_priv *priv, int queue_idx)
    293{
    294	const struct gve_rx_ring *rx = &priv->rx[queue_idx];
    295	u64 index = be32_to_cpu(rx->q_resources->db_index);
    296
    297	iowrite32(rx->dqo.bufq.tail, &priv->db_bar2[index]);
    298}
    299
    300int gve_rx_alloc_rings_dqo(struct gve_priv *priv)
    301{
    302	int err = 0;
    303	int i;
    304
    305	for (i = 0; i < priv->rx_cfg.num_queues; i++) {
    306		err = gve_rx_alloc_ring_dqo(priv, i);
    307		if (err) {
    308			netif_err(priv, drv, priv->dev,
    309				  "Failed to alloc rx ring=%d: err=%d\n",
    310				  i, err);
    311			goto err;
    312		}
    313	}
    314
    315	return 0;
    316
    317err:
    318	for (i--; i >= 0; i--)
    319		gve_rx_free_ring_dqo(priv, i);
    320
    321	return err;
    322}
    323
    324void gve_rx_free_rings_dqo(struct gve_priv *priv)
    325{
    326	int i;
    327
    328	for (i = 0; i < priv->rx_cfg.num_queues; i++)
    329		gve_rx_free_ring_dqo(priv, i);
    330}
    331
    332void gve_rx_post_buffers_dqo(struct gve_rx_ring *rx)
    333{
    334	struct gve_rx_compl_queue_dqo *complq = &rx->dqo.complq;
    335	struct gve_rx_buf_queue_dqo *bufq = &rx->dqo.bufq;
    336	struct gve_priv *priv = rx->gve;
    337	u32 num_avail_slots;
    338	u32 num_full_slots;
    339	u32 num_posted = 0;
    340
    341	num_full_slots = (bufq->tail - bufq->head) & bufq->mask;
    342	num_avail_slots = bufq->mask - num_full_slots;
    343
    344	num_avail_slots = min_t(u32, num_avail_slots, complq->num_free_slots);
    345	while (num_posted < num_avail_slots) {
    346		struct gve_rx_desc_dqo *desc = &bufq->desc_ring[bufq->tail];
    347		struct gve_rx_buf_state_dqo *buf_state;
    348
    349		buf_state = gve_get_recycled_buf_state(rx);
    350		if (unlikely(!buf_state)) {
    351			buf_state = gve_alloc_buf_state(rx);
    352			if (unlikely(!buf_state))
    353				break;
    354
    355			if (unlikely(gve_alloc_page_dqo(priv, buf_state))) {
    356				u64_stats_update_begin(&rx->statss);
    357				rx->rx_buf_alloc_fail++;
    358				u64_stats_update_end(&rx->statss);
    359				gve_free_buf_state(rx, buf_state);
    360				break;
    361			}
    362		}
    363
    364		desc->buf_id = cpu_to_le16(buf_state - rx->dqo.buf_states);
    365		desc->buf_addr = cpu_to_le64(buf_state->addr +
    366					     buf_state->page_info.page_offset);
    367
    368		bufq->tail = (bufq->tail + 1) & bufq->mask;
    369		complq->num_free_slots--;
    370		num_posted++;
    371
    372		if ((bufq->tail & (GVE_RX_BUF_THRESH_DQO - 1)) == 0)
    373			gve_rx_write_doorbell_dqo(priv, rx->q_num);
    374	}
    375
    376	rx->fill_cnt += num_posted;
    377}
    378
    379static void gve_try_recycle_buf(struct gve_priv *priv, struct gve_rx_ring *rx,
    380				struct gve_rx_buf_state_dqo *buf_state)
    381{
    382	const int data_buffer_size = priv->data_buffer_size_dqo;
    383	int pagecount;
    384
    385	/* Can't reuse if we only fit one buffer per page */
    386	if (data_buffer_size * 2 > PAGE_SIZE)
    387		goto mark_used;
    388
    389	pagecount = gve_buf_ref_cnt(buf_state);
    390
    391	/* Record the offset when we have a single remaining reference.
    392	 *
    393	 * When this happens, we know all of the other offsets of the page are
    394	 * usable.
    395	 */
    396	if (pagecount == 1) {
    397		buf_state->last_single_ref_offset =
    398			buf_state->page_info.page_offset;
    399	}
    400
    401	/* Use the next buffer sized chunk in the page. */
    402	buf_state->page_info.page_offset += data_buffer_size;
    403	buf_state->page_info.page_offset &= (PAGE_SIZE - 1);
    404
    405	/* If we wrap around to the same offset without ever dropping to 1
    406	 * reference, then we don't know if this offset was ever freed.
    407	 */
    408	if (buf_state->page_info.page_offset ==
    409	    buf_state->last_single_ref_offset) {
    410		goto mark_used;
    411	}
    412
    413	gve_enqueue_buf_state(rx, &rx->dqo.recycled_buf_states, buf_state);
    414	return;
    415
    416mark_used:
    417	gve_enqueue_buf_state(rx, &rx->dqo.used_buf_states, buf_state);
    418}
    419
    420static void gve_rx_skb_csum(struct sk_buff *skb,
    421			    const struct gve_rx_compl_desc_dqo *desc,
    422			    struct gve_ptype ptype)
    423{
    424	skb->ip_summed = CHECKSUM_NONE;
    425
    426	/* HW did not identify and process L3 and L4 headers. */
    427	if (unlikely(!desc->l3_l4_processed))
    428		return;
    429
    430	if (ptype.l3_type == GVE_L3_TYPE_IPV4) {
    431		if (unlikely(desc->csum_ip_err || desc->csum_external_ip_err))
    432			return;
    433	} else if (ptype.l3_type == GVE_L3_TYPE_IPV6) {
    434		/* Checksum should be skipped if this flag is set. */
    435		if (unlikely(desc->ipv6_ex_add))
    436			return;
    437	}
    438
    439	if (unlikely(desc->csum_l4_err))
    440		return;
    441
    442	switch (ptype.l4_type) {
    443	case GVE_L4_TYPE_TCP:
    444	case GVE_L4_TYPE_UDP:
    445	case GVE_L4_TYPE_ICMP:
    446	case GVE_L4_TYPE_SCTP:
    447		skb->ip_summed = CHECKSUM_UNNECESSARY;
    448		break;
    449	default:
    450		break;
    451	}
    452}
    453
    454static void gve_rx_skb_hash(struct sk_buff *skb,
    455			    const struct gve_rx_compl_desc_dqo *compl_desc,
    456			    struct gve_ptype ptype)
    457{
    458	enum pkt_hash_types hash_type = PKT_HASH_TYPE_L2;
    459
    460	if (ptype.l4_type != GVE_L4_TYPE_UNKNOWN)
    461		hash_type = PKT_HASH_TYPE_L4;
    462	else if (ptype.l3_type != GVE_L3_TYPE_UNKNOWN)
    463		hash_type = PKT_HASH_TYPE_L3;
    464
    465	skb_set_hash(skb, le32_to_cpu(compl_desc->hash), hash_type);
    466}
    467
    468static void gve_rx_free_skb(struct gve_rx_ring *rx)
    469{
    470	if (!rx->ctx.skb_head)
    471		return;
    472
    473	dev_kfree_skb_any(rx->ctx.skb_head);
    474	rx->ctx.skb_head = NULL;
    475	rx->ctx.skb_tail = NULL;
    476}
    477
    478/* Chains multi skbs for single rx packet.
    479 * Returns 0 if buffer is appended, -1 otherwise.
    480 */
    481static int gve_rx_append_frags(struct napi_struct *napi,
    482			       struct gve_rx_buf_state_dqo *buf_state,
    483			       u16 buf_len, struct gve_rx_ring *rx,
    484			       struct gve_priv *priv)
    485{
    486	int num_frags = skb_shinfo(rx->ctx.skb_tail)->nr_frags;
    487
    488	if (unlikely(num_frags == MAX_SKB_FRAGS)) {
    489		struct sk_buff *skb;
    490
    491		skb = napi_alloc_skb(napi, 0);
    492		if (!skb)
    493			return -1;
    494
    495		skb_shinfo(rx->ctx.skb_tail)->frag_list = skb;
    496		rx->ctx.skb_tail = skb;
    497		num_frags = 0;
    498	}
    499	if (rx->ctx.skb_tail != rx->ctx.skb_head) {
    500		rx->ctx.skb_head->len += buf_len;
    501		rx->ctx.skb_head->data_len += buf_len;
    502		rx->ctx.skb_head->truesize += priv->data_buffer_size_dqo;
    503	}
    504
    505	skb_add_rx_frag(rx->ctx.skb_tail, num_frags,
    506			buf_state->page_info.page,
    507			buf_state->page_info.page_offset,
    508			buf_len, priv->data_buffer_size_dqo);
    509	gve_dec_pagecnt_bias(&buf_state->page_info);
    510
    511	return 0;
    512}
    513
    514/* Returns 0 if descriptor is completed successfully.
    515 * Returns -EINVAL if descriptor is invalid.
    516 * Returns -ENOMEM if data cannot be copied to skb.
    517 */
    518static int gve_rx_dqo(struct napi_struct *napi, struct gve_rx_ring *rx,
    519		      const struct gve_rx_compl_desc_dqo *compl_desc,
    520		      int queue_idx)
    521{
    522	const u16 buffer_id = le16_to_cpu(compl_desc->buf_id);
    523	const bool eop = compl_desc->end_of_packet != 0;
    524	struct gve_rx_buf_state_dqo *buf_state;
    525	struct gve_priv *priv = rx->gve;
    526	u16 buf_len;
    527
    528	if (unlikely(buffer_id >= rx->dqo.num_buf_states)) {
    529		net_err_ratelimited("%s: Invalid RX buffer_id=%u\n",
    530				    priv->dev->name, buffer_id);
    531		return -EINVAL;
    532	}
    533	buf_state = &rx->dqo.buf_states[buffer_id];
    534	if (unlikely(!gve_buf_state_is_allocated(rx, buf_state))) {
    535		net_err_ratelimited("%s: RX buffer_id is not allocated: %u\n",
    536				    priv->dev->name, buffer_id);
    537		return -EINVAL;
    538	}
    539
    540	if (unlikely(compl_desc->rx_error)) {
    541		gve_enqueue_buf_state(rx, &rx->dqo.recycled_buf_states,
    542				      buf_state);
    543		return -EINVAL;
    544	}
    545
    546	buf_len = compl_desc->packet_len;
    547
    548	/* Page might have not been used for awhile and was likely last written
    549	 * by a different thread.
    550	 */
    551	prefetch(buf_state->page_info.page);
    552
    553	/* Sync the portion of dma buffer for CPU to read. */
    554	dma_sync_single_range_for_cpu(&priv->pdev->dev, buf_state->addr,
    555				      buf_state->page_info.page_offset,
    556				      buf_len, DMA_FROM_DEVICE);
    557
    558	/* Append to current skb if one exists. */
    559	if (rx->ctx.skb_head) {
    560		if (unlikely(gve_rx_append_frags(napi, buf_state, buf_len, rx,
    561						 priv)) != 0) {
    562			goto error;
    563		}
    564
    565		gve_try_recycle_buf(priv, rx, buf_state);
    566		return 0;
    567	}
    568
    569	if (eop && buf_len <= priv->rx_copybreak) {
    570		rx->ctx.skb_head = gve_rx_copy(priv->dev, napi,
    571					       &buf_state->page_info, buf_len, 0, NULL);
    572		if (unlikely(!rx->ctx.skb_head))
    573			goto error;
    574		rx->ctx.skb_tail = rx->ctx.skb_head;
    575
    576		u64_stats_update_begin(&rx->statss);
    577		rx->rx_copied_pkt++;
    578		rx->rx_copybreak_pkt++;
    579		u64_stats_update_end(&rx->statss);
    580
    581		gve_enqueue_buf_state(rx, &rx->dqo.recycled_buf_states,
    582				      buf_state);
    583		return 0;
    584	}
    585
    586	rx->ctx.skb_head = napi_get_frags(napi);
    587	if (unlikely(!rx->ctx.skb_head))
    588		goto error;
    589	rx->ctx.skb_tail = rx->ctx.skb_head;
    590
    591	skb_add_rx_frag(rx->ctx.skb_head, 0, buf_state->page_info.page,
    592			buf_state->page_info.page_offset, buf_len,
    593			priv->data_buffer_size_dqo);
    594	gve_dec_pagecnt_bias(&buf_state->page_info);
    595
    596	gve_try_recycle_buf(priv, rx, buf_state);
    597	return 0;
    598
    599error:
    600	gve_enqueue_buf_state(rx, &rx->dqo.recycled_buf_states, buf_state);
    601	return -ENOMEM;
    602}
    603
    604static int gve_rx_complete_rsc(struct sk_buff *skb,
    605			       const struct gve_rx_compl_desc_dqo *desc,
    606			       struct gve_ptype ptype)
    607{
    608	struct skb_shared_info *shinfo = skb_shinfo(skb);
    609
    610	/* Only TCP is supported right now. */
    611	if (ptype.l4_type != GVE_L4_TYPE_TCP)
    612		return -EINVAL;
    613
    614	switch (ptype.l3_type) {
    615	case GVE_L3_TYPE_IPV4:
    616		shinfo->gso_type = SKB_GSO_TCPV4;
    617		break;
    618	case GVE_L3_TYPE_IPV6:
    619		shinfo->gso_type = SKB_GSO_TCPV6;
    620		break;
    621	default:
    622		return -EINVAL;
    623	}
    624
    625	shinfo->gso_size = le16_to_cpu(desc->rsc_seg_len);
    626	return 0;
    627}
    628
    629/* Returns 0 if skb is completed successfully, -1 otherwise. */
    630static int gve_rx_complete_skb(struct gve_rx_ring *rx, struct napi_struct *napi,
    631			       const struct gve_rx_compl_desc_dqo *desc,
    632			       netdev_features_t feat)
    633{
    634	struct gve_ptype ptype =
    635		rx->gve->ptype_lut_dqo->ptypes[desc->packet_type];
    636	int err;
    637
    638	skb_record_rx_queue(rx->ctx.skb_head, rx->q_num);
    639
    640	if (feat & NETIF_F_RXHASH)
    641		gve_rx_skb_hash(rx->ctx.skb_head, desc, ptype);
    642
    643	if (feat & NETIF_F_RXCSUM)
    644		gve_rx_skb_csum(rx->ctx.skb_head, desc, ptype);
    645
    646	/* RSC packets must set gso_size otherwise the TCP stack will complain
    647	 * that packets are larger than MTU.
    648	 */
    649	if (desc->rsc) {
    650		err = gve_rx_complete_rsc(rx->ctx.skb_head, desc, ptype);
    651		if (err < 0)
    652			return err;
    653	}
    654
    655	if (skb_headlen(rx->ctx.skb_head) == 0)
    656		napi_gro_frags(napi);
    657	else
    658		napi_gro_receive(napi, rx->ctx.skb_head);
    659
    660	return 0;
    661}
    662
    663int gve_rx_poll_dqo(struct gve_notify_block *block, int budget)
    664{
    665	struct napi_struct *napi = &block->napi;
    666	netdev_features_t feat = napi->dev->features;
    667
    668	struct gve_rx_ring *rx = block->rx;
    669	struct gve_rx_compl_queue_dqo *complq = &rx->dqo.complq;
    670
    671	u32 work_done = 0;
    672	u64 bytes = 0;
    673	int err;
    674
    675	while (work_done < budget) {
    676		struct gve_rx_compl_desc_dqo *compl_desc =
    677			&complq->desc_ring[complq->head];
    678		u32 pkt_bytes;
    679
    680		/* No more new packets */
    681		if (compl_desc->generation == complq->cur_gen_bit)
    682			break;
    683
    684		/* Prefetch the next two descriptors. */
    685		prefetch(&complq->desc_ring[(complq->head + 1) & complq->mask]);
    686		prefetch(&complq->desc_ring[(complq->head + 2) & complq->mask]);
    687
    688		/* Do not read data until we own the descriptor */
    689		dma_rmb();
    690
    691		err = gve_rx_dqo(napi, rx, compl_desc, rx->q_num);
    692		if (err < 0) {
    693			gve_rx_free_skb(rx);
    694			u64_stats_update_begin(&rx->statss);
    695			if (err == -ENOMEM)
    696				rx->rx_skb_alloc_fail++;
    697			else if (err == -EINVAL)
    698				rx->rx_desc_err_dropped_pkt++;
    699			u64_stats_update_end(&rx->statss);
    700		}
    701
    702		complq->head = (complq->head + 1) & complq->mask;
    703		complq->num_free_slots++;
    704
    705		/* When the ring wraps, the generation bit is flipped. */
    706		complq->cur_gen_bit ^= (complq->head == 0);
    707
    708		/* Receiving a completion means we have space to post another
    709		 * buffer on the buffer queue.
    710		 */
    711		{
    712			struct gve_rx_buf_queue_dqo *bufq = &rx->dqo.bufq;
    713
    714			bufq->head = (bufq->head + 1) & bufq->mask;
    715		}
    716
    717		/* Free running counter of completed descriptors */
    718		rx->cnt++;
    719
    720		if (!rx->ctx.skb_head)
    721			continue;
    722
    723		if (!compl_desc->end_of_packet)
    724			continue;
    725
    726		work_done++;
    727		pkt_bytes = rx->ctx.skb_head->len;
    728		/* The ethernet header (first ETH_HLEN bytes) is snipped off
    729		 * by eth_type_trans.
    730		 */
    731		if (skb_headlen(rx->ctx.skb_head))
    732			pkt_bytes += ETH_HLEN;
    733
    734		/* gve_rx_complete_skb() will consume skb if successful */
    735		if (gve_rx_complete_skb(rx, napi, compl_desc, feat) != 0) {
    736			gve_rx_free_skb(rx);
    737			u64_stats_update_begin(&rx->statss);
    738			rx->rx_desc_err_dropped_pkt++;
    739			u64_stats_update_end(&rx->statss);
    740			continue;
    741		}
    742
    743		bytes += pkt_bytes;
    744		rx->ctx.skb_head = NULL;
    745		rx->ctx.skb_tail = NULL;
    746	}
    747
    748	gve_rx_post_buffers_dqo(rx);
    749
    750	u64_stats_update_begin(&rx->statss);
    751	rx->rpackets += work_done;
    752	rx->rbytes += bytes;
    753	u64_stats_update_end(&rx->statss);
    754
    755	return work_done;
    756}