All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roman Kagan <rvkagan@yandex-team.ru>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: kwolf@redhat.com, qemu-block@nongnu.org, qemu-devel@nongnu.org,
	mreitz@redhat.com, den@openvz.org
Subject: Re: [PATCH 06/14] block/nbd: further segregation of connect-thread
Date: Thu, 8 Apr 2021 13:44:35 +0300	[thread overview]
Message-ID: <YG7ek9FHO59jlBUw@rvkaganb.lan> (raw)
In-Reply-To: <20210407104637.36033-7-vsementsov@virtuozzo.com>

On Wed, Apr 07, 2021 at 01:46:29PM +0300, Vladimir Sementsov-Ogievskiy wrote:
> Add personal state NBDConnectThread for connect-thread and
> nbd_connect_thread_start() function. Next step would be moving
> connect-thread to a separate file.
> 
> Note that we stop publishing thr->sioc during
> qio_channel_socket_connect_sync(). Which probably means that we can't
> early-cancel qio_channel_socket_connect_sync() call in
> nbd_free_connect_thread(). Still, when thread is detached it doesn't
> make big sense, and we have no guarantee anyway.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  block/nbd.c | 57 ++++++++++++++++++++++++++++++++++++-----------------
>  1 file changed, 39 insertions(+), 18 deletions(-)
> 
> diff --git a/block/nbd.c b/block/nbd.c
> index e16c6d636a..23eb8adab1 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -85,8 +85,6 @@ typedef enum NBDConnectThreadState {
>  } NBDConnectThreadState;
>  
>  typedef struct NBDConnectCB {
> -    /* Initialization constants */
> -    SocketAddress *saddr; /* address to connect to */
>      /*
>       * Bottom half to schedule on completion. Scheduled only if bh_ctx is not
>       * NULL
> @@ -103,6 +101,15 @@ typedef struct NBDConnectCB {
>      AioContext *bh_ctx; /* where to schedule bh (NULL means don't schedule) */
>  } NBDConnectCB;
>  
> +typedef void (*NBDConnectThreadCallback)(QIOChannelSocket *sioc, int ret,
> +                                         void *opaque);
> +
> +typedef struct NBDConnectThread {
> +    SocketAddress *saddr; /* address to connect to */
> +    NBDConnectThreadCallback cb;
> +    void *cb_opaque;
> +} NBDConnectThread;
> +
>  typedef struct BDRVNBDState {
>      QIOChannelSocket *sioc; /* The master data channel */
>      QIOChannel *ioc; /* The current I/O channel which may differ (eg TLS) */
> @@ -367,7 +374,6 @@ static void nbd_init_connect_thread(BDRVNBDState *s)
>      s->connect_thread = g_new(NBDConnectCB, 1);
>  
>      *s->connect_thread = (NBDConnectCB) {
> -        .saddr = QAPI_CLONE(SocketAddress, s->saddr),
>          .state = CONNECT_THREAD_NONE,
>          .bh_func = connect_bh,
>          .bh_opaque = s,
> @@ -378,20 +384,18 @@ static void nbd_init_connect_thread(BDRVNBDState *s)
>  
>  static void nbd_free_connect_thread(NBDConnectCB *thr)
>  {
> -    if (thr->sioc) {
> -        qio_channel_close(QIO_CHANNEL(thr->sioc), NULL);
> -    }

Doesn't this result in an open channel leak?  (The original code here
seems to be missing an unref, too.)

> -    qapi_free_SocketAddress(thr->saddr);
>      g_free(thr);
>  }
>  
> -static void connect_thread_cb(int ret, void *opaque)
> +static void connect_thread_cb(QIOChannelSocket *sioc, int ret, void *opaque)
>  {
>      NBDConnectCB *thr = opaque;
>      bool do_free = false;
>  
>      qemu_mutex_lock(&thr->mutex);
>  
> +    thr->sioc = sioc;
> +
>      switch (thr->state) {
>      case CONNECT_THREAD_RUNNING:
>          thr->state = ret < 0 ? CONNECT_THREAD_FAIL : CONNECT_THREAD_SUCCESS;
> @@ -418,27 +422,45 @@ static void connect_thread_cb(int ret, void *opaque)
>  
>  static void *connect_thread_func(void *opaque)
>  {
> -    NBDConnectCB *thr = opaque;
> +    NBDConnectThread *thr = opaque;
>      int ret;
> +    QIOChannelSocket *sioc = qio_channel_socket_new();
>  
> -    thr->sioc = qio_channel_socket_new();
> -
> -    ret = qio_channel_socket_connect_sync(thr->sioc, thr->saddr, NULL);
> +    ret = qio_channel_socket_connect_sync(sioc, thr->saddr, NULL);
>      if (ret < 0) {
> -        object_unref(OBJECT(thr->sioc));
> -        thr->sioc = NULL;
> +        object_unref(OBJECT(sioc));
> +        sioc = NULL;
>      }
>  
> -    connect_thread_cb(ret, thr);
> +    thr->cb(sioc, ret, thr->cb_opaque);
> +
> +    qapi_free_SocketAddress(thr->saddr);
> +    g_free(thr);
>  
>      return NULL;
>  }
>  
> +static void nbd_connect_thread_start(const SocketAddress *saddr,
> +                                     NBDConnectThreadCallback cb,
> +                                     void *cb_opaque)
> +{
> +    QemuThread thread;
> +    NBDConnectThread *thr = g_new(NBDConnectThread, 1);
> +
> +    *thr = (NBDConnectThread) {
> +        .saddr = QAPI_CLONE(SocketAddress, saddr),
> +        .cb = cb,
> +        .cb_opaque = cb_opaque,
> +    };
> +
> +    qemu_thread_create(&thread, "nbd-connect",
> +                       connect_thread_func, thr, QEMU_THREAD_DETACHED);
> +}
> +
>  static int coroutine_fn
>  nbd_co_establish_connection(BlockDriverState *bs)
>  {
>      int ret;
> -    QemuThread thread;
>      BDRVNBDState *s = bs->opaque;
>      NBDConnectCB *thr = s->connect_thread;
>  
> @@ -448,8 +470,7 @@ nbd_co_establish_connection(BlockDriverState *bs)
>      case CONNECT_THREAD_FAIL:
>      case CONNECT_THREAD_NONE:
>          thr->state = CONNECT_THREAD_RUNNING;
> -        qemu_thread_create(&thread, "nbd-connect",
> -                           connect_thread_func, thr, QEMU_THREAD_DETACHED);
> +        nbd_connect_thread_start(s->saddr, connect_thread_cb, thr);
>          break;
>      case CONNECT_THREAD_SUCCESS:
>          /* Previous attempt finally succeeded in background */
> -- 
> 2.29.2
> 


  reply	other threads:[~2021-04-08 10:46 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07 10:46 [PATCH 00/14] nbd: move reconnect-thread to separate file Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 01/14] block/nbd: BDRVNBDState: drop unused connect_err Vladimir Sementsov-Ogievskiy
2021-04-07 11:13   ` Roman Kagan
2021-04-07 10:46 ` [PATCH 02/14] block/nbd: nbd_co_establish_connection(): drop unused errp Vladimir Sementsov-Ogievskiy
2021-04-07 11:28   ` Roman Kagan
2021-04-07 10:46 ` [PATCH 03/14] block/nbd: drop unused NBDConnectThread::err field Vladimir Sementsov-Ogievskiy
2021-04-07 11:42   ` Roman Kagan
2021-04-07 11:55     ` Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 04/14] block/nbd: split connect_thread_cb() out of connect_thread_func() Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 05/14] block/nbd: rename NBDConnectThread to NBDConnectCB Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 06/14] block/nbd: further segregation of connect-thread Vladimir Sementsov-Ogievskiy
2021-04-08 10:44   ` Roman Kagan [this message]
2021-04-07 10:46 ` [PATCH 07/14] block/nbd: drop nbd_free_connect_thread() Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 08/14] block/nbd: move nbd connect-thread to nbd/client-connect.c Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 09/14] block/nbd: NBDConnectCB: drop bh_* fields Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 10/14] block/nbd: move wait_connect field under mutex protection Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 11/14] block/nbd: refactor connect_bh() Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 12/14] block/nbd: refactor nbd_co_establish_connection Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 13/14] block/nbd: nbd_co_establish_connection_cancel(): rename wake to do_wake Vladimir Sementsov-Ogievskiy
2021-04-07 10:46 ` [PATCH 14/14] block/nbd: drop thr->state Vladimir Sementsov-Ogievskiy
2021-04-08 10:03 ` DROP THIS Re: [PATCH 00/14] nbd: move reconnect-thread to separate file Vladimir Sementsov-Ogievskiy

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=YG7ek9FHO59jlBUw@rvkaganb.lan \
    --to=rvkagan@yandex-team.ru \
    --cc=den@openvz.org \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.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.