[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: Documentation about the domain configuration on disk
Wei Liu writes ("Re: [PATCH] libxl: Documentation about the domain configuration on disk"): > On Thu, Dec 06, 2018 at 02:57:33PM +0000, Anthony PERARD wrote: > > Anyway, that comment block isn't very helpful because it basically says > > that we can't depriv QEMU, I mean do hotplug with a deprived QEMU. It > > assumes that we can keep a lock on the userdata while updating the > > guest, but we can't keep the lock while talking with QEMU (or more > > generaly: we can't keep the lock while doing any async operation). > > > > But there is one useful piece of information: > > Here we maintain one invariant: every device in xenstore must have > > an entry in JSON file. > > (xenstore is describe as "primary reference" just before that sentence). > > Yes. That. ... > When removing a CD, you only need to update the primary source -- QEMU > in this case, you can leave libxl-json untouched. It is allowed to have > stale entries in libxl-json. This is implied in "We may not even need > this ..." further above. If you leave a state entry in libxl-json then you would reject attempts to insert a new cd, because the libxl-json would tell you one is already present. I think the lock difficulty Anthony identifies is real. We need to either develop a new set of locking rules, or make all acquisitions of the libxl-json lock slow. The invariant that we want to maintain is: * Nothing may exist in the primary config without a corresponding entry in libxl-json. The rules that implement that are: * No-one may edit the libxl-json without holding the lock. * You may not cause a thing to be added to the primary config unless you have held the libxl-json lock continuously since ensuring that the libxl-json config describes it. * Conversely you may not cause a thing to be removed from the libxl-json unless you have held the libxl-json lock continueously since ensuring the thing is absent from the primary config. And unfortunately much code acquiring the libxl-json lock expects it to be fast. How about the following scheme. We split the libxl-json lock into two. I'm going to call them the fast lock and the slow lock. * The fast lock is the existing libxl-json lock. * The slow lock is outside the libxl-json lock in the lock hierarchy. It is also outside the libxl_ctx lock. It is to be acquired by an ao event callback. * No-one may read or edit the libxl-json without holding the fast lock across their read operation, or their read/modify/write cycle. * However, there are special rules for thing removal/addition, for things added/removed via qmp. Call these `qmp things'. It is permissible to add or remove a qmp thing across two separate acquisitions of the fast lock, one to read the old state of the thing, and one to read/modify/write to update (only) the new state of the thing. This is subject to the thing add/removal rule, from before, which becomes: * You may not cause a thing to be added to the primary config unless you have held the relevant thing lock continuously since ensuring that the libxl-json config describes it. * Conversely you may not cause a thing to be removed from the libxl-json unless you have held the relevant thing lock continuously since ensuring the thing is absent from the primary config. * The `relevant thing lock' is the slow lock for qmp things, and the fast lock for other things. * Acquiring the fast lock fails for a destroyed domain, as at present. I think this maintains the invariant. I haven't figured out domain destruction. Ideally domain destruction could happen without taking the slow lock. I think this is probably possible if we make sure that qemu is always killed before the libxl-json is removed. The result is that if a qmp thing operation races with domain destruction, and in its 1st read gets an existing libxl-json from before destruction, the qmp thing will, when it acquires the fast lock again, necessarily the libxl-json will not exist, and the qmp operation will bomb out. But I don't exactly know how this relates to domain creation. In general I haven't thought about races between domain creation and domain destruction. We don't want a situation like this: 1 domain destruction tries to kill qemu (but it doesn't exist yet) 2 domain creation creates libxl-json and qemu 3 domain creation complets 4 qmp add reads libxl-json, sees thing absent 5 qmp add sends qmp command 6 qmp add gets qmp response and updates libxl-json 7 domain destruction deletes the libxl-json 8 domain destruction crashes before it destroys domain in Xen Maybe qemu's existence is `primary non-qmp state' and in fact domain destruction is not allowed to destroy it without holding the libxl-json lock. But I bet that rule is not honoured right now. Comments, anyone ? > Anyway, I'm not overly opposed to adding some easy to grep pointers, but > CODING_STYLE looks wrong to me. Maybe README.dev? I'm sorry I didn't make that comment easy to find. I think maybe adding cross-reference comments (perhaps several, in the places you looked) would be a good idea. The problem with a file like HACKING or CODING_STYLE is that it will become a large list of things unconnected to what they are about, and therefore once again hard to find. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |