mm: page_frag: avoid caller accessing 'page_frag_cache' directly

Use appropriate frag_page API instead of caller accessing
'page_frag_cache' directly.

CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux-MM <linux-mm@kvack.org>
Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Link: https://patch.msgid.link/20241028115343.3405838-5-linyunsheng@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Yunsheng Lin 2024-10-28 19:53:39 +08:00 committed by Jakub Kicinski
parent 8218f62c9c
commit 3d18dfe69c
7 changed files with 19 additions and 15 deletions

View File

@ -1325,7 +1325,7 @@ static int vhost_net_open(struct inode *inode, struct file *f)
vqs[VHOST_NET_VQ_RX]); vqs[VHOST_NET_VQ_RX]);
f->private_data = n; f->private_data = n;
n->pf_cache.va = NULL; page_frag_cache_init(&n->pf_cache);
return 0; return 0;
} }

View File

@ -7,6 +7,16 @@
#include <linux/mm_types_task.h> #include <linux/mm_types_task.h>
#include <linux/types.h> #include <linux/types.h>
static inline void page_frag_cache_init(struct page_frag_cache *nc)
{
nc->va = NULL;
}
static inline bool page_frag_cache_is_pfmemalloc(struct page_frag_cache *nc)
{
return !!nc->pfmemalloc;
}
void page_frag_cache_drain(struct page_frag_cache *nc); void page_frag_cache_drain(struct page_frag_cache *nc);
void __page_frag_cache_drain(struct page *page, unsigned int count); void __page_frag_cache_drain(struct page *page, unsigned int count);
void *__page_frag_alloc_align(struct page_frag_cache *nc, unsigned int fragsz, void *__page_frag_alloc_align(struct page_frag_cache *nc, unsigned int fragsz,

View File

@ -753,14 +753,14 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len,
if (in_hardirq() || irqs_disabled()) { if (in_hardirq() || irqs_disabled()) {
nc = this_cpu_ptr(&netdev_alloc_cache); nc = this_cpu_ptr(&netdev_alloc_cache);
data = page_frag_alloc(nc, len, gfp_mask); data = page_frag_alloc(nc, len, gfp_mask);
pfmemalloc = nc->pfmemalloc; pfmemalloc = page_frag_cache_is_pfmemalloc(nc);
} else { } else {
local_bh_disable(); local_bh_disable();
local_lock_nested_bh(&napi_alloc_cache.bh_lock); local_lock_nested_bh(&napi_alloc_cache.bh_lock);
nc = this_cpu_ptr(&napi_alloc_cache.page); nc = this_cpu_ptr(&napi_alloc_cache.page);
data = page_frag_alloc(nc, len, gfp_mask); data = page_frag_alloc(nc, len, gfp_mask);
pfmemalloc = nc->pfmemalloc; pfmemalloc = page_frag_cache_is_pfmemalloc(nc);
local_unlock_nested_bh(&napi_alloc_cache.bh_lock); local_unlock_nested_bh(&napi_alloc_cache.bh_lock);
local_bh_enable(); local_bh_enable();
@ -850,7 +850,7 @@ struct sk_buff *napi_alloc_skb(struct napi_struct *napi, unsigned int len)
len = SKB_HEAD_ALIGN(len); len = SKB_HEAD_ALIGN(len);
data = page_frag_alloc(&nc->page, len, gfp_mask); data = page_frag_alloc(&nc->page, len, gfp_mask);
pfmemalloc = nc->page.pfmemalloc; pfmemalloc = page_frag_cache_is_pfmemalloc(&nc->page);
} }
local_unlock_nested_bh(&napi_alloc_cache.bh_lock); local_unlock_nested_bh(&napi_alloc_cache.bh_lock);

View File

@ -337,9 +337,7 @@ static void rxrpc_clean_up_connection(struct work_struct *work)
*/ */
rxrpc_purge_queue(&conn->rx_queue); rxrpc_purge_queue(&conn->rx_queue);
if (conn->tx_data_alloc.va) page_frag_cache_drain(&conn->tx_data_alloc);
__page_frag_cache_drain(virt_to_page(conn->tx_data_alloc.va),
conn->tx_data_alloc.pagecnt_bias);
call_rcu(&conn->rcu, rxrpc_rcu_free_connection); call_rcu(&conn->rcu, rxrpc_rcu_free_connection);
} }

View File

@ -452,9 +452,7 @@ void rxrpc_destroy_local(struct rxrpc_local *local)
#endif #endif
rxrpc_purge_queue(&local->rx_queue); rxrpc_purge_queue(&local->rx_queue);
rxrpc_purge_client_connections(local); rxrpc_purge_client_connections(local);
if (local->tx_alloc.va) page_frag_cache_drain(&local->tx_alloc);
__page_frag_cache_drain(virt_to_page(local->tx_alloc.va),
local->tx_alloc.pagecnt_bias);
} }
/* /*

View File

@ -1608,7 +1608,6 @@ static void svc_tcp_sock_detach(struct svc_xprt *xprt)
static void svc_sock_free(struct svc_xprt *xprt) static void svc_sock_free(struct svc_xprt *xprt)
{ {
struct svc_sock *svsk = container_of(xprt, struct svc_sock, sk_xprt); struct svc_sock *svsk = container_of(xprt, struct svc_sock, sk_xprt);
struct page_frag_cache *pfc = &svsk->sk_frag_cache;
struct socket *sock = svsk->sk_sock; struct socket *sock = svsk->sk_sock;
trace_svcsock_free(svsk, sock); trace_svcsock_free(svsk, sock);
@ -1618,8 +1617,7 @@ static void svc_sock_free(struct svc_xprt *xprt)
sockfd_put(sock); sockfd_put(sock);
else else
sock_release(sock); sock_release(sock);
if (pfc->va)
__page_frag_cache_drain(virt_to_head_page(pfc->va), page_frag_cache_drain(&svsk->sk_frag_cache);
pfc->pagecnt_bias);
kfree(svsk); kfree(svsk);
} }

View File

@ -126,7 +126,7 @@ static int __init page_frag_test_init(void)
u64 duration; u64 duration;
int ret; int ret;
test_nc.va = NULL; page_frag_cache_init(&test_nc);
atomic_set(&nthreads, 2); atomic_set(&nthreads, 2);
init_completion(&wait); init_completion(&wait);