Commit 23da1021 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'thunderx-fix-receive-buffer-page-recycling'



Dean Nelson says:

====================
thunderx: fix receive buffer page recycling

In attempting to optimize receive buffer page recycling for XDP, commit
77322538 ("net: thunderx: Optimize page recycling for XDP")
inadvertently introduced two problems for the non-XDP case, that will be
addressed by this patch series.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7f07e5f1 cd35ef91
Loading
Loading
Loading
Loading
+14 −16
Original line number Diff line number Diff line
@@ -105,21 +105,20 @@ static inline struct pgcache *nicvf_alloc_page(struct nicvf *nic,
	/* Check if page can be recycled */
	if (page) {
		ref_count = page_ref_count(page);
		/* Check if this page has been used once i.e 'put_page'
		 * called after packet transmission i.e internal ref_count
		 * and page's ref_count are equal i.e page can be recycled.
		/* This page can be recycled if internal ref_count and page's
		 * ref_count are equal, indicating that the page has been used
		 * once for packet transmission. For non-XDP mode, internal
		 * ref_count is always '1'.
		 */
		if (rbdr->is_xdp && (ref_count == pgcache->ref_count))
		if (rbdr->is_xdp) {
			if (ref_count == pgcache->ref_count)
				pgcache->ref_count--;
			else
				page = NULL;

		/* In non-XDP mode, page's ref_count needs to be '1' for it
		 * to be recycled.
		 */
		if (!rbdr->is_xdp && (ref_count != 1))
		} else if (ref_count != 1) {
			page = NULL;
		}
	}

	if (!page) {
		page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN, 0);
@@ -365,11 +364,10 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
	while (head < rbdr->pgcnt) {
		pgcache = &rbdr->pgcache[head];
		if (pgcache->page && page_ref_count(pgcache->page) != 0) {
			if (!rbdr->is_xdp) {
				put_page(pgcache->page);
				continue;
			if (rbdr->is_xdp) {
				page_ref_sub(pgcache->page,
					     pgcache->ref_count - 1);
			}
			page_ref_sub(pgcache->page, pgcache->ref_count - 1);
			put_page(pgcache->page);
		}
		head++;