mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Discard caps cache when KVM availability changes
Since some may depend on the accelerator used when probing QEMU the cache becomes invalid when KVM becomes available or if it is not available anymore. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
25ba9c31f5
commit
d87df9bd39
@ -3455,7 +3455,9 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
|
||||
static int
|
||||
virQEMUCapsInitCached(virCapsPtr caps,
|
||||
virQEMUCapsPtr qemuCaps,
|
||||
const char *cacheDir)
|
||||
const char *cacheDir,
|
||||
uid_t runUid,
|
||||
gid_t runGid)
|
||||
{
|
||||
char *capsdir = NULL;
|
||||
char *capsfile = NULL;
|
||||
@ -3505,7 +3507,7 @@ virQEMUCapsInitCached(virCapsPtr caps,
|
||||
goto discard;
|
||||
}
|
||||
|
||||
if (!virQEMUCapsIsValid(qemuCaps, qemuctime))
|
||||
if (!virQEMUCapsIsValid(qemuCaps, qemuctime, runUid, runGid))
|
||||
goto discard;
|
||||
|
||||
/* Discard cache if QEMU binary or libvirtd changed */
|
||||
@ -4357,7 +4359,8 @@ virQEMUCapsNewForBinaryInternal(virCapsPtr caps,
|
||||
|
||||
if (!cacheDir)
|
||||
rv = 0;
|
||||
else if ((rv = virQEMUCapsInitCached(caps, qemuCaps, cacheDir)) < 0)
|
||||
else if ((rv = virQEMUCapsInitCached(caps, qemuCaps, cacheDir,
|
||||
runUid, runGid)) < 0)
|
||||
goto error;
|
||||
|
||||
if (rv == 0) {
|
||||
@ -4412,8 +4415,12 @@ virQEMUCapsNewForBinary(virCapsPtr caps,
|
||||
|
||||
bool
|
||||
virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
|
||||
time_t qemuctime)
|
||||
time_t qemuctime,
|
||||
uid_t runUid,
|
||||
gid_t runGid)
|
||||
{
|
||||
bool kvmUsable;
|
||||
|
||||
if (!qemuCaps->binary)
|
||||
return true;
|
||||
|
||||
@ -4438,6 +4445,26 @@ virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
|
||||
return false;
|
||||
}
|
||||
|
||||
kvmUsable = virFileAccessibleAs("/dev/kvm", R_OK | W_OK,
|
||||
runUid, runGid) == 0;
|
||||
|
||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
|
||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM) &&
|
||||
kvmUsable) {
|
||||
VIR_DEBUG("KVM was not enabled when probing '%s', "
|
||||
"but it should be usable now",
|
||||
qemuCaps->binary);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
|
||||
!kvmUsable) {
|
||||
VIR_DEBUG("KVM was enabled when probing '%s', "
|
||||
"but it is not available now",
|
||||
qemuCaps->binary);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -4531,7 +4558,7 @@ virQEMUCapsCacheLookup(virCapsPtr caps,
|
||||
virMutexLock(&cache->lock);
|
||||
ret = virHashLookup(cache->binaries, binary);
|
||||
if (ret &&
|
||||
!virQEMUCapsIsValid(ret, 0)) {
|
||||
!virQEMUCapsIsValid(ret, 0, cache->runUid, cache->runGid)) {
|
||||
VIR_DEBUG("Cached capabilities %p no longer valid for %s",
|
||||
ret, binary);
|
||||
virHashRemoveEntry(cache->binaries, binary);
|
||||
|
@ -452,7 +452,9 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
|
||||
virCapsGuestMachinePtr **machines);
|
||||
|
||||
bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
|
||||
time_t ctime);
|
||||
time_t ctime,
|
||||
uid_t runUid,
|
||||
gid_t runGid);
|
||||
|
||||
void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
|
||||
const char *machineType);
|
||||
|
Loading…
x
Reference in New Issue
Block a user