]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commit
thunderx: eliminate extra calls to put_page() for pages held for recycling
authorDean Nelson <dnelson@redhat.com>
Tue, 26 Mar 2019 15:53:26 +0000 (11:53 -0400)
committerSeth Forshee <seth.forshee@canonical.com>
Wed, 3 Apr 2019 18:11:40 +0000 (13:11 -0500)
commit2f94bb4a00952d00f29025df8438e1f090f365b3
tree4672b26c426f9d5cc380e1d7af69eae8548d954b
parent5145391c39765ce1c9c7d3c169446decc7ca471c
thunderx: eliminate extra calls to put_page() for pages held for recycling

BugLink: https://bugs.launchpad.net/bugs/1823060
[ Upstream commit cd35ef91490ad8049dd180bb060aff7ee192eda9 ]

For the non-XDP case, commit 773225388dae15e72790 ("net: thunderx: Optimize
page recycling for XDP") added code to nicvf_free_rbdr() that, when releasing
the additional receive buffer page reference held for recycling, repeatedly
calls put_page() until the page's _refcount goes to zero. Which results in
the page being freed.

This is not okay if the page's _refcount was greater than 1 (in the non-XDP
case), because nicvf_free_rbdr() should not be subtracting more than what
nicvf_alloc_page() had previously added to the page's _refcount, which was
only 1 (in the non-XDP case).

This can arise if a received packet is still being processed and the receive
buffer (i.e., skb->head) has not yet been freed via skb_free_head() when
nicvf_free_rbdr() is spinning through the aforementioned put_page() loop.

If this should occur, when the received packet finishes processing and
skb_free_head() is called, various problems can ensue. Exactly what, depends on
whether the page has already been reallocated or not, anything from "BUG: Bad
page state ... ", to "Unable to handle kernel NULL pointer dereference ..." or
"Unable to handle kernel paging request...".

So this patch changes nicvf_free_rbdr() to only call put_page() once for pages
held for recycling (in the non-XDP case).

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>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/net/ethernet/cavium/thunder/nicvf_queues.c