[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 02/34] net/rds: convert put_page() to put_user_page*()



From: John Hubbard <jhubbard@xxxxxxxxxx>

For pages that were retained via get_user_pages*(), release those pages
via the new put_user_page*() routines, instead of via put_page() or
release_pages().

This is part a tree-wide conversion, as described in commit fc1d8e7cca2d
("mm: introduce put_user_page*(), placeholder versions").

Cc: Santosh Shilimkar <santosh.shilimkar@xxxxxxxxxx>
Cc: David S. Miller <davem@xxxxxxxxxxxxx>
Cc: netdev@xxxxxxxxxxxxxxx
Cc: linux-rdma@xxxxxxxxxxxxxxx
Cc: rds-devel@xxxxxxxxxxxxxx
Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>
---
 net/rds/info.c    |  5 ++---
 net/rds/message.c |  2 +-
 net/rds/rdma.c    | 15 +++++++--------
 3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/net/rds/info.c b/net/rds/info.c
index 03f6fd56d237..ca6af2889adf 100644
--- a/net/rds/info.c
+++ b/net/rds/info.c
@@ -162,7 +162,6 @@ int rds_info_getsockopt(struct socket *sock, int optname, 
char __user *optval,
        struct rds_info_lengths lens;
        unsigned long nr_pages = 0;
        unsigned long start;
-       unsigned long i;
        rds_info_func func;
        struct page **pages = NULL;
        int ret;
@@ -235,8 +234,8 @@ int rds_info_getsockopt(struct socket *sock, int optname, 
char __user *optval,
                ret = -EFAULT;
 
 out:
-       for (i = 0; pages && i < nr_pages; i++)
-               put_page(pages[i]);
+       if (pages)
+               put_user_pages(pages, nr_pages);
        kfree(pages);
 
        return ret;
diff --git a/net/rds/message.c b/net/rds/message.c
index 50f13f1d4ae0..d7b0d266c437 100644
--- a/net/rds/message.c
+++ b/net/rds/message.c
@@ -404,7 +404,7 @@ static int rds_message_zcopy_from_user(struct rds_message 
*rm, struct iov_iter *
                        int i;
 
                        for (i = 0; i < rm->data.op_nents; i++)
-                               put_page(sg_page(&rm->data.op_sg[i]));
+                               put_user_page(sg_page(&rm->data.op_sg[i]));
                        mmp = &rm->data.op_mmp_znotifier->z_mmp;
                        mm_unaccount_pinned_pages(mmp);
                        ret = -EFAULT;
diff --git a/net/rds/rdma.c b/net/rds/rdma.c
index 916f5ec373d8..6762e8696b99 100644
--- a/net/rds/rdma.c
+++ b/net/rds/rdma.c
@@ -162,8 +162,7 @@ static int rds_pin_pages(unsigned long user_addr, unsigned 
int nr_pages,
                                  pages);
 
        if (ret >= 0 && ret < nr_pages) {
-               while (ret--)
-                       put_page(pages[ret]);
+               put_user_pages(pages, ret);
                ret = -EFAULT;
        }
 
@@ -276,7 +275,7 @@ static int __rds_rdma_map(struct rds_sock *rs, struct 
rds_get_mr_args *args,
 
        if (IS_ERR(trans_private)) {
                for (i = 0 ; i < nents; i++)
-                       put_page(sg_page(&sg[i]));
+                       put_user_page(sg_page(&sg[i]));
                kfree(sg);
                ret = PTR_ERR(trans_private);
                goto out;
@@ -464,9 +463,10 @@ void rds_rdma_free_op(struct rm_rdma_op *ro)
                 * to local memory */
                if (!ro->op_write) {
                        WARN_ON(!page->mapping && irqs_disabled());
-                       set_page_dirty(page);
+                       put_user_pages_dirty_lock(&page, 1, true);
+               } else {
+                       put_user_page(page);
                }
-               put_page(page);
        }
 
        kfree(ro->op_notifier);
@@ -481,8 +481,7 @@ void rds_atomic_free_op(struct rm_atomic_op *ao)
        /* Mark page dirty if it was possibly modified, which
         * is the case for a RDMA_READ which copies from remote
         * to local memory */
-       set_page_dirty(page);
-       put_page(page);
+       put_user_pages_dirty_lock(&page, 1, true);
 
        kfree(ao->op_notifier);
        ao->op_notifier = NULL;
@@ -867,7 +866,7 @@ int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message 
*rm,
        return ret;
 err:
        if (page)
-               put_page(page);
+               put_user_page(page);
        rm->atomic.op_active = 0;
        kfree(rm->atomic.op_notifier);
 
-- 
2.22.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.