diff --git a/tools/ocaml/xenstored/domain.ml b/tools/ocaml/xenstored/domain.ml index ab08dcf37f..d59a9401e2 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 b2973aca2a..1c80e7198d 100644 --- a/tools/ocaml/xenstored/process.ml +++ b/tools/ocaml/xenstored/process.ml @@ -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