]> xenbits.xensource.com Git - people/tklengyel/xen.git/commitdiff
tools/oxenstored: Implement Domain.rebind_evtchn
authorAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 30 Nov 2022 11:55:58 +0000 (11:55 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 20 Dec 2022 13:13:40 +0000 (13:13 +0000)
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.cooper3@citrix.com>
Reviewed-by: Edwin Török <edvin.torok@citrix.com>
Acked-by: Christian Lindig <christian.lindig@citrix.com>
(cherry picked from commit aecdc28d9538ca2a1028ef9bc6550cb171dbbed4)

tools/ocaml/xenstored/domain.ml
tools/ocaml/xenstored/process.ml

index ab08dcf37f62a696347ef0544d61c409ac33920b..d59a9401e211032995a3e9d5fc1a3085acd7c67b 100644 (file)
@@ -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
index b2973aca2a82441222ed04efc7312e6c400bd7a6..1c80e7198dbedf71e89911ead0669decfb6c164e 100644 (file)
@@ -569,8 +569,7 @@ let do_introduce con t domains cons data =
                        let edom = Domains.find domains domid in
                        if (Domain.get_mfn edom) = mfn && (Connections.find_domain cons domid) != con then begin
                                (* Use XS_INTRODUCE for recreating the xenbus event-channel. *)
-                               edom.remote_port <- remote_port;
-                               Domain.bind_interdomain edom;
+                               Domain.rebind_evtchn edom remote_port;
                        end;
                        edom
                else try