SUNRPC: Remove XDRBUF_SPARSE_PAGES flag in gss_proxy upcall
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>
This commit is contained in:
Родитель
4b5cff7ed8
Коммит
5e54dafbe0
|
@ -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)
|
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++)
|
for (i = 0; i < arg->npages && arg->pages[i]; i++)
|
||||||
__free_page(arg->pages[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)
|
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->npages = DIV_ROUND_UP(NGROUPS_MAX * 4, PAGE_SIZE);
|
||||||
arg->pages = kcalloc(arg->npages, sizeof(struct page *), GFP_KERNEL);
|
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)
|
if (!arg->pages)
|
||||||
return -ENOMEM;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -771,7 +771,6 @@ void gssx_enc_accept_sec_context(struct rpc_rqst *req,
|
||||||
xdr_inline_pages(&req->rq_rcv_buf,
|
xdr_inline_pages(&req->rq_rcv_buf,
|
||||||
PAGE_SIZE/2 /* pretty arbitrary */,
|
PAGE_SIZE/2 /* pretty arbitrary */,
|
||||||
arg->pages, 0 /* page base */, arg->npages * PAGE_SIZE);
|
arg->pages, 0 /* page base */, arg->npages * PAGE_SIZE);
|
||||||
req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
|
|
||||||
done:
|
done:
|
||||||
if (err)
|
if (err)
|
||||||
dprintk("RPC: gssx_enc_accept_sec_context: %d\n", err);
|
dprintk("RPC: gssx_enc_accept_sec_context: %d\n", err);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче