From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43674) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wg85I-0005yM-TP for qemu-devel@nongnu.org; Fri, 02 May 2014 03:40:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wg859-000075-KV for qemu-devel@nongnu.org; Fri, 02 May 2014 03:40:40 -0400 Received: from mail-ee0-x234.google.com ([2a00:1450:4013:c00::234]:64514) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wg858-00006r-TH for qemu-devel@nongnu.org; Fri, 02 May 2014 03:40:31 -0400 Received: by mail-ee0-f52.google.com with SMTP id e53so2836302eek.39 for ; Fri, 02 May 2014 00:40:30 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <53634BE8.6010007@redhat.com> Date: Fri, 02 May 2014 09:40:24 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1398956086-20171-1-git-send-email-stefanha@redhat.com> <1398956086-20171-10-git-send-email-stefanha@redhat.com> In-Reply-To: <1398956086-20171-10-git-send-email-stefanha@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 09/22] nbd: implement .bdrv_detach/attach_aio_context() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi , qemu-devel@nongnu.org Cc: Kevin Wolf , "Shergill, Gurinder" , "Vinod, Chegu" Il 01/05/2014 16:54, Stefan Hajnoczi ha scritto: > Drop the assumption that we're using the main AioContext. Convert > qemu_aio_set_fd_handler() calls to aio_set_fd_handler(). > > The .bdrv_detach/attach_aio_context() interfaces also need to be > implemented to move the socket fd handler from the old to the new > AioContext. > > Cc: Paolo Bonzini > Signed-off-by: Stefan Hajnoczi > --- > block/nbd-client.c | 24 ++++++++++++--- > block/nbd-client.h | 4 +++ > block/nbd.c | 87 +++++++++++++++++++++++++++++++++--------------------- > 3 files changed, 78 insertions(+), 37 deletions(-) > > diff --git a/block/nbd-client.c b/block/nbd-client.c > index 7d698cb..6e1c97c 100644 > --- a/block/nbd-client.c > +++ b/block/nbd-client.c > @@ -49,7 +49,7 @@ static void nbd_teardown_connection(NbdClientSession *client) > shutdown(client->sock, 2); > nbd_recv_coroutines_enter_all(client); > > - qemu_aio_set_fd_handler(client->sock, NULL, NULL, NULL); > + nbd_client_session_detach_aio_context(client); > closesocket(client->sock); > client->sock = -1; > } > @@ -103,11 +103,14 @@ static int nbd_co_send_request(NbdClientSession *s, > struct nbd_request *request, > QEMUIOVector *qiov, int offset) > { > + AioContext *aio_context; > int rc, ret; > > qemu_co_mutex_lock(&s->send_mutex); > s->send_coroutine = qemu_coroutine_self(); > - qemu_aio_set_fd_handler(s->sock, nbd_reply_ready, nbd_restart_write, s); > + aio_context = bdrv_get_aio_context(s->bs); > + aio_set_fd_handler(aio_context, s->sock, > + nbd_reply_ready, nbd_restart_write, s); > if (qiov) { > if (!s->is_unix) { > socket_set_cork(s->sock, 1); > @@ -126,7 +129,7 @@ static int nbd_co_send_request(NbdClientSession *s, > } else { > rc = nbd_send_request(s->sock, request); > } > - qemu_aio_set_fd_handler(s->sock, nbd_reply_ready, NULL, s); > + aio_set_fd_handler(aio_context, s->sock, nbd_reply_ready, NULL, s); > s->send_coroutine = NULL; > qemu_co_mutex_unlock(&s->send_mutex); > return rc; > @@ -335,6 +338,19 @@ int nbd_client_session_co_discard(NbdClientSession *client, int64_t sector_num, > > } > > +void nbd_client_session_detach_aio_context(NbdClientSession *client) > +{ > + aio_set_fd_handler(bdrv_get_aio_context(client->bs), client->sock, > + NULL, NULL, NULL); > +} > + > +void nbd_client_session_attach_aio_context(NbdClientSession *client, > + AioContext *new_context) > +{ > + aio_set_fd_handler(new_context, client->sock, > + nbd_reply_ready, NULL, client); > +} > + > void nbd_client_session_close(NbdClientSession *client) > { > struct nbd_request request = { > @@ -381,7 +397,7 @@ int nbd_client_session_init(NbdClientSession *client, BlockDriverState *bs, > /* Now that we're connected, set the socket to be non-blocking and > * kick the reply mechanism. */ > qemu_set_nonblock(sock); > - qemu_aio_set_fd_handler(sock, nbd_reply_ready, NULL, client); > + nbd_client_session_attach_aio_context(client, bdrv_get_aio_context(bs)); > > logout("Established connection with NBD server\n"); > return 0; > diff --git a/block/nbd-client.h b/block/nbd-client.h > index f2a6337..cd478f3 100644 > --- a/block/nbd-client.h > +++ b/block/nbd-client.h > @@ -47,4 +47,8 @@ int nbd_client_session_co_writev(NbdClientSession *client, int64_t sector_num, > int nbd_client_session_co_readv(NbdClientSession *client, int64_t sector_num, > int nb_sectors, QEMUIOVector *qiov); > > +void nbd_client_session_detach_aio_context(NbdClientSession *client); > +void nbd_client_session_attach_aio_context(NbdClientSession *client, > + AioContext *new_context); > + > #endif /* NBD_CLIENT_H */ > diff --git a/block/nbd.c b/block/nbd.c > index 613f258..4eda095 100644 > --- a/block/nbd.c > +++ b/block/nbd.c > @@ -323,46 +323,67 @@ static int64_t nbd_getlength(BlockDriverState *bs) > return s->client.size; > } > > +static void nbd_detach_aio_context(BlockDriverState *bs) > +{ > + BDRVNBDState *s = bs->opaque; > + > + nbd_client_session_detach_aio_context(&s->client); > +} > + > +static void nbd_attach_aio_context(BlockDriverState *bs, > + AioContext *new_context) > +{ > + BDRVNBDState *s = bs->opaque; > + > + nbd_client_session_attach_aio_context(&s->client, new_context); > +} > + > static BlockDriver bdrv_nbd = { > - .format_name = "nbd", > - .protocol_name = "nbd", > - .instance_size = sizeof(BDRVNBDState), > - .bdrv_parse_filename = nbd_parse_filename, > - .bdrv_file_open = nbd_open, > - .bdrv_co_readv = nbd_co_readv, > - .bdrv_co_writev = nbd_co_writev, > - .bdrv_close = nbd_close, > - .bdrv_co_flush_to_os = nbd_co_flush, > - .bdrv_co_discard = nbd_co_discard, > - .bdrv_getlength = nbd_getlength, > + .format_name = "nbd", > + .protocol_name = "nbd", > + .instance_size = sizeof(BDRVNBDState), > + .bdrv_parse_filename = nbd_parse_filename, > + .bdrv_file_open = nbd_open, > + .bdrv_co_readv = nbd_co_readv, > + .bdrv_co_writev = nbd_co_writev, > + .bdrv_close = nbd_close, > + .bdrv_co_flush_to_os = nbd_co_flush, > + .bdrv_co_discard = nbd_co_discard, > + .bdrv_getlength = nbd_getlength, > + .bdrv_detach_aio_context = nbd_detach_aio_context, > + .bdrv_attach_aio_context = nbd_attach_aio_context, > }; > > static BlockDriver bdrv_nbd_tcp = { > - .format_name = "nbd", > - .protocol_name = "nbd+tcp", > - .instance_size = sizeof(BDRVNBDState), > - .bdrv_parse_filename = nbd_parse_filename, > - .bdrv_file_open = nbd_open, > - .bdrv_co_readv = nbd_co_readv, > - .bdrv_co_writev = nbd_co_writev, > - .bdrv_close = nbd_close, > - .bdrv_co_flush_to_os = nbd_co_flush, > - .bdrv_co_discard = nbd_co_discard, > - .bdrv_getlength = nbd_getlength, > + .format_name = "nbd", > + .protocol_name = "nbd+tcp", > + .instance_size = sizeof(BDRVNBDState), > + .bdrv_parse_filename = nbd_parse_filename, > + .bdrv_file_open = nbd_open, > + .bdrv_co_readv = nbd_co_readv, > + .bdrv_co_writev = nbd_co_writev, > + .bdrv_close = nbd_close, > + .bdrv_co_flush_to_os = nbd_co_flush, > + .bdrv_co_discard = nbd_co_discard, > + .bdrv_getlength = nbd_getlength, > + .bdrv_detach_aio_context = nbd_detach_aio_context, > + .bdrv_attach_aio_context = nbd_attach_aio_context, > }; > > static BlockDriver bdrv_nbd_unix = { > - .format_name = "nbd", > - .protocol_name = "nbd+unix", > - .instance_size = sizeof(BDRVNBDState), > - .bdrv_parse_filename = nbd_parse_filename, > - .bdrv_file_open = nbd_open, > - .bdrv_co_readv = nbd_co_readv, > - .bdrv_co_writev = nbd_co_writev, > - .bdrv_close = nbd_close, > - .bdrv_co_flush_to_os = nbd_co_flush, > - .bdrv_co_discard = nbd_co_discard, > - .bdrv_getlength = nbd_getlength, > + .format_name = "nbd", > + .protocol_name = "nbd+unix", > + .instance_size = sizeof(BDRVNBDState), > + .bdrv_parse_filename = nbd_parse_filename, > + .bdrv_file_open = nbd_open, > + .bdrv_co_readv = nbd_co_readv, > + .bdrv_co_writev = nbd_co_writev, > + .bdrv_close = nbd_close, > + .bdrv_co_flush_to_os = nbd_co_flush, > + .bdrv_co_discard = nbd_co_discard, > + .bdrv_getlength = nbd_getlength, > + .bdrv_detach_aio_context = nbd_detach_aio_context, > + .bdrv_attach_aio_context = nbd_attach_aio_context, > }; > > static void bdrv_nbd_init(void) > Acked-by: Paolo Bonzini