All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick Caulfield <pcaulfie@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] Re: [DLM] Add support for tcp communications [38/70]
Date: Wed, 06 Dec 2006 15:10:37 +0000	[thread overview]
Message-ID: <4576DD6D.8080504@redhat.com> (raw)
In-Reply-To: <20061130225514.c050bd56.akpm@osdl.org>

Attached is a patch to fix up most of the things pointed out by akpm and Pavel Machek with comments below indicating why some things
have been left.

The patch is against -nmw

Andrew Morton wrote:
> 
>> +static struct nodeinfo *nodeid2nodeinfo(int nodeid, gfp_t alloc)
>> +{
>> +	struct nodeinfo *ni;
>> +	int r;
>> +	int n;
>> +
>> +	down_read(&nodeinfo_lock);
> 
> Given that this function can sleep, I wonder if `alloc' is useful.  
> 
> I see lots of callers passing in a literal "0" for `alloc'.  That's in fact
> a secret (GFP_ATOMIC & ~__GFP_HIGH).  I doubt if that's what you really
> meant.  Particularly as the code could at least have used __GFP_WAIT (aka
> GFP_NOIO) which is much, much more reliable than "0".  In fact "0" is the
> least reliable mode possible.
> 
> IOW, this is all bollixed up.

When 0 is passed into nodeid2nodeinfo the function does not try to allocate a
new structure at all. it's an indication that the caller only wants the nodeinfo
struct for that nodeid if there actually is one in existance.
I've tidied the function itself so it's more obvious, (and tidier!)


>> +/* Data received from remote end */
>> +static int receive_from_sock(void)
>> +{
>> +	int ret = 0;
>> +	struct msghdr msg;
>> +	struct kvec iov[2];
>> +	unsigned len;
>> +	int r;
>> +	struct sctp_sndrcvinfo *sinfo;
>> +	struct cmsghdr *cmsg;
>> +	struct nodeinfo *ni;
>> +
>> +	/* These two are marginally too big for stack allocation, but this
>> +	 * function is (currently) only called by dlm_recvd so static should be
>> +	 * OK.
>> +	 */
>> +	static struct sockaddr_storage msgname;
>> +	static char incmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
> 
> whoa.  This is globally singly-threaded code??

Yes. it is only ever run in the context of dlm_recvd.
>>
>> +static void initiate_association(int nodeid)
>> +{
>> +	struct sockaddr_storage rem_addr;
>> +	static char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
> 
> Another static buffer to worry about.  Globally singly-threaded code?

Yes. Only ever called by dlm_sendd.

>> +
>> +/* Send a message */
>> +static int send_to_sock(struct nodeinfo *ni)
>> +{
>> +	int ret = 0;
>> +	struct writequeue_entry *e;
>> +	int len, offset;
>> +	struct msghdr outmsg;
>> +	static char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
> 
> Singly-threaded?

Yep.

>>
>> +static void dealloc_nodeinfo(void)
>> +{
>> +	int i;
>> +
>> +	for (i=1; i<=max_nodeid; i++) {
>> +		struct nodeinfo *ni = nodeid2nodeinfo(i, 0);
>> +		if (ni) {
>> +			idr_remove(&nodeinfo_idr, i);
> 
> Didn't that need locking?

Not. it's only ever called at DLM shutdown after all the other threads
have been stopped.

>>
>> +static int write_list_empty(void)
>> +{
>> +	int status;
>> +
>> +	spin_lock_bh(&write_nodes_lock);
>> +	status = list_empty(&write_nodes);
>> +	spin_unlock_bh(&write_nodes_lock);
>> +
>> +	return status;
>> +}
> 
> This function's return value is meaningless.  As soon as the lock gets
> dropped, the return value can get out of sync with reality.
> 
> Looking at the caller, this _might_ happen to be OK, but it's a nasty and
> dangerous thing.  Really the locking should be moved into the caller.

It's just an optimisation to allow the caller to schedule if there is no work to
do. if something arrives immediately afterwards then it will get picked up when
the process re-awakes (and it will be woken by that arrival).


The 'accepting' atomic has gone completely. as Andrew pointed out it didn't really
achieve much anyway. I suspect it was a plaster over some other startup or shutdown bu
to be honest.

patrick


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: lowcomms.tidy
URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20061206/bc872d11/attachment.ksh>

      reply	other threads:[~2006-12-06 15:10 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-30 12:19 [Cluster-devel] [DLM] Add support for tcp communications [38/70] Steven Whitehouse
2006-11-30 12:19 ` Steven Whitehouse
2006-11-30 19:38 ` [Cluster-devel] " Pavel Machek
2006-11-30 19:38   ` Pavel Machek
2006-12-01  6:55 ` [Cluster-devel] " Andrew Morton
2006-12-01  6:55   ` Andrew Morton
2006-12-06 15:10   ` Patrick Caulfield [this message]

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=4576DD6D.8080504@redhat.com \
    --to=pcaulfie@redhat.com \
    /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.