[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 4/8] libxl: support unmapping static shared memory areas during domain destruction
Stefano Stabellini writes ("[PATCH v8 4/8] libxl: support unmapping static shared memory areas during domain destruction"): > Add libxl__sshm_del to unmap static shared memory areas mapped by > libxl__sshm_add during domain creation. The unmapping process is: This whole part should be in a comment in the code, I think. > * For a master: decrease the refcount of the sshm region, if the refcount > reaches 0, cleanup the whole sshm path. Does this not prevent actual domain destruction, if there are still slaves ? > * For a slave: > 1) unmap the shared pages, and cleanup related xs entries. If the > system works normally, all the shared pages will be unmapped, so there > won't be page leaks. In case of errors, the unmapping process will go > on and unmap all the other pages that can be unmapped, so the other > pages won't be leaked, either. When might pages be leaked ? > 2) Decrease the refcount of the sshm region, if the refcount reaches > 0, cleanup the whole sshm path. > diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c > index 3377bba..3f7ffa6 100644 > --- a/tools/libxl/libxl_domain.c > +++ b/tools/libxl/libxl_domain.c > @@ -1060,6 +1060,11 @@ void libxl__destroy_domid(libxl__egc *egc, > libxl__destroy_domid_state *dis) > goto out; > } > > + rc = libxl__sshm_del(gc, domid); > + if (rc) { > + LOGD(ERROR, domid, "Deleting static shm failed."); Please explain (preferably with a code comment) what a failure here implies and how it is a legal and recoverable state. > + count_path = GCSPRINTF("%s/usercnt", sshm_path); > + if (libxl__xs_read_checked(gc, xt, count_path, &count_string)) > + return; Again, count_string may be 0, but I think you can probably do away with this. > +static void libxl__sshm_do_unmap(libxl__gc *gc, uint32_t domid, const char > *id, > + uint64_t begin, uint64_t size) > +{ > + uint64_t end; > + begin >>= XC_PAGE_SHIFT; > + size >>= XC_PAGE_SHIFT; > + end = begin + size; > + for (; begin < end; ++begin) { > + if (xc_domain_remove_from_physmap(CTX->xch, domid, begin)) { > + SSHM_ERROR(domid, id, > + "unable to unmap shared page at 0x%"PRIx64".", > + begin); > + } Is this idempotent ? > + slave_path = GCSPRINTF("%s/slaves/%"PRIu32, SSHM_PATH(id), domid); > + > + begin_str = libxl__xs_read(gc, xt, GCSPRINTF("%s/begin", slave_path)); > + size_str = libxl__xs_read(gc, xt, GCSPRINTF("%s/size", slave_path)); > + begin = strtoull(begin_str, NULL, 16); > + size = strtoull(size_str, NULL, 16); Maybe this formulaic retrieval code could be combined with that for adding a borrow. > + if (libxl__xs_read(gc, xt, dom_sshm_path)) { Again, needs to be libxl__xs_read_checked. But: > + sshm_ents = libxl__xs_directory(gc, xt, dom_sshm_path, > &sshm_num); > + if (!sshm_ents) continue; I don't see why you can't just call libxl__xs_directory without xs_read. Also, you need to check errno, after libxl__xs_directory fails. > + for (i = 0; i < sshm_num; ++i) { > + role = libxl__xs_read(gc, xt, > + GCSPRINTF("%s/%s/role", > + dom_sshm_path, > + sshm_ents[i])); > + assert(role); > + if (!strncmp(role, "slave", 5)) This should explicitly handle other values for `role', probably by failing. Also the error handling assert is poor. > + libxl__sshm_del_slave(gc, xt, domid, sshm_ents[i], > isretry); > + > + libxl__sshm_decref(gc, xt, SSHM_PATH(sshm_ents[i])); > + } > + } > + > + rc = libxl__xs_transaction_commit(gc, &xt); > + if (!rc) break; > + if (rc < 0) goto out; > + isretry = true; isretry seems to be a dead variable. Thanks, 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 |