From: John Hubbard <jhubbard@xxxxxxxxxx> While converting call sites to use put_user_page*() [1], quite a few places ended up needing a single-page routine to put and dirty a page. Provide put_user_page_dirty() and put_user_page_dirty_lock(), and use them in a few places: net/xdp, drm/via/, drivers/infiniband. Cc: Jason Gunthorpe <jgg@xxxxxxxx> Cc: Jan Kara <jack@xxxxxxx> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx> --- drivers/gpu/drm/via/via_dmablit.c | 2 +- drivers/infiniband/core/umem.c | 2 +- drivers/infiniband/hw/usnic/usnic_uiom.c | 2 +- include/linux/mm.h | 10 ++++++++++ net/xdp/xdp_umem.c | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c index 219827ae114f..d30b2d75599f 100644 --- a/drivers/gpu/drm/via/via_dmablit.c +++ b/drivers/gpu/drm/via/via_dmablit.c @@ -189,7 +189,7 @@ via_free_sg_info(struct pci_dev *pdev, drm_via_sg_info_t *vsg) for (i = 0; i < vsg->num_pages; ++i) { if (NULL != (page = vsg->pages[i])) { if (!PageReserved(page) && (DMA_FROM_DEVICE == vsg->direction)) - put_user_pages_dirty(&page, 1); + put_user_page_dirty(page); else put_user_page(page); } diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 08da840ed7ee..a7337cc3ca20 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -55,7 +55,7 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d for_each_sg_page(umem->sg_head.sgl, &sg_iter, umem->sg_nents, 0) { page = sg_page_iter_page(&sg_iter); if (umem->writable && dirty) - put_user_pages_dirty_lock(&page, 1); + put_user_page_dirty_lock(page); else put_user_page(page); } diff --git a/drivers/infiniband/hw/usnic/usnic_uiom.c b/drivers/infiniband/hw/usnic/usnic_uiom.c index 0b0237d41613..d2ded624fb2a 100644 --- a/drivers/infiniband/hw/usnic/usnic_uiom.c +++ b/drivers/infiniband/hw/usnic/usnic_uiom.c @@ -76,7 +76,7 @@ static void usnic_uiom_put_pages(struct list_head *chunk_list, int dirty) page = sg_page(sg); pa = sg_phys(sg); if (dirty) - put_user_pages_dirty_lock(&page, 1); + put_user_page_dirty_lock(page); else put_user_page(page); usnic_dbg("pa: %pa\n", &pa); diff --git a/include/linux/mm.h b/include/linux/mm.h index 0334ca97c584..c0584c6d9d78 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1061,6 +1061,16 @@ void put_user_pages_dirty(struct page **pages, unsigned long npages); void put_user_pages_dirty_lock(struct page **pages, unsigned long npages); void put_user_pages(struct page **pages, unsigned long npages); +static inline void put_user_page_dirty(struct page *page) +{ + put_user_pages_dirty(&page, 1); +} + +static inline void put_user_page_dirty_lock(struct page *page) +{ + put_user_pages_dirty_lock(&page, 1); +} + #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) #define SECTION_IN_PAGE_FLAGS #endif diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c index 9cbbb96c2a32..1d122e52c6de 100644 --- a/net/xdp/xdp_umem.c +++ b/net/xdp/xdp_umem.c @@ -171,7 +171,7 @@ static void xdp_umem_unpin_pages(struct xdp_umem *umem) for (i = 0; i < umem->npgs; i++) { struct page *page = umem->pgs[i]; - put_user_pages_dirty_lock(&page, 1); + put_user_page_dirty_lock(page); } kfree(umem->pgs); -- 2.22.0