Re: [PATCH] [net/9p] Small non-IO PDUs for zero-copy supporting transports.

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

 



On Thu, 17 Feb 2011 14:12:41 -0800, "Venkateswararao Jujjuri (JV)" <jvrao@xxxxxxxxxxxxxxxxxx> wrote:
> If a transport prefers payload to be sent separate from the PDU
> (P9_TRANS_PREF_PAYLOAD_SEP), there is no need to allocate msize
> PDU buffers(struct p9_fcall).
> 
> This patch allocates only upto 4k buffers for this kind of transports
> and there won't be any change to the legacy transports.
> 
> Hence, this patch on top of zero copy changes allows user to
> specify higher msizes through the mount option
> without hogging the kernel heap.
> 
> Signed-off-by: Venkateswararao Jujjuri <jvrao@xxxxxxxxxxxxxxxxxx>
> ---
>  include/net/9p/9p.h |    2 +-
>  net/9p/client.c     |   23 +++++++++++++++++------
>  2 files changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h
> index 7aefa6d..eaa45f9 100644
> --- a/include/net/9p/9p.h
> +++ b/include/net/9p/9p.h
> @@ -688,7 +688,7 @@ struct p9_rwstat {
>   * @id: protocol operating identifier of type &p9_msg_t
>   * @tag: transaction id of the request
>   * @offset: used by marshalling routines to track currentposition in buffer
> - * @capacity: used by marshalling routines to track total capacity
> + * @capacity: used by marshalling routines to track total malloc'd capacity
>   * @pubuf: Payload user buffer given by the caller
>   * @pubuf: Payload kernel buffer given by the caller
>   * @pbuf_size: pubuf/pkbuf(only one will be !NULL) size to be read/write.
> diff --git a/net/9p/client.c b/net/9p/client.c
> index 251abb1..43ec78a 100644
> --- a/net/9p/client.c
> +++ b/net/9p/client.c
> @@ -229,10 +229,23 @@ static struct p9_req_t *p9_tag_alloc(struct p9_client *c, u16 tag)
>  			return ERR_PTR(-ENOMEM);
>  		}
>  		init_waitqueue_head(req->wq);
> -		req->tc = kmalloc(sizeof(struct p9_fcall)+c->msize,
> -								GFP_KERNEL);
> -		req->rc = kmalloc(sizeof(struct p9_fcall)+c->msize,
> -								GFP_KERNEL);
> +		if ((c->trans_mod->pref & P9_TRANS_PREF_PAYLOAD_MASK) ==
> +				P9_TRANS_PREF_PAYLOAD_SEP) {
> +			int alloc_msize = min(c->msize, 4096);

value 4096 should be a #define with a comment explaining how we arrived
at value 4096 

> +			req->tc = kmalloc(sizeof(struct p9_fcall)+alloc_msize,
> +					GFP_KERNEL);
> +			req->tc->capacity = alloc_msize;
> +			req->rc = kmalloc(sizeof(struct p9_fcall)+alloc_msize,
> +					GFP_KERNEL);
> +			req->rc->capacity = alloc_msize;
> +		} else {
> +			req->tc = kmalloc(sizeof(struct p9_fcall)+c->msize,
> +					GFP_KERNEL);
> +			req->tc->capacity = c->msize;
> +			req->rc = kmalloc(sizeof(struct p9_fcall)+c->msize,
> +					GFP_KERNEL);
> +			req->rc->capacity = c->msize;
> +		}
>  		if ((!req->tc) || (!req->rc)) {
>  			printk(KERN_ERR "Couldn't grow tag array\n");
>  			kfree(req->tc);
> @@ -243,9 +256,7 @@ static struct p9_req_t *p9_tag_alloc(struct p9_client *c, u16 tag)
>  			return ERR_PTR(-ENOMEM);
>  		}
>  		req->tc->sdata = (char *) req->tc + sizeof(struct p9_fcall);
> -		req->tc->capacity = c->msize;
>  		req->rc->sdata = (char *) req->rc + sizeof(struct p9_fcall);
> -		req->rc->capacity = c->msize;
>  	}
> 
>  	p9pdu_reset(req->tc);

-aneesh
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux