[libvirt] [PATCH 4/4] qemu: call the helpers in virshm.c to manage shmem device

lhuang lhuang at redhat.com
Mon Aug 3 06:22:47 UTC 2015


On 07/30/2015 06:23 PM, Daniel P. Berrange wrote:
> On Thu, Jul 23, 2015 at 06:13:49PM +0800, Luyao Huang wrote:
>> Signed-off-by: Luyao Huang <lhuang at redhat.com>
>> ---
>>   src/qemu/qemu_conf.h    |   3 +
>>   src/qemu/qemu_driver.c  |   4 ++
>>   src/qemu/qemu_process.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 165 insertions(+)
>>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index 1c0c734..84b3b5e 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -4321,6 +4321,154 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
>>   }
>>   
>>   
>> +static int
>> +qemuPrepareShmemDevice(virQEMUDriverPtr driver,
>> +                       virDomainObjPtr vm,
>> +                       virDomainShmemDefPtr shmem)
>> +{
>> +    int ret = -1;
>> +    virShmObjectPtr tmp;
>> +    virShmObjectListPtr list = driver->shmlist;
>> +    bool othercreate = false;
>> +    char *path = NULL;
>> +    bool teardownlabel = false;
>> +    bool teardownshm = false;
>> +    int type, fd;
>> +
>> +    virObjectLock(list);
>> +
>> +    if ((tmp = virShmObjectFindByName(list, shmem->name))) {
>> +        if (shmem->size > tmp->size) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                           _("Shmem object %s is already exists and "
>> +                             "size is smaller than require size"),
>> +                           tmp->name);
>> +            goto cleanup;
>> +        }
>> +
>> +        if (virShmSetUsedDomain(tmp, QEMU_DRIVER_NAME, vm->def->name) < 0)
>> +            goto cleanup;
>> +
>> +        if (virShmObjectSaveState(tmp, list->stateDir) < 0)
>> +            goto cleanup;
>> +
>> +        virObjectUnlock(list);
>> +        return 0;
>> +    }
>> +
>> +    if (!shmem->server.enabled) {
>> +        if ((fd = virShmCreate(shmem->name, shmem->size, false, &othercreate, 0600)) < 0)
>> +            goto cleanup;
>> +        VIR_FORCE_CLOSE(fd);
>> +
>> +        if ((ret = virShmBuildPath(shmem->name, &path)) == -1) {
>> +            ignore_value(virShmUnlink(shmem->name));
>> +            goto cleanup;
>> +        } else if (ret == -2 && !othercreate) {
>> +            ignore_value(virShmUnlink(shmem->name));
>> +        }
>> +        type = VIR_SHM_TYPE_SHM;
>> +    } else {
>> +        if (!virFileExists(shmem->server.chr.data.nix.path)) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                           _("Shmem device server socket is not exist"));
>> +            goto cleanup;
>> +        } else {
>> +            othercreate = true;
>> +        }
>> +        type = VIR_SHM_TYPE_SERVER;
>> +    }
>> +    teardownshm = true;
>> +
>> +    if (virSecurityManagerSetShmemLabel(driver->securityManager,
>> +                                        vm->def, shmem, path) < 0)
>> +        goto cleanup;
> You shouldn't be setting labelling at this point. That should be done
> by the later call to virSecurityManagerSetAllLabel

Okay, i see, i will move it to virSecurityManagerSetAllLabel

>> +static int
>> +qemuCleanUpShmemDevice(virQEMUDriverPtr driver,
>> +                       virDomainObjPtr vm,
>> +                       virDomainShmemDefPtr shmem)
>> +{
>> +    virShmObjectPtr tmp;
>> +    virShmObjectListPtr list = driver->shmlist;
>> +    int ret = -1;
>> +
>> +    virObjectLock(list);
>> +
>> +    if (!(tmp = virShmObjectFindByName(list, shmem->name))) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                       _("Cannot find share memory named '%s'"),
>> +                       shmem->name);
>> +        goto cleanup;
>> +    }
>> +    if ((shmem->server.enabled && tmp->type != VIR_SHM_TYPE_SERVER) ||
>> +        (!shmem->server.enabled && tmp->type != VIR_SHM_TYPE_SHM)) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                       _("Shmem object and shmem device type is not equal"));
>> +        goto cleanup;
>> +    }
>> +
>> +    if (virShmRemoveUsedDomain(tmp, QEMU_DRIVER_NAME, vm->def->name) < 0)
>> +        goto cleanup;
>> +
>> +    if (tmp->ndomains == 0) {
>> +        if (virSecurityManagerRestoreShmemLabel(driver->securityManager,
>> +                                                vm->def, shmem, tmp->path) < 0)
>> +            VIR_WARN("Unable to restore shared memory device labelling");
> Likewise this should be left to the main label restore code

Okay, Thanks a lot for your review and advise.

>> +
>> +        if (!shmem->server.enabled) {
>> +            if (!tmp->othercreate &&
>> +                virShmUnlink(tmp->name) < 0)
>> +                VIR_WARN("Unable to unlink shared memory object");
>> +        }
>> +
>> +        if (virShmObjectRemoveStateFile(list, tmp->name) < 0)
>> +            goto cleanup;
>> +        virShmObjectListDel(list, tmp);
>> +        virShmObjectFree(tmp);
>> +    }
>> +
>> +    ret = 0;
>> + cleanup:
>> +    virObjectUnlock(list);
>> +    return ret;
>> +}
> Regards,
> Daniel

Luyao




More information about the libvir-list mailing list