[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


 


Rackspace

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