Generally speaking, the event channel local/remote port is fixed for the
lifetime of the associated domain object.  The exception to this is a
secondary XS_INTRODUCE (defined to re-bind to a new event channel) which pokes
around at the domain object's internal state.

We need to refactor the evtchn handling to support live update, so start by
moving the relevant manipulation into Domain.

No practical change.

Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com>
---
CC: Christian Lindig <christian.lin...@citrix.com>
CC: David Scott <d...@recoil.org>
CC: Edwin Torok <edvin.to...@citrix.com>
CC: Rob Hoes <rob.h...@citrix.com>

Note: This change deliberately doesn't reuse Domain.bind_interdomain, which is
removed by the end of the refactoring.

v2:
 * New.
---
 tools/ocaml/xenstored/domain.ml  | 12 ++++++++++++
 tools/ocaml/xenstored/process.ml |  6 ++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/tools/ocaml/xenstored/domain.ml b/tools/ocaml/xenstored/domain.ml
index ab08dcf37f62..d59a9401e211 100644
--- a/tools/ocaml/xenstored/domain.ml
+++ b/tools/ocaml/xenstored/domain.ml
@@ -63,6 +63,18 @@ let string_of_port = function
 let dump d chan =
        fprintf chan "dom,%d,%nd,%d\n" d.id d.mfn d.remote_port
 
+let rebind_evtchn d remote_port =
+       begin match d.port with
+       | None -> ()
+       | Some p -> Event.unbind d.eventchn p
+       end;
+       let local = Event.bind_interdomain d.eventchn d.id remote_port in
+       debug "domain %d rebind (l %s, r %d) => (l %d, r %d)"
+             d.id (string_of_port d.port) d.remote_port
+             (Xeneventchn.to_int local) remote_port;
+       d.remote_port <- remote_port;
+       d.port <- Some (local)
+
 let notify dom =
        match dom.port with
        | None -> warn "domain %d: attempt to notify on unknown port" dom.id
diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index b2973aca2a82..2ea940d7e2d5 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -567,11 +567,9 @@ let do_introduce con t domains cons data =
        let dom =
                if Domains.exist domains domid then
                        let edom = Domains.find domains domid in
-                       if (Domain.get_mfn edom) = mfn && 
(Connections.find_domain cons domid) != con then begin
+                       if (Domain.get_mfn edom) = mfn && 
(Connections.find_domain cons domid) != con then
                                (* Use XS_INTRODUCE for recreating the xenbus 
event-channel. *)
-                               edom.remote_port <- remote_port;
-                               Domain.bind_interdomain edom;
-                       end;
+                               Domain.rebind_evtchn edom remote_port;
                        edom
                else try
                        let ndom = Domains.create domains domid mfn remote_port 
in
-- 
2.11.0


Reply via email to