|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5/6] libxl: support mapping static shared memory areas during domain creation
Hi Wei,
2017-08-25 19:05 GMT+08:00 Wei Liu <wei.liu2@xxxxxxxxxx>:
> On Wed, Aug 23, 2017 at 02:08:39AM +0800, Zhongze Liu wrote:
> [...]
>> diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h
>> index 5e1fc6060e..1d681d8863 100644
>> --- a/tools/libxl/libxl_arch.h
>> +++ b/tools/libxl/libxl_arch.h
>> @@ -71,6 +71,12 @@ int libxl__arch_extra_memory(libxl__gc *gc,
>> const libxl_domain_build_info *info,
>> uint64_t *out);
>>
>> +_hidden
>> +bool libxl__arch_domain_support_sshm(const libxl_domain_build_info *b_info);
>
> No need to take any argument afaict.
This is needed because later on, we will restrict this to HVM only on
x86, we need b_info
to tell if a domain is HVM or not.
>
> [...]
>> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
>> index 1158303e1a..8e5ec486d2 100644
>> --- a/tools/libxl/libxl_create.c
>> +++ b/tools/libxl/libxl_create.c
>> @@ -501,6 +501,14 @@ int libxl__domain_build(libxl__gc *gc,
>> ret = ERROR_INVAL;
>> goto out;
>> }
>> +
>> + /* the p2m has been setup, we could map the static shared memory now. */
>> + ret = libxl__sshm_add(gc, domid, d_config->sshms, d_config->num_sshms);
>> + if (ret != 0) {
>> + LOG(ERROR, "failed to map static shared memory");
>> + goto out;
>> + }
>> +
>> ret = libxl__build_post(gc, domid, info, state, vments, localents);
>> out:
>> return ret;
>> @@ -918,6 +926,25 @@ static void initiate_domain_create(libxl__egc *egc,
>> goto error_out;
>> }
>>
>> + if (d_config->num_sshms != 0 &&
>> + !libxl__arch_domain_support_sshm(&d_config->b_info)) {
>> + LOGD(ERROR, domid, "static_shm is not supported by this domain
>> type.");
>> + ret = ERROR_INVAL;
>> + goto error_out;
>> + }
>> +
>> + ret = libxl__sshm_check_overlap(gc, domid,
>> + d_config->sshms, d_config->num_sshms);
>> + if (ret) goto error_out;
>
> Better move this after setting default.
OK.
>
>> +
>> + for (i = 0; i < d_config->num_sshms; ++i) {
>> + ret = libxl__sshm_setdefault(gc, domid, &d_config->sshms[i]);
>> + if (ret) {
>> + LOGD(ERROR, domid, "Unable to set defaults for static sshm");
>> + goto error_out;
>> + }
>> + }
>> +
>> ret = libxl__domain_make(gc, d_config, &domid, &state->config);
>> if (ret) {
>> LOGD(ERROR, domid, "cannot make domain: %d", ret);
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 724750967c..74bc0acb21 100644
> [...]
>> diff --git a/tools/libxl/libxl_sshm.c b/tools/libxl/libxl_sshm.c
>> new file mode 100644
>> index 0000000000..e16c24ccb9
>> --- /dev/null
>> +++ b/tools/libxl/libxl_sshm.c
>> @@ -0,0 +1,336 @@
>> +#include "libxl_osdeps.h"
>> +#include "libxl_internal.h"
>> +#include "libxl_arch.h"
>> +
>> +#define SSHM_ERROR(domid, sshmid, f, ...) \
>> + LOGD(ERROR, domid, "static_shm id = %s: " f, sshmid, ##__VA_ARGS__)
>> +
>> +
>> +/* Set default values for libxl_static_shm */
>> +int libxl__sshm_setdefault(libxl__gc *gc, uint32_t domid,
>> + libxl_static_shm *sshm)
>
> Indentation.
>
>> +{
>> + int rc;
>> +
>> + if (sshm->role == LIBXL_SSHM_ROLE_UNKNOWN) {
>> + sshm->role = LIBXL_SSHM_ROLE_SLAVE;
>> + }
>> + if (sshm->prot == LIBXL_SSHM_PROT_UNKNOWN) {
>> + sshm->prot = LIBXL_SSHM_PROT_RW;
>> + }
>
> You can avoid using {} when there is only one statement.
>
>> + /* role-specific checks */
>> + if (LIBXL_SSHM_ROLE_SLAVE == sshm->role) {
>
> Style.
Sorry about this. I've realized this and have removed all the Yoda
conditions in my new draft.
>
>> + if (sshm->offset == LIBXL_SSHM_RANGE_UNKNOWN) {
>> + sshm->offset = 0;
>> + }
>> + if (sshm->cache_policy != LIBXL_SSHM_CACHEPOLICY_UNKNOWN) {
>> + SSHM_ERROR(domid, sshm->id,
>> + "cache_policy is only applicable to master domains");
>> + return ERROR_INVAL;
>> + }
>> + } else {
>> + if (sshm->offset != LIBXL_SSHM_RANGE_UNKNOWN) {
>> + SSHM_ERROR(domid, sshm->id,
>> + "offset is only applicable to slave domains");
>> + return ERROR_INVAL;
>> + }
>> + rc = libxl__arch_domain_sshm_cachepolicy_setdefault(sshm);
>> + if (rc) {
>> + SSHM_ERROR(domid, sshm->id,
>> + "cache policy not supported on this platform");
>> + return ERROR_INVAL;
>> + }
>> + }
>
> Please use goto style error handling.
>
>> +
>> + return 0;
>> +}
>> +
>> +/* Compare function for sorting sshm ranges by sshm->begin */
>> +static int sshm_range_cmp(const void *a, const void *b)
>> +{
>> + libxl_static_shm *const *sshma = a, *const *sshmb = b;
>> + return (*sshma)->begin > (*sshmb)->begin ? 1 : -1;
>> +}
>> +
>> +/* check if the sshm slave configs in @sshm overlap */
>> +int libxl__sshm_check_overlap(libxl__gc *gc, uint32_t domid,
>> + libxl_static_shm *sshms, int len)
>> +{
>> +
>> + const libxl_static_shm **slave_sshms = NULL;
>> + int num_slaves;
>> + int i;
>> +
>> + slave_sshms = libxl__calloc(gc, len, sizeof(slave_sshms[0]));
>> + num_slaves = 0;
>> + for (i = 0; i < len; ++i) {
>> + if (LIBXL_SSHM_ROLE_SLAVE == sshms[i].role)
>
> Style.
>
>> +/* The caller have to guarentee that sshm->begin < sshm->end */
>> +static int libxl__sshm_do_map(libxl__gc *gc, uint32_t mid, uint32_t sid,
>> + libxl_static_shm *sshm,
>> + uint64_t mbegin, uint64_t mend)
>> +{
>> + int rc;
>> + int i;
>> + unsigned int num_mpages, num_spages, offset;
>> + int *errs;
>> + xen_ulong_t *idxs;
>> + xen_pfn_t *gpfns;
>> +
>> + num_mpages = (mend - mbegin) >> 12;
>> + num_spages = (sshm->end - sshm->begin) >> 12;
>> + offset = sshm->offset >> 12;
>> +
>> + /* Check range. Test offset < mpages first to avoid overflow */
>> + if ((offset >= num_mpages) || (num_mpages - offset < num_spages)) {
>> + SSHM_ERROR(sid, sshm->id, "exceeds master's address space.");
>> + rc = ERROR_INVAL;
>> + goto out;
>> + }
>> +
>> + /* fill out the pfn's and do the mapping */
>> + errs = libxl__calloc(gc, num_spages, sizeof(int));
>> + idxs = libxl__calloc(gc, num_spages, sizeof(xen_ulong_t));
>> + gpfns = libxl__calloc(gc, num_spages, sizeof(xen_pfn_t));
>> + for (i = 0; i < num_spages; i++) {
>> + idxs[i] = (mbegin >> 12) + offset + i;
>> + gpfns[i]= (sshm->begin >> 12) + i;
>> + }
>> + rc = xc_domain_add_to_physmap_batch(CTX->xch,
>> + sid, mid,
>> + XENMAPSPACE_gmfn_foreign,
>> + num_spages,
>> + idxs, gpfns, errs);
>> +
>> + for (i = 0; i< num_spages; i++) {
>> + if (errs[i]) {
>> + SSHM_ERROR(sid, sshm->id,
>> + "can't map at address 0x%"PRIx64".",
>> + sshm->begin + (offset << 12) );
>> + rc = ERROR_FAIL;
>> + }
>> + }
>> + if (rc) goto out;
>> +
>
> How is partial failure handled?
Em...
If one of the pages failed, the whole domain won't be constructed. But the
mapped pages are still occupying the refcount.
Do you think I should continue or just throw out a warning and let to user to
decide whether she is going to destroy it or not?
>
>> + rc = 0;
>> +
>> +out:
>> + return rc;
>> +}
>> +
>> +static int libxl__sshm_add_slave(libxl__gc *gc, uint32_t domid,
>> + libxl_static_shm *sshm)
>> +{
> [...]
>> +
>> + /* check if the slave is asking too much permission */
>> + if (LIBXL_SSHM_PROT_UNKNOWN == sshm->prot) {
>> + sshm->prot = master_sshm.prot;
>> + }
>
> Style.
>
>> +int libxl__sshm_add(libxl__gc *gc, uint32_t domid,
>> + libxl_static_shm *sshms, int len)
>> +{
>> + int rc, i;
>> +
>> + if (!len) return 0;
>
>
will remove this.
>
>> +
>> + for (i = 0; i < len; ++i) {
>> + if (LIBXL_SSHM_ROLE_SLAVE == sshms[i].role) {
>> + rc = libxl__sshm_add_slave(gc, domid, sshms+i);
>> + } else {
>> + rc = libxl__sshm_add_master(gc, domid, sshms+i);
>> + }
>> + if (rc) return rc;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +/*
>> + * Local variables:
>> + * mode: C
>> + * c-basic-offset: 4
>> + * indent-tabs-mode: nil
>> + * End:
>> + */
> [...]
>> diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
>> index c4a18df353..d91fbf5fda 100644
>> --- a/tools/libxl/libxl_xshelp.c
>> +++ b/tools/libxl/libxl_xshelp.c
>> @@ -193,6 +193,14 @@ char *libxl__xs_libxl_path(libxl__gc *gc, uint32_t
>> domid)
>> return s;
>> }
>>
>> +char *libxl__xs_get_sshmpath(libxl__gc *gc, const char *id)
>> +{
>> + char *s = GCSPRINTF("/local/static_shm/%s", id);
>
>
> This can't fail.
>
>> + if (!s)
>> + LOGE(ERROR, "cannot allocate static shm path");
>> + return s;
>> +}
>> +
>> int libxl__xs_read_mandatory(libxl__gc *gc, xs_transaction_t t,
>> const char *path, const char **result_out)
>> {
>> --
>> 2.14.0
>>
Cheers,
Zhongze Liu.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |