[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 06/10] tools/xenstored: Introduce a wrapper for conn->funcs->can_{read, write}
> On 16 Jun 2021, at 15:43, Julien Grall <julien@xxxxxxx> wrote: > > From: Julien Grall <jgrall@xxxxxxxxxx> > > 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> > --- > 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 51d210828922..2e5760fe4599 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 6d8d29cbe41c..47e9107c144e 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 62ee471ea6aa..1e929b8f8c6f 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. */ > -- > 2.17.1 > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |