--- v1
+++ v3
@@ -1,73 +1,114 @@
From: John Hubbard <jhubbard@nvidia.com>
For pages that were retained via get_user_pages*(), release those pages
-via the new put_user_page*() routines, instead of via put_page().
+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: Joerg Roedel <joro@8bytes.org>
-Cc: Paolo Bonzini <pbonzini@redhat.com>
-Cc: "Radim Krčmář" <rkrcmar@redhat.com>
-Cc: Thomas Gleixner <tglx@linutronix.de>
-Cc: Ingo Molnar <mingo@redhat.com>
-Cc: "H. Peter Anvin" <hpa@zytor.com>
-Cc: x86@kernel.org
-Cc: kvm@vger.kernel.org
+Cc: Santosh Shilimkar <santosh.shilimkar@oracle.com>
+Cc: David S. Miller <davem@davemloft.net>
+Cc: netdev@vger.kernel.org
+Cc: linux-rdma@vger.kernel.org
+Cc: rds-devel@oss.oracle.com
Signed-off-by: John Hubbard <jhubbard@nvidia.com>
---
- arch/x86/kvm/svm.c | 4 ++--
- virt/kvm/kvm_main.c | 4 ++--
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ 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/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
-index 7eafc6907861..ff93c923ed36 100644
---- a/arch/x86/kvm/svm.c
-+++ b/arch/x86/kvm/svm.c
-@@ -1827,7 +1827,7 @@ static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
+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 (npinned > 0)
-- release_pages(pages, npinned);
-+ put_user_pages(pages, npinned);
-
- kvfree(pages);
- return NULL;
-@@ -1838,7 +1838,7 @@ static void sev_unpin_memory(struct kvm *kvm, struct page **pages,
- {
- struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info;
-
-- release_pages(pages, npages);
-+ put_user_pages(pages, npages);
- kvfree(pages);
- sev->pages_locked -= npages;
- }
-diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
-index 887f3b0c2b60..4b6a596ea8e9 100644
---- a/virt/kvm/kvm_main.c
-+++ b/virt/kvm/kvm_main.c
-@@ -1499,7 +1499,7 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
-
- if (__get_user_pages_fast(addr, 1, 1, &wpage) == 1) {
- *writable = true;
-- put_page(page);
-+ put_user_page(page);
- page = wpage;
- }
- }
-@@ -1831,7 +1831,7 @@ EXPORT_SYMBOL_GPL(kvm_release_page_clean);
- void kvm_release_pfn_clean(kvm_pfn_t pfn)
- {
- if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn))
-- put_page(pfn_to_page(pfn));
-+ put_user_page(pfn_to_page(pfn));
- }
- EXPORT_SYMBOL_GPL(kvm_release_pfn_clean);
+ if (page)
+- put_page(page);
++ put_user_page(page);
+ rm->atomic.op_active = 0;
+ kfree(rm->atomic.op_notifier);
--
2.22.0
-
-_______________________________________________
-devel mailing list
-devel@linuxdriverproject.org
-http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel