From: Paolo Bonzini <pbonzini@redhat.com>
To: Fam Zheng <famz@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Jason Wang <jasowang@redhat.com>,
Vincenzo Maffione <v.maffione@gmail.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Giuseppe Lettieri <g.lettieri@iet.unipi.it>,
Luigi Rizzo <rizzo@iet.unipi.it>
Subject: Re: [Qemu-devel] [RFC PATCH 2/8] qemu-nbd: Switch to qemu_set_fd_handler
Date: Wed, 29 Apr 2015 12:41:10 +0200 [thread overview]
Message-ID: <5540B546.4040305@redhat.com> (raw)
In-Reply-To: <1430303875-31647-3-git-send-email-famz@redhat.com>
On 29/04/2015 12:37, Fam Zheng wrote:
> Achieved by:
>
> - Remembering the server fd with a global variable, in order to access
> it from nbd_client_closed.
>
> - Checking nbd_can_accept() and updating server_fd handler whenever
> client connects or disconnects.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> qemu-nbd.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index 7e690ff..5af6d11 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -53,6 +53,7 @@ static int persistent = 0;
> static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
> static int shared = 1;
> static int nb_fds;
> +static int server_fd;
>
> static void usage(const char *name)
> {
> @@ -340,7 +341,7 @@ out:
> return (void *) EXIT_FAILURE;
> }
>
> -static int nbd_can_accept(void *opaque)
> +static int nbd_can_accept(void)
> {
> return nb_fds < shared;
> }
> @@ -351,19 +352,21 @@ static void nbd_export_closed(NBDExport *exp)
> state = TERMINATED;
> }
>
> +static void nbd_update_server_fd_handler(int fd);
> +
> static void nbd_client_closed(NBDClient *client)
> {
> nb_fds--;
> if (nb_fds == 0 && !persistent && state == RUNNING) {
> state = TERMINATE;
> }
> + nbd_update_server_fd_handler(server_fd);
> qemu_notify_event();
> nbd_client_put(client);
> }
>
> static void nbd_accept(void *opaque)
> {
> - int server_fd = (uintptr_t) opaque;
> struct sockaddr_in addr;
> socklen_t addr_len = sizeof(addr);
>
> @@ -380,12 +383,22 @@ static void nbd_accept(void *opaque)
>
> if (nbd_client_new(exp, fd, nbd_client_closed)) {
> nb_fds++;
> + nbd_update_server_fd_handler(server_fd);
> } else {
> shutdown(fd, 2);
> close(fd);
> }
> }
>
> +static void nbd_update_server_fd_handler(int fd)
> +{
> + if (nbd_can_accept()) {
> + qemu_set_fd_handler(fd, nbd_accept, NULL, (void *)(uintptr_t)fd);
> + } else {
> + qemu_set_fd_handler(fd, NULL, NULL, NULL);
> + }
> +}
> +
> int main(int argc, char **argv)
> {
> BlockBackend *blk;
> @@ -761,8 +774,8 @@ int main(int argc, char **argv)
> memset(&client_thread, 0, sizeof(client_thread));
> }
>
> - qemu_set_fd_handler2(fd, nbd_can_accept, nbd_accept, NULL,
> - (void *)(uintptr_t)fd);
> + server_fd = fd;
> + nbd_update_server_fd_handler(fd);
>
> /* now when the initialization is (almost) complete, chdir("/")
> * to free any busy filesystems */
>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
next prev parent reply other threads:[~2015-04-29 10:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-29 10:37 [Qemu-devel] [RFC PATCH 0/8] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2 Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 1/8] stubs: Add qemu_set_fd_handler Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 2/8] qemu-nbd: Switch to qemu_set_fd_handler Fam Zheng
2015-04-29 10:41 ` Paolo Bonzini [this message]
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 3/8] l2tpv3: Drop l2tpv3_can_send Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 4/8] netmap: Drop netmap_can_send Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 5/8] net/socket: Drop net_socket_can_send Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 6/8] tap: Drop tap_can_send Fam Zheng
2015-04-29 11:05 ` Paolo Bonzini
2015-04-30 8:59 ` Jason Wang
2015-04-30 10:32 ` Paolo Bonzini
2015-05-13 5:23 ` Jason Wang
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 7/8] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler Fam Zheng
2015-04-29 10:37 ` [Qemu-devel] [RFC PATCH 8/8] main-loop: Drop qemu_set_fd_handler2 Fam Zheng
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=5540B546.4040305@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=g.lettieri@iet.unipi.it \
--cc=jasowang@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rizzo@iet.unipi.it \
--cc=stefanha@redhat.com \
--cc=v.maffione@gmail.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.