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

Re: [Xen-devel] [PATCH 6/8] oxenstored: enable domain connection indexing based on eventchn port



Hi,

On 15 Sep 2014, at 23:39, Zheng Li <dev@xxxxxxxx> wrote:

> Currently in xenstore connection database,  we use a hash table of
> (domid -> connection) to store domain connections. This allows fast indexing
> based on domids.
> 
> This patch adds another dimention of fast indexing which is based on the
> eventchn port number. This is useful when doing selective connections
> processing based on incoming events.
> 
> For memory efficiency, the implementation reuse the the existing domain
> connections hash table, but use the negative of a port number as the index (to
> distinguish from domid which always >= 0).

I think on a 32-bit architecture where the OCaml int is 31 bits wide, the 
evtchn port fits inside an OCaml int. From xenctrl.h:

  /* A port identifier is guaranteed to fit in 31 bits. */
  typedef int evtchn_port_or_error_t;

If we use the sign bit as a further tag then we’re 1 bit short. I’d rather use 
2 separate hash tables to be safe.

Cheers,
Dave

> 
> Signed-off-by: Zheng Li <dev@xxxxxxxx>
> ---
> tools/ocaml/xenstored/connections.ml | 21 +++++++++++++++++----
> tools/ocaml/xenstored/domain.ml      |  1 +
> 2 files changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/ocaml/xenstored/connections.ml 
> b/tools/ocaml/xenstored/connections.ml
> index 59c5c1a..a0f1b89 100644
> --- a/tools/ocaml/xenstored/connections.ml
> +++ b/tools/ocaml/xenstored/connections.ml
> @@ -19,6 +19,7 @@ let debug fmt = Logging.debug "connections" fmt
> 
> type t = {
>       anonymous: (Unix.file_descr, Connection.t) Hashtbl.t;
> +     (* the key of the domains table can be either a domid or a port number 
> (taking negative) *)
>       domains: (int, Connection.t) Hashtbl.t;
>       mutable watches: (string, Connection.watch list) Trie.t;
> }
> @@ -33,7 +34,10 @@ let add_anonymous cons fd can_write =
> let add_domain cons dom =
>       let xbcon = Xenbus.Xb.open_mmap (Domain.get_interface dom) (fun () -> 
> Domain.notify dom) in
>       let con = Connection.create xbcon (Some dom) in
> -     Hashtbl.add cons.domains (Domain.get_id dom) con
> +     Hashtbl.add cons.domains (Domain.get_id dom) con;
> +     match Domain.get_port dom with
> +     | Some p -> Hashtbl.add cons.domains (-1 * Xeneventchn.to_int p) con;
> +     | None -> ()
> 
> let select cons =
>       Hashtbl.fold
> @@ -45,8 +49,11 @@ let select cons =
> let find cons =
>       Hashtbl.find cons.anonymous
> 
> -let find_domain cons id =
> -     Hashtbl.find cons.domains id
> +let find_domain cons =
> +     Hashtbl.find cons.domains
> +
> +let find_domain_by_port cons port =
> +     Hashtbl.find cons.domains (-1 * Xeneventchn.to_int port)
> 
> let del_watches_of_con con watches =
>       match List.filter (fun w -> Connection.get_con w != con) watches with
> @@ -65,13 +72,19 @@ let del_domain cons id =
>       try
>               let con = find_domain cons id in
>               Hashtbl.remove cons.domains id;
> +             (match Connection.get_domain con with
> +              | Some d ->
> +                (match Domain.get_port d with
> +                 | Some p -> Hashtbl.remove cons.domains (-1 * 
> Xeneventchn.to_int p)
> +                 | None -> ())
> +              | None -> ());
>               cons.watches <- Trie.map (del_watches_of_con con) cons.watches;
>               Connection.close con
>       with exn ->
>               debug "del domain %u: %s" id (Printexc.to_string exn)
> 
> let iter_domains cons fct =
> -     Hashtbl.iter (fun k c -> fct c) cons.domains
> +     Hashtbl.iter (fun k c -> if k >= 0 then fct c) cons.domains
> 
> let iter_anonymous cons fct =
>       Hashtbl.iter (fun _ c -> fct c) cons.anonymous
> diff --git a/tools/ocaml/xenstored/domain.ml b/tools/ocaml/xenstored/domain.ml
> index 444069d..06d5749 100644
> --- a/tools/ocaml/xenstored/domain.ml
> +++ b/tools/ocaml/xenstored/domain.ml
> @@ -35,6 +35,7 @@ let get_id domain = domain.id
> let get_interface d = d.interface
> let get_mfn d = d.mfn
> let get_remote_port d = d.remote_port
> +let get_port d = d.port
> 
> let is_bad_domain domain = domain.bad_client
> let mark_as_bad domain = domain.bad_client <- true
> -- 
> 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®.