All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steve Dickson <SteveD@redhat.com>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: nfs@lists.sourceforge.net
Subject: Re: [PATCH v2] reduce NFS stack usage
Date: Thu, 25 Sep 2003 14:36:36 -0400	[thread overview]
Message-ID: <3F7335B4.1070002@RedHat.com> (raw)
In-Reply-To: <mailman.1064420466.30286.linux-kernel2news@redhat.com>

Hey Jeff,

Question:
Why are only nfs_lookup_revalidate() and nfs_readdir()
a problem and not the other 4 ops (like nfs_lookup())?
Is the case only those two showed up in the stack overflow
oops trace?

Also, not like there much choice in matter, but I wonder what
type of performance hit (if any) there will be by making
these routines call kmalloc()... lookups and readdirs are
pretty popular ops...

SteveD.

Jeff Garzik wrote:
> David Mansfield spotted a bug in a memset() call, in my initial patch.
> 
> Attached is an updated version.  The only change is 
> s/sizeof(my_entry)/sizeof(*my_entry)/ in the memset.
> 
>     Jeff
> 
> 
> 
> ------------------------------------------------------------------------
> 
> 
> ===== fs/nfs/dir.c 1.12 vs edited =====
> --- 1.12/fs/nfs/dir.c	Tue Oct 15 00:59:27 2002
> +++ edited/fs/nfs/dir.c	Mon Sep 22 15:08:27 2003
> @@ -349,14 +349,25 @@
>  {
>  	struct dentry	*dentry = filp->f_dentry;
>  	struct inode	*inode = dentry->d_inode;
> -	nfs_readdir_descriptor_t my_desc,
> -			*desc = &my_desc;
> -	struct nfs_entry my_entry;
> +	nfs_readdir_descriptor_t *desc;
> +	struct nfs_entry *my_entry;
>  	long		res;
> +	int		rc = -EINVAL;
> +	void		*mem;
> +
> +	mem = kmalloc(sizeof(struct nfs_entry) +
> +		      sizeof(nfs_readdir_descriptor_t), GFP_KERNEL);
> +	if (!mem)
> +		return -ENOMEM;
> +
> +	my_entry = mem;
> +	desc = mem + sizeof(struct nfs_entry);
>  
>  	res = nfs_revalidate(dentry);
> -	if (res < 0)
> -		return res;
> +	if (res < 0) {
> +		rc = (int) res;
> +		goto out;
> +	}
>  
>  	/*
>  	 * filp->f_pos points to the file offset in the page cache.
> @@ -365,11 +376,11 @@
>  	 * itself.
>  	 */
>  	memset(desc, 0, sizeof(*desc));
> -	memset(&my_entry, 0, sizeof(my_entry));
> +	memset(my_entry, 0, sizeof(*my_entry));
>  
>  	desc->file = filp;
>  	desc->target = filp->f_pos;
> -	desc->entry = &my_entry;
> +	desc->entry = my_entry;
>  	desc->decode = NFS_PROTO(inode)->decode_dirent;
>  
>  	while(!desc->entry->eof) {
> @@ -393,11 +404,16 @@
>  			break;
>  		}
>  	}
> +
>  	if (desc->error < 0)
> -		return desc->error;
> -	if (res < 0)
> -		return res;
> -	return 0;
> +		rc = desc->error;
> +	else if (res < 0)
> +		rc = res;
> +	/* fall through */
> +
> +out:
> +	kfree(mem);
> +	return rc;
>  }
>  
>  /*
> @@ -476,13 +492,22 @@
>  	struct inode *dir;
>  	struct inode *inode;
>  	int error;
> -	struct nfs_fh fhandle;
> -	struct nfs_fattr fattr;
> +	struct nfs_fh *fhandle;
> +	struct nfs_fattr *fattr;
> +	void *mem;
> +	int rc = 0;
>  
>  	lock_kernel();
>  	dir = dentry->d_parent->d_inode;
>  	inode = dentry->d_inode;
>  
> +	mem = kmalloc(sizeof(struct nfs_fh) + sizeof(struct nfs_fattr),
> +		      GFP_KERNEL);
> +	if (!mem)
> +		goto out_bad;
> +	fhandle = mem;
> +	fattr = mem + sizeof(struct nfs_fh);
> +
>  	if (!inode) {
>  		if (nfs_neg_need_reval(dir, dentry))
>  			goto out_bad;
> @@ -505,18 +530,19 @@
>  	if (NFS_STALE(inode))
>  		goto out_bad;
>  
> -	error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr);
> +	error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
>  	if (error)
>  		goto out_bad;
> -	if (memcmp(NFS_FH(inode), &fhandle, sizeof(struct nfs_fh))!= 0)
> +	if (memcmp(NFS_FH(inode), fhandle, sizeof(struct nfs_fh))!= 0)
>  		goto out_bad;
> -	if ((error = nfs_refresh_inode(inode, &fattr)) != 0)
> +	if ((error = nfs_refresh_inode(inode, fattr)) != 0)
>  		goto out_bad;
>  
>  	nfs_renew_times(dentry);
>   out_valid:
> -	unlock_kernel();
> -	return 1;
> + 	rc = 1;
> +	goto out;
> +
>   out_bad:
>  	NFS_CACHEINV(dir);
>  	if (inode && S_ISDIR(inode->i_mode)) {
> @@ -528,8 +554,14 @@
>  		shrink_dcache_parent(dentry);
>  	}
>  	d_drop(dentry);
> +	rc = 0;
> +	/* fall through */
> +
> +out:
>  	unlock_kernel();
> -	return 0;
> +	if (mem)
> +		kfree(mem);
> +	return rc;
>  }
>  
>  /*
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> 



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
NFS maillist  -  NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs

       reply	other threads:[~2003-09-25 18:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.1064420466.30286.linux-kernel2news@redhat.com>
2003-09-25 18:36 ` Steve Dickson [this message]
2003-09-25 19:37   ` [NFS] Re: [PATCH v2] reduce NFS stack usage Trond Myklebust
2003-09-30  1:55     ` Steve Dickson
2003-09-30 15:31       ` UPDATED: " Steve Dickson
     [not found]   ` <mailman.1064518981.2825.linux-kernel2news@redhat.com>
2003-09-25 21:10     ` Steve Dickson
2003-09-26  0:07   ` Jeff Garzik
2003-09-24 16:16 Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3F7335B4.1070002@RedHat.com \
    --to=steved@redhat.com \
    --cc=jgarzik@pobox.com \
    --cc=nfs@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.