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

[xen master] tools/xenstored: Introduce a wrapper for conn->funcs->can_{read, write}



commit 3adfb50315d9b5643bec7a8a5378625f15986200
Author:     Julien Grall <jgrall@xxxxxxxxxx>
AuthorDate: Thu Jun 24 09:08:42 2021 +0100
Commit:     Julien Grall <jgrall@xxxxxxxxxx>
CommitDate: Thu Jun 24 09:08:42 2021 +0100

    tools/xenstored: Introduce a wrapper for conn->funcs->can_{read, write}
    
    Currently, the callbacks can_read and can_write are called directly. This
    doesn't allow us to add generic check and therefore requires duplication.
    
    At the moment, one check that could benefit to be common is whether the
    connection should ignored. The position is slightly different between
    domain and socket because for the latter we want to check the state of
    the file descriptor first.
    
    In follow-up patches, there will be more potential generic checks.
    
    This patch provides wrappers to read/write a connection and move
    the check ->is_ignored after the callback for everyone.
    
    This also requires to replace the direct call to domain_can_read()
    and domain_can_write() with the new wrapper. At the same time,
    both functions can now be static. Note that the implementations need
    to be moved earlier in the file xenstored_domain.c to avoid
    declaring the prototype.
    
    Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
    Reviewed-by: Luca Fancellu <luca.fancellu@xxxxxxx>
    Reviewed-by: Juergen Gross <jgross@xxxxxxxx>
---
 tools/xenstore/xenstored_core.c   | 18 ++++++++++++++----
 tools/xenstore/xenstored_domain.c | 40 +++++++++++++++++----------------------
 tools/xenstore/xenstored_domain.h |  4 ----
 3 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 268b0187e6..4c0d6e1874 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -334,6 +334,16 @@ static int destroy_conn(void *_conn)
        return 0;
 }
 
+static bool conn_can_read(struct connection *conn)
+{
+       return conn->funcs->can_read(conn) && !conn->is_ignored;
+}
+
+static bool conn_can_write(struct connection *conn)
+{
+       return conn->funcs->can_write(conn) && !conn->is_ignored;
+}
+
 /* This function returns index inside the array if succeed, -1 if fail */
 static int set_fd(int fd, short events)
 {
@@ -396,8 +406,8 @@ static void initialize_fds(int *p_sock_pollfd_idx, int 
*ptimeout)
        list_for_each_entry(conn, &connections, list) {
                if (conn->domain) {
                        wrl_check_timeout(conn->domain, now, ptimeout);
-                       if (domain_can_read(conn) ||
-                           (domain_can_write(conn) &&
+                       if (conn_can_read(conn) ||
+                           (conn_can_write(conn) &&
                             !list_empty(&conn->out_list)))
                                *ptimeout = 0;
                } else {
@@ -2325,14 +2335,14 @@ int main(int argc, char *argv[])
                        if (&next->list != &connections)
                                talloc_increase_ref_count(next);
 
-                       if (conn->funcs->can_read(conn))
+                       if (conn_can_read(conn))
                                handle_input(conn);
                        if (talloc_free(conn) == 0)
                                continue;
 
                        talloc_increase_ref_count(conn);
 
-                       if (conn->funcs->can_write(conn))
+                       if (conn_can_write(conn))
                                handle_output(conn);
                        if (talloc_free(conn) == 0)
                                continue;
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index 6d8d29cbe4..47e9107c14 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -172,6 +172,23 @@ static int readchn(struct connection *conn, void *data, 
unsigned int len)
        return len;
 }
 
+static bool domain_can_write(struct connection *conn)
+{
+       struct xenstore_domain_interface *intf = conn->domain->interface;
+
+       return ((intf->rsp_prod - intf->rsp_cons) != XENSTORE_RING_SIZE);
+}
+
+static bool domain_can_read(struct connection *conn)
+{
+       struct xenstore_domain_interface *intf = conn->domain->interface;
+
+       if (domain_is_unprivileged(conn) && conn->domain->wrl_credit < 0)
+               return false;
+
+       return (intf->req_cons != intf->req_prod);
+}
+
 static const struct interface_funcs domain_funcs = {
        .write = writechn,
        .read = readchn,
@@ -290,19 +307,6 @@ void handle_event(void)
                barf_perror("Failed to write to event fd");
 }
 
-bool domain_can_read(struct connection *conn)
-{
-       struct xenstore_domain_interface *intf = conn->domain->interface;
-
-       if (domain_is_unprivileged(conn) && conn->domain->wrl_credit < 0)
-               return false;
-
-       if (conn->is_ignored)
-               return false;
-
-       return (intf->req_cons != intf->req_prod);
-}
-
 static bool domid_is_unprivileged(unsigned int domid)
 {
        return domid != 0 && domid != priv_domid;
@@ -314,16 +318,6 @@ bool domain_is_unprivileged(struct connection *conn)
               domid_is_unprivileged(conn->domain->domid);
 }
 
-bool domain_can_write(struct connection *conn)
-{
-       struct xenstore_domain_interface *intf = conn->domain->interface;
-
-       if (conn->is_ignored)
-               return false;
-
-       return ((intf->rsp_prod - intf->rsp_cons) != XENSTORE_RING_SIZE);
-}
-
 static char *talloc_domain_path(void *context, unsigned int domid)
 {
        return talloc_asprintf(context, "/local/domain/%u", domid);
diff --git a/tools/xenstore/xenstored_domain.h 
b/tools/xenstore/xenstored_domain.h
index 62ee471ea6..1e929b8f8c 100644
--- a/tools/xenstore/xenstored_domain.h
+++ b/tools/xenstore/xenstored_domain.h
@@ -51,10 +51,6 @@ void domain_deinit(void);
 /* Returns the implicit path of a connection (only domains have this) */
 const char *get_implicit_path(const struct connection *conn);
 
-/* Can connection attached to domain read/write. */
-bool domain_can_read(struct connection *conn);
-bool domain_can_write(struct connection *conn);
-
 bool domain_is_unprivileged(struct connection *conn);
 
 /* Remove node permissions for no longer existing domains. */
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

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