qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Ronnie Sahlberg <ronniesahlberg@gmail.com>
To: kwolf@redhat.com, pbonzini@redhat.com, qemu-devel@nongnu.org
Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
Subject: [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 17:43:15 +1000	[thread overview]
Message-ID: <1337931796-2660-2-git-send-email-ronniesahlberg@gmail.com> (raw)
In-Reply-To: <1337931796-2660-1-git-send-email-ronniesahlberg@gmail.com>

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;
+    }
+
+    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();
+        }
+    }
 }
 
 static void
@@ -790,6 +824,8 @@ static void iscsi_close(BlockDriverState *bs)
     IscsiLun *iscsilun = bs->opaque;
     struct iscsi_context *iscsi = iscsilun->iscsi;
 
+    iscsilun->read_handler = NULL;
+    iscsilun->write_handler = NULL;
     qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL, NULL);
     iscsi_destroy_context(iscsi);
     memset(iscsilun, 0, sizeof(IscsiLun));
-- 
1.7.3.1

  reply	other threads:[~2012-05-25  7:54 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 ` Ronnie Sahlberg [this message]
2012-05-25  9:59   ` [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 Paolo Bonzini
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=1337931796-2660-2-git-send-email-ronniesahlberg@gmail.com \
    --to=ronniesahlberg@gmail.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).