All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <elder@inktank.com>
To: ceph-devel@vger.kernel.org
Subject: [PATCH 03/12] libceph: just set SOCK_CLOSED when state changes
Date: Thu, 21 Jun 2012 09:21:15 -0500	[thread overview]
Message-ID: <4FE32DDB.9080606@inktank.com> (raw)
In-Reply-To: <4FE32C84.2050408@inktank.com>

When a TCP_CLOSE or TCP_CLOSE_WAIT event occurs, the SOCK_CLOSED
connection flag bit is set, and if it had not been previously set
queue_con() is called to ensure con_work() will get a chance to
handle the changed state.

con_work() atomically checks--and if set, clears--the SOCK_CLOSED
bit if it was set.  This means that even if the bit were set
repeatedly, the related processing in con_work() only gets called
once per transition of the bit from 0 to 1.

What's important then is that we ensure con_work() gets called *at
least* once when a socket close event occurs, not that it gets
called *exactly* once.

The work queue mechanism already takes care of queueing work
only if it is not already queued, so there's no need for us
to call queue_con() conditionally.

So this patch just makes it so the SOCK_CLOSED flag gets set
unconditionally in ceph_sock_state_change().

Signed-off-by: Alex Elder <elder@inktank.com>
---
 net/ceph/messenger.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Index: b/net/ceph/messenger.c
===================================================================
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -261,8 +261,8 @@ static void ceph_sock_state_change(struc
 	case TCP_CLOSE_WAIT:
 		dout("%s TCP_CLOSE_WAIT\n", __func__);
 		con_sock_state_closing(con);
-		if (!test_and_set_bit(SOCK_CLOSED, &con->flags))
-			queue_con(con);
+		set_bit(SOCK_CLOSED, &con->flags);
+		queue_con(con);
 		break;
 	case TCP_ESTABLISHED:
 		dout("%s TCP_ESTABLISHED\n", __func__);

  parent reply	other threads:[~2012-06-21 14:21 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-21 14:15 [PATCH 00/12] more libceph changes Alex Elder
2012-06-21 14:20 ` [PATCH 01/12] libceph: SOCK_CLOSED is a flag, not a state Alex Elder
2012-06-21 14:21 ` [PATCH 02/12] libceph: don't change socket state on sock event Alex Elder
2012-06-21 14:21 ` Alex Elder [this message]
2012-06-21 14:21 ` [PATCH 04/12] libceph: don't touch con state in con_close_socket() Alex Elder
2012-06-21 14:21 ` [PATCH 05/12] libceph: clear CONNECTING in ceph_con_close() Alex Elder
2012-06-21 14:21 ` [PATCH 06/12] libceph: clear NEGOTIATING when done Alex Elder
2012-06-21 14:22 ` [PATCH 07/12] libceph: define and use an explicit CONNECTED state Alex Elder
2012-06-21 14:22 ` [PATCH 08/12] libceph: separate banner and connect writes Alex Elder
2012-06-21 14:22 ` [PATCH 09/12] libceph: distinguish two phases of connect sequence Alex Elder
2012-06-21 18:44   ` Sage Weil
2012-06-21 18:54     ` Alex Elder
2012-06-21 14:22 ` [PATCH 10/12] libceph: small changes to messenger.c Alex Elder
2012-06-21 14:22 ` [PATCH 11/12] libceph: make ceph_con_get() (etc.) private Alex Elder
2012-06-21 19:44   ` Sage Weil
2012-06-21 14:22 ` [PATCH 12/12] libceph: add some fine ASCII art Alex Elder

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=4FE32DDB.9080606@inktank.com \
    --to=elder@inktank.com \
    --cc=ceph-devel@vger.kernel.org \
    /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.