]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDMA/core: not to set page dirty bit if it's already set.
authorQing Huang <qing.huang@oracle.com>
Thu, 18 May 2017 23:33:53 +0000 (16:33 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 6 Jul 2017 02:44:49 +0000 (19:44 -0700)
This change will optimize kernel memory deregistration operations.
__ib_umem_release() used to call set_page_dirty_lock() against every
writable page in its memory region. Its purpose is to keep data
synced between CPU and DMA device when swapping happens after mem
deregistration ops. Now we choose not to set page dirty bit if it's
already set by kernel prior to calling __ib_umem_release(). This
reduces memory deregistration time by half or even more when we ran
application simulation test program.

Orabug: 24313031

Signed-off-by: Qing Huang <qing.huang@oracle.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
(cherry picked from upstream commit 53376fedb9da54c0d3b0bd3a6edcbeb681692909)
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
drivers/infiniband/core/umem.c

index 522b2e99a021f43c1802ddf26436fd8fd71b3460..a5000539aa835fe5d4d9587b6d2bcb9ea2b8fafd 100644 (file)
@@ -67,7 +67,7 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d
        for_each_sg(umem->sg_head.sgl, sg, umem->npages, i) {
 
                page = sg_page(sg);
-               if (umem->writable && dirty)
+               if (!PageDirty(page) && umem->writable && dirty)
                        set_page_dirty_lock(page);
                put_page(page);
        }