mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
net: introduce page_frag_cache_drain()
When draining a page_frag_cache, most user are doing the similar steps, so introduce an API to avoid code duplication. Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Acked-by: Jason Wang <jasowang@redhat.com> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
4bc0d63a23
commit
a0727489ac
@ -1276,17 +1276,10 @@ static void gve_unreg_xdp_info(struct gve_priv *priv)
|
||||
|
||||
static void gve_drain_page_cache(struct gve_priv *priv)
|
||||
{
|
||||
struct page_frag_cache *nc;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->rx_cfg.num_queues; i++) {
|
||||
nc = &priv->rx[i].page_cache;
|
||||
if (nc->va) {
|
||||
__page_frag_cache_drain(virt_to_page(nc->va),
|
||||
nc->pagecnt_bias);
|
||||
nc->va = NULL;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < priv->rx_cfg.num_queues; i++)
|
||||
page_frag_cache_drain(&priv->rx[i].page_cache);
|
||||
}
|
||||
|
||||
static void gve_qpls_get_curr_alloc_cfg(struct gve_priv *priv,
|
||||
|
@ -286,7 +286,6 @@ mtk_wed_wo_queue_free(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q)
|
||||
static void
|
||||
mtk_wed_wo_queue_tx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q)
|
||||
{
|
||||
struct page *page;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < q->n_desc; i++) {
|
||||
@ -301,19 +300,12 @@ mtk_wed_wo_queue_tx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q)
|
||||
entry->buf = NULL;
|
||||
}
|
||||
|
||||
if (!q->cache.va)
|
||||
return;
|
||||
|
||||
page = virt_to_page(q->cache.va);
|
||||
__page_frag_cache_drain(page, q->cache.pagecnt_bias);
|
||||
memset(&q->cache, 0, sizeof(q->cache));
|
||||
page_frag_cache_drain(&q->cache);
|
||||
}
|
||||
|
||||
static void
|
||||
mtk_wed_wo_queue_rx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
for (;;) {
|
||||
void *buf = mtk_wed_wo_dequeue(wo, q, NULL, true);
|
||||
|
||||
@ -323,12 +315,7 @@ mtk_wed_wo_queue_rx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q)
|
||||
skb_free_frag(buf);
|
||||
}
|
||||
|
||||
if (!q->cache.va)
|
||||
return;
|
||||
|
||||
page = virt_to_page(q->cache.va);
|
||||
__page_frag_cache_drain(page, q->cache.pagecnt_bias);
|
||||
memset(&q->cache, 0, sizeof(q->cache));
|
||||
page_frag_cache_drain(&q->cache);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1344,7 +1344,6 @@ static int nvme_tcp_alloc_async_req(struct nvme_tcp_ctrl *ctrl)
|
||||
|
||||
static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid)
|
||||
{
|
||||
struct page *page;
|
||||
struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl);
|
||||
struct nvme_tcp_queue *queue = &ctrl->queues[qid];
|
||||
unsigned int noreclaim_flag;
|
||||
@ -1355,11 +1354,7 @@ static void nvme_tcp_free_queue(struct nvme_ctrl *nctrl, int qid)
|
||||
if (queue->hdr_digest || queue->data_digest)
|
||||
nvme_tcp_free_crypto(queue);
|
||||
|
||||
if (queue->pf_cache.va) {
|
||||
page = virt_to_head_page(queue->pf_cache.va);
|
||||
__page_frag_cache_drain(page, queue->pf_cache.pagecnt_bias);
|
||||
queue->pf_cache.va = NULL;
|
||||
}
|
||||
page_frag_cache_drain(&queue->pf_cache);
|
||||
|
||||
noreclaim_flag = memalloc_noreclaim_save();
|
||||
/* ->sock will be released by fput() */
|
||||
|
@ -1591,7 +1591,6 @@ static void nvmet_tcp_free_cmd_data_in_buffers(struct nvmet_tcp_queue *queue)
|
||||
|
||||
static void nvmet_tcp_release_queue_work(struct work_struct *w)
|
||||
{
|
||||
struct page *page;
|
||||
struct nvmet_tcp_queue *queue =
|
||||
container_of(w, struct nvmet_tcp_queue, release_work);
|
||||
|
||||
@ -1615,8 +1614,7 @@ static void nvmet_tcp_release_queue_work(struct work_struct *w)
|
||||
if (queue->hdr_digest || queue->data_digest)
|
||||
nvmet_tcp_free_crypto(queue);
|
||||
ida_free(&nvmet_tcp_queue_ida, queue->idx);
|
||||
page = virt_to_head_page(queue->pf_cache.va);
|
||||
__page_frag_cache_drain(page, queue->pf_cache.pagecnt_bias);
|
||||
page_frag_cache_drain(&queue->pf_cache);
|
||||
kfree(queue);
|
||||
}
|
||||
|
||||
|
@ -311,6 +311,7 @@ extern void __free_pages(struct page *page, unsigned int order);
|
||||
extern void free_pages(unsigned long addr, unsigned int order);
|
||||
|
||||
struct page_frag_cache;
|
||||
void page_frag_cache_drain(struct page_frag_cache *nc);
|
||||
extern void __page_frag_cache_drain(struct page *page, unsigned int count);
|
||||
void *__page_frag_alloc_align(struct page_frag_cache *nc, unsigned int fragsz,
|
||||
gfp_t gfp_mask, unsigned int align_mask);
|
||||
|
@ -4699,6 +4699,16 @@ static struct page *__page_frag_cache_refill(struct page_frag_cache *nc,
|
||||
return page;
|
||||
}
|
||||
|
||||
void page_frag_cache_drain(struct page_frag_cache *nc)
|
||||
{
|
||||
if (!nc->va)
|
||||
return;
|
||||
|
||||
__page_frag_cache_drain(virt_to_head_page(nc->va), nc->pagecnt_bias);
|
||||
nc->va = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(page_frag_cache_drain);
|
||||
|
||||
void __page_frag_cache_drain(struct page *page, unsigned int count)
|
||||
{
|
||||
VM_BUG_ON_PAGE(page_ref_count(page) == 0, page);
|
||||
|
Loading…
Reference in New Issue
Block a user