From: Paolo Bonzini <pbonzini@redhat.com>
To: Ronnie Sahlberg <ronniesahlberg@gmail.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/2] ISCSI: redo how we set up the events to only call qemu_aio_set_fd_handler() and qemu_notify_event() if something has changed.
Date: Fri, 25 May 2012 11:59:34 +0200 [thread overview]
Message-ID: <4FBF5806.7070309@redhat.com> (raw)
In-Reply-To: <1337931796-2660-2-git-send-email-ronniesahlberg@gmail.com>
Il 25/05/2012 09:43, Ronnie Sahlberg ha scritto:
> Also first call out to the socket write functions director, and only set up the write event if the socket is full.
>
> This means that we will only need to invoke these two functions very rarely which will improve performance.
>
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
> ---
> block/iscsi.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++----------
> 1 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/block/iscsi.c b/block/iscsi.c
> index ed1ad7b..9642ee6 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -40,6 +40,8 @@ typedef struct IscsiLun {
> int lun;
> int block_size;
> unsigned long num_blocks;
> + IOHandler *read_handler;
> + IOHandler *write_handler;
> } IscsiLun;
>
> typedef struct IscsiAIOCB {
> @@ -105,18 +107,50 @@ static void
> iscsi_set_events(IscsiLun *iscsilun)
> {
> struct iscsi_context *iscsi = iscsilun->iscsi;
> + int need_set_fd = 0;
> + int need_notify_event = 0;
>
> - qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), iscsi_process_read,
> - (iscsi_which_events(iscsi) & POLLOUT)
> - ? iscsi_process_write : NULL,
> - iscsi_process_flush, iscsilun);
> -
> - /* If we just added the event for writeable we must call
> - and the socket is already writeable the callback might
> - not be invoked until after a short delay unless we call
> - qemu_notify_event().
> + /* Try to write as much as we can to the socket
> + * without setting up an event
> */
> - qemu_notify_event();
> + if (iscsi_which_events(iscsi) & POLLOUT) {
> + iscsi_process_write(iscsilun);
> + }
> +
> + if (iscsilun->read_handler == NULL) {
> + iscsilun->read_handler = iscsi_process_read;
> + need_set_fd = 1;
> + need_notify_event = 1;
> + }
This is not needed, just pass iscsi_process_read unconditionally to
qemu_aio_set_fd_handler.
> + if (iscsi_which_events(iscsi) & POLLOUT) {
> + if (iscsilun->write_handler == NULL) {
> + iscsilun->write_handler = iscsi_process_write;
> + need_set_fd = 1;
> + need_notify_event = 1;
> + }
> + } else {
> + if (iscsilun->write_handler != NULL) {
> + iscsilun->write_handler = NULL;
> + need_set_fd = 1;
> + }
> + }
> +
> + if (need_set_fd) {
> + qemu_aio_set_fd_handler(iscsi_get_fd(iscsi),
> + iscsilun->read_handler,
> + iscsilun->write_handler,
> + iscsi_process_flush,
> + iscsilun);
> +
> + /* If we just added an event that may trigger almost immediately
> + the callback might not be invoked until after a short
> + delay unless we call qemu_notify_event().
> + */
> + if (need_notify_event) {
> + qemu_notify_event();
> + }
> + }
What about this:
/* We always register a read handler. */
ev = POLLIN;
ev |= iscsi_which_events(iscsi);
if (ev != iscsilun->events) {
qemu_aio_set_fd_handler(iscsi_get_fd(iscsi),
iscsi_process_read,
(ev & POLLOUT) ? iscsi_process_write : NULL,
iscsi_process_flush,
iscsilun);
}
/* If we just added an event, the callback might be delayed
* unless we call qemu_notify_event().
*/
if (ev & ~iscsilun->events) {
qemu_notify_event();
}
iscsilun->events = ev;
?
Paolo
next prev parent reply other threads:[~2012-05-25 9:59 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-25 7:43 [Qemu-devel] [PATCH 0/2] Add support for iscsi passthrough and better eventsystem support Ronnie Sahlberg
2012-05-25 7:43 ` [Qemu-devel] [PATCH 1/2] ISCSI: redo how we set up the events to only call qemu_aio_set_fd_handler() and qemu_notify_event() if something has changed Ronnie Sahlberg
2012-05-25 9:59 ` Paolo Bonzini [this message]
2012-05-25 10:06 ` ronnie sahlberg
2012-05-25 7:43 ` [Qemu-devel] [PATCH 2/2] SCSI: Add SCSI passthrough via scsi-generic to libiscsi Ronnie Sahlberg
2012-05-25 10:20 ` Paolo Bonzini
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=4FBF5806.7070309@redhat.com \
--to=pbonzini@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=ronniesahlberg@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.