[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 7/8] oxenstored: only process domain connections that notify us by events
On 15 Sep 2014, at 23:39, Zheng Li <dev@xxxxxxxx> wrote: > Currently, upon receiving an event, oxenstored will scan all the xs rings (of > all domains), disregarding who sent that event. This is not very efficient, > and > also it can shadow some misbehaviors of xenstore clients. > > With this patch, oxenstore will only scan and process the domain connections > that have correctly notified it by events. > > The function process_domains is refactored to be process_domain in order to > allow processing single domain connection. Also a mode_switch flag is added to > enable selectively processing just the input or output or both. > > Signed-off-by: Zheng Li <dev@xxxxxxxx> > --- > tools/ocaml/xenstored/xenstored.ml | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/tools/ocaml/xenstored/xenstored.ml > b/tools/ocaml/xenstored/xenstored.ml > index ea1a08f..41a188d 100644 > --- a/tools/ocaml/xenstored/xenstored.ml > +++ b/tools/ocaml/xenstored/xenstored.ml > @@ -51,13 +51,17 @@ let process_connection_fds store cons domains rset wset = > process_fdset_with rset Process.do_input; > process_fdset_with wset Process.do_output > > -let process_domains store cons domains = > - let do_io_domain domain = > - if not (Domain.is_bad_domain domain) then > - let con = Connections.find_domain cons (Domain.get_id > domain) in > - Process.do_input store cons domains con; > - Process.do_output store cons domains con in > - Domains.iter domains do_io_domain > +let process_domain ?mode_switch store cons domains c = What’s mode_switch for? > + match Connection.get_domain c with > + | None -> () > + | Some dom -> > + if not (Domain.is_bad_domain dom) then > + let read, write = match mode_switch with > + | None -> true, true > + | Some true -> true, false > + | Some false -> false, true in > + (if read then Process.do_input store cons domains c; > + if write then Process.do_output store cons domains c) > > let sigusr1_handler store = > try > @@ -305,6 +309,7 @@ let _ = > Connections.add_anonymous cons cfd can_write > and handle_eventchn fd = > let port = Event.pending eventchn in > + debug "pending port %d" (Xeneventchn.to_int port); Accidentally left some debugging in? It looks like it could be quite spammy. > finally (fun () -> > if Some port = eventchn.Event.virq_port then ( > let (notify, deaddom) = Domains.cleanup > xc domains in > @@ -312,7 +317,10 @@ let _ = > if deaddom <> [] || notify then > Connections.fire_spec_watches > cons "@releaseDomain" > ) > - ) (fun () -> Event.unmask eventchn port); > + else > + let c = Connections.find_domain_by_port > cons port in > + process_domain store cons domains c > + ) (fun () -> Event.unmask eventchn port) > and do_if_set fd set fct = > if List.mem fd set then > fct fd in > @@ -382,7 +390,7 @@ let _ = > process_special_fds sfds; > if List.length cfds > 0 || List.length wset > 0 then > process_connection_fds store cons domains cfds wset; > - process_domains store cons domains > + List.iter (process_domain store cons domains) mw > in > > while not !quit > -- > 2.1.0 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |