From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: trond.myklebust@fys.uio.no, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 6/6] NSM: Serialize SM_MON and SM_UNMON upcalls
Date: Wed, 3 Dec 2008 16:41:42 -0500 [thread overview]
Message-ID: <20081203214142.GS16846@fieldses.org> (raw)
In-Reply-To: <20081201185812.10600.92501.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
On Mon, Dec 01, 2008 at 01:58:13PM -0500, Chuck Lever wrote:
> The Linux NSM implementation currently does nothing to prevent
> concurrent SM_MON and SM_UNMON upcalls regarding the same peer. Races
> could cause duplicate SM_MON upcalls for the same peer, or locking
> activity during server shutdown might cause SM_MON and SM_UNMON upcalls
> to occur in an arbitrary order.
>
> To avoid confusing rpc.statd, add a per-nsm_handle mutex to serialize
> the upcalls. To prevent duplicate upcalls, the mutex is held while the
> upcall is outstanding, and is not released until we can tell if the
> upcall succeeded.
>
> The nsm_monitor() function is called frequently. The extra inline
> function mitigates the overhead of taking the mutex. It is only taken
> if the nsm_handle is not already monitored.
>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
...
> diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
> index e2fa968..bf6c1c1 100644
> --- a/include/linux/lockd/lockd.h
> +++ b/include/linux/lockd/lockd.h
> @@ -76,6 +76,7 @@ struct nsm_handle {
> char * sm_mon_name;
> unsigned int sm_monitored : 1,
> sm_sticky : 1; /* don't unmonitor */
> + struct mutex sm_mutex;
> char sm_addrbuf[63]; /* presentation address */
> };
>
> @@ -236,9 +237,18 @@ void nsm_release(struct nsm_handle *);
> /*
> * Host monitoring
> */
> -int nsm_monitor(const struct nlm_host *host);
> +int __nsm_monitor(struct nsm_handle *nsm);
> void nsm_unmonitor(struct nsm_handle *nsm);
>
> +static inline int nsm_monitor(const struct nlm_host *host)
> +{
> + struct nsm_handle *nsm = host->h_nsmhandle;
> +
> + if (likely(nsm->sm_monitored))
> + return 0;
We also need to grep for places where sm_monitored is cleared, and
think about what happens in a race between one of those cases and
__nsm_monitor().
--b.
> + return __nsm_monitor(nsm);
> +}
> +
> /*
> * This is used in garbage collection and resource reclaim
> * A return value != 0 means destroy the lock/block/share
>
next prev parent reply other threads:[~2008-12-03 21:41 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-01 18:57 [PATCH 0/6] First set of patches for 2.6.29 Chuck Lever
[not found] ` <20081201185108.10600.21700.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-01 18:57 ` [PATCH 1/6] NLM: Remove address eye-catcher buffers from nlm_host Chuck Lever
[not found] ` <20081201185734.10600.88841.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 19:03 ` J. Bruce Fields
2008-12-03 19:10 ` Chuck Lever
2008-12-01 18:57 ` [PATCH 2/6] NLM: Support IPv6 scope IDs in nlm_display_address() Chuck Lever
[not found] ` <20081201185741.10600.7375.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 19:34 ` J. Bruce Fields
2008-12-03 19:46 ` J. Bruce Fields
2008-12-01 18:57 ` [PATCH 3/6] NSM: Support IPv6 version of mon_name Chuck Lever
[not found] ` <20081201185749.10600.38468.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 21:01 ` J. Bruce Fields
2008-12-03 21:19 ` Chuck Lever
2008-12-03 21:24 ` Chuck Lever
2008-12-01 18:57 ` [PATCH 4/6] NLM: Clean up nsm_monitor() call Chuck Lever
[not found] ` <20081201185757.10600.38854.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 21:08 ` J. Bruce Fields
2008-12-03 21:20 ` Chuck Lever
2008-12-01 18:58 ` [PATCH 5/6] " Chuck Lever
[not found] ` <20081201185805.10600.23630.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 21:28 ` J. Bruce Fields
2008-12-01 18:58 ` [PATCH 6/6] NSM: Serialize SM_MON and SM_UNMON upcalls Chuck Lever
[not found] ` <20081201185812.10600.92501.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-03 21:41 ` J. Bruce Fields [this message]
2008-12-04 0:38 ` Chuck Lever
2008-12-04 3:55 ` J. Bruce Fields
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=20081203214142.GS16846@fieldses.org \
--to=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@fys.uio.no \
/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.