SUNRPC: Remove XDRBUF_SPARSE_PAGES flag in gss_proxy upcall
authorChuck Lever <chuck.lever@oracle.com>
Tue, 24 Nov 2020 20:48:01 +0000 (15:48 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Wed, 9 Dec 2020 14:38:34 +0000 (09:38 -0500)
There's no need to defer allocation of pages for the receive buffer.

- This upcall is quite infrequent
- gssp_alloc_receive_pages() can allocate the pages with GFP_KERNEL,
  unlike the transport
- gssp_alloc_receive_pages() knows exactly how many pages are needed

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Olga Kornievskaia <kolga@netapp.com>
net/sunrpc/auth_gss/gss_rpc_upcall.c
net/sunrpc/auth_gss/gss_rpc_xdr.c

index af9c7f4..d1c003a 100644 (file)
@@ -200,7 +200,7 @@ static int gssp_call(struct net *net, struct rpc_message *msg)
 
 static void gssp_free_receive_pages(struct gssx_arg_accept_sec_context *arg)
 {
-       int i;
+       unsigned int i;
 
        for (i = 0; i < arg->npages && arg->pages[i]; i++)
                __free_page(arg->pages[i]);
@@ -210,14 +210,19 @@ static void gssp_free_receive_pages(struct gssx_arg_accept_sec_context *arg)
 
 static int gssp_alloc_receive_pages(struct gssx_arg_accept_sec_context *arg)
 {
+       unsigned int i;
+
        arg->npages = DIV_ROUND_UP(NGROUPS_MAX * 4, PAGE_SIZE);
        arg->pages = kcalloc(arg->npages, sizeof(struct page *), GFP_KERNEL);
-       /*
-        * XXX: actual pages are allocated by xdr layer in
-        * xdr_partial_copy_from_skb.
-        */
        if (!arg->pages)
                return -ENOMEM;
+       for (i = 0; i < arg->npages; i++) {
+               arg->pages[i] = alloc_page(GFP_KERNEL);
+               if (!arg->pages[i]) {
+                       gssp_free_receive_pages(arg);
+                       return -ENOMEM;
+               }
+       }
        return 0;
 }
 
index c636c64..d79f12c 100644 (file)
@@ -771,7 +771,6 @@ void gssx_enc_accept_sec_context(struct rpc_rqst *req,
        xdr_inline_pages(&req->rq_rcv_buf,
                PAGE_SIZE/2 /* pretty arbitrary */,
                arg->pages, 0 /* page base */, arg->npages * PAGE_SIZE);
-       req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
 done:
        if (err)
                dprintk("RPC:       gssx_enc_accept_sec_context: %d\n", err);