[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] bug in hvmloader xenbus_shutdown logic
> -----Original Message----- > From: Dave Scott > Sent: 16 June 2014 14:44 > To: Liuqiming (John) > Cc: Ian Campbell; Dave Scott; Yanqiangjun; xen-devel@xxxxxxxxxxxxx; Paul > Durrant > Subject: Re: [Xen-devel] bug in hvmloader xenbus_shutdown logic > > Hi, > > Sorry for the delay replying! > > [added Paul Durrant to cc:] > > On 6 Dec 2013, at 03:53, Liuqiming (John) <john.liuqiming@xxxxxxxxxx> > wrote: > > > How about we add a XS_RESET operation to xenstore and the semantic > should be: reset the connection to initial state > > > > The work flow asï > > 1, Hvmloader send this request to oxenstored and then poll the event > > 2,Oxenstored clear up IO ring and do some other work(if any) to make sure > this connect reset to initial state > > 3,Oxenstored send a event to notify the reset work has finished > > > > I think oxenstored should be the "owner" of this IO ring, so all the > complicated operation should be done by oxenstord and other component > should just send the request. > > I agree that (o)xenstored should be the âownerâ of this ring and other > components should just send requests. > > Perhaps instead of sending a new type of request inside the ring, we could > use some of the free space in the shared page to signal a reconnect? The > current definition is: > > /* > * `incontents 150 xenstore_struct XenStore wire protocol. > * > * Inter-domain shared memory communications. */ > #define XENSTORE_RING_SIZE 1024 > typedef uint32_t XENSTORE_RING_IDX; > #define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1)) > struct xenstore_domain_interface { > char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */ > char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ > XENSTORE_RING_IDX req_cons, req_prod; > XENSTORE_RING_IDX rsp_cons, rsp_prod; > }; > > which means that 1024 + 1024 + 4 * 4 = 2064 bytes are used, and 2032 bytes > are still free. I believe the 4k page is allocated at domain build time and > the > unused bytes are guaranteed to be 0 (â is this correct?) > > Perhaps we could allocate 12 bytes for a version number and another pair of > counters: > > uint32_t ring_protocol_version; > uint32_t connection_request; > uint32_t connection_actual; > > A new xenstored could set âring_protocol_versionâ to 1, old xenstoreds > would leave it at 0. > > If a new xenstore client saw the ring_protocol_version = 1, it would be able > to request a reconnect by incrementing âconnection_requestâ and waiting > xenstored to zero the ring and increment âconnection_actualâ. > > We could then modify hvmloader to safely reset the ring before the guest > boots. If a guest wants to jump into a crash kernel (with undefined xenstore > ring state) it would also be able to request a reconnect and load PV drivers. > > What do you think? > I think it would be good if 'connection_actual' were an incarnation count that is sampled by the frontend to determine whether to trust the counter values e.g. in cases where it needs to wait for a response that may never come because xenstored has had some problem, or determines that a frontend has corrupted the ring. So, xenstored bumps it if it ever resets the ring either by request or unilaterally (and it's read-only to the guest). Then perhaps 'connection_request' should become 'connection_reset' which is written to 1 by a guest requesting reset and cleared by xenstored if and when it satisfies the request. Paul _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |