[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 2/2] tools/xenstore: simplify xenstored main loop



Hi Juergen,

On 17/05/2021 07:10, Juergen Gross wrote:
On 14.05.21 19:05, Julien Grall wrote:
Hi Juergen,

On 14/05/2021 12:56, Juergen Gross wrote:
The main loop of xenstored is rather complicated due to different
handling of socket and ring-page interfaces. Unify that handling by
introducing interface type specific functions can_read() and
can_write().

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V2:
- split off function vector introduction (Julien Grall)
---
  tools/xenstore/xenstored_core.c   | 77 +++++++++++++++----------------
  tools/xenstore/xenstored_core.h   |  2 +
  tools/xenstore/xenstored_domain.c |  2 +
  3 files changed, 41 insertions(+), 40 deletions(-)

diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 856f518075..883a1a582a 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -1659,9 +1659,34 @@ static int readfd(struct connection *conn, void *data, unsigned int len)
      return rc;
  }
+static bool socket_can_process(struct connection *conn, int mask)
+{
+    if (conn->pollfd_idx == -1)
+        return false;
+
+    if (fds[conn->pollfd_idx].revents & ~(POLLIN | POLLOUT)) {
+        talloc_free(conn);
+        return false;
+    }
+
+    return (fds[conn->pollfd_idx].revents & mask) && !conn->is_ignored;
+}
+
+static bool socket_can_write(struct connection *conn)
+{
+    return socket_can_process(conn, POLLOUT);
+}
+
+static bool socket_can_read(struct connection *conn)
+{
+    return socket_can_process(conn, POLLIN);
+}
+
  const struct interface_funcs socket_funcs = {
      .write = writefd,
      .read = readfd,
+    .can_write = socket_can_write,
+    .can_read = socket_can_read,
  };
  static void accept_connection(int sock)
@@ -2296,47 +2321,19 @@ int main(int argc, char *argv[])
              if (&next->list != &connections)
                  talloc_increase_ref_count(next);
-            if (conn->domain) {
-                if (domain_can_read(conn))
-                    handle_input(conn);
-                if (talloc_free(conn) == 0)
-                    continue;
-
-                talloc_increase_ref_count(conn);
-                if (domain_can_write(conn) &&
-                    !list_empty(&conn->out_list))

AFAICT, the check "!list_empty(&conn->out_list)" can be safely removed because write_messages() will check if the list is empty (list_top() returns NULL in this case). Is that correct?

Yes.

Thanks, how about adding in the commit message:

"Take the opportunity to remove the empty list check before calling write_messages() because the function is already able to cope with an empty list."

I can update the commit message while committing it.

Cheers,

--
Julien Grall



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.