| From foo@baz Thu Mar 28 21:57:57 CET 2019 |
| From: Dean Nelson <dnelson@redhat.com> |
| Date: Tue, 26 Mar 2019 11:53:19 -0400 |
| Subject: thunderx: enable page recycling for non-XDP case |
| |
| From: Dean Nelson <dnelson@redhat.com> |
| |
| [ Upstream commit b3e208069477588c06f4d5d986164b435bb06e6d ] |
| |
| Commit 773225388dae15e72790 ("net: thunderx: Optimize page recycling for XDP") |
| added code to nicvf_alloc_page() that inadvertently disables receive buffer |
| page recycling for the non-XDP case by always NULL'ng the page pointer. |
| |
| This patch corrects two if-conditionals to allow for the recycling of non-XDP |
| mode pages by only setting the page pointer to NULL when the page is not ready |
| for recycling. |
| |
| Fixes: 773225388dae ("net: thunderx: Optimize page recycling for XDP") |
| Signed-off-by: Dean Nelson <dnelson@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/cavium/thunder/nicvf_queues.c | 23 ++++++++++----------- |
| 1 file changed, 11 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c |
| +++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c |
| @@ -105,20 +105,19 @@ static inline struct pgcache *nicvf_allo |
| /* 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)) |
| - 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)) |
| + if (rbdr->is_xdp) { |
| + if (ref_count == pgcache->ref_count) |
| + pgcache->ref_count--; |
| + else |
| + page = NULL; |
| + } else if (ref_count != 1) { |
| page = NULL; |
| + } |
| } |
| |
| if (!page) { |