[PATCH v3] vfio/pci: Propagate ACPI notifications to user-space via eventfd
by Grzegorz Jaszczyk
From: Grzegorz Jaszczyk <jaz(a)semihalf.com>
To allow pass-through devices receiving ACPI notifications, permit to
register ACPI notify handler (via introduced new ioctl) for a given
device. The handler role is to receive and propagate such ACPI
notifications to the user-space through the user provided eventfd. This
allows VMM to receive and propagate them further to the VM, where the
actual driver for pass-through device resides and can react to device
specific notifications accordingly.
The eventfd usage ensures VMM and device isolation: it allows to use a
dedicated channel associated with the device for such events, such that
the VMM has direct access.
Since the eventfd counter is used as ACPI notification value
placeholder, the eventfd signaling needs to be serialized in order to
not end up with notification values being coalesced. Therefore ACPI
notification values are buffered and signalized one by one, when the
previous notification value has been consumed.
Signed-off-by: Grzegorz Jaszczyk <jaz(a)semihalf.com>
---
Changelog v2..v3:
- Fix compilation warnings when building with "W=1"
Changelog v1..v2:
- The v2 implementation is actually completely different then v1:
instead of using acpi netlink events for propagating ACPI
notifications to the user space take advantage of eventfd, which can
provide better VMM and device isolation: it allows to use a dedicated
channel associated with the device for such events, such that the VMM
has direct access.
- Using eventfd counter as notification value placeholder was suggested
in v1 and requires additional serialization logic introduced in v2.
- Since the vfio-pci supports non-ACPI platforms address !CONFIG_ACPI
case.
- v1 discussion: https://patchwork.kernel.org/project/kvm/patch/20230307220553.631069-1-ja...
---
drivers/vfio/pci/vfio_pci_core.c | 214 +++++++++++++++++++++++++++++++
include/linux/vfio_pci_core.h | 11 ++
include/uapi/linux/vfio.h | 15 +++
3 files changed, 240 insertions(+)
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index a5ab416cf476..2d6101e89fde 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -10,6 +10,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <linux/acpi.h>
#include <linux/aperture.h>
#include <linux/device.h>
#include <linux/eventfd.h>
@@ -679,6 +680,70 @@ void vfio_pci_core_disable(struct vfio_pci_core_device *vdev)
}
EXPORT_SYMBOL_GPL(vfio_pci_core_disable);
+struct notification_queue {
+ int notification_val;
+ struct list_head notify_val_next;
+};
+
+#if IS_ENABLED(CONFIG_ACPI)
+static void vfio_pci_core_acpi_notify(acpi_handle handle, u32 event, void *data)
+{
+ struct vfio_pci_core_device *vdev = (struct vfio_pci_core_device *)data;
+ struct vfio_acpi_notification *acpi_notify = vdev->acpi_notification;
+ struct notification_queue *entry;
+
+ entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+ if (!entry)
+ return;
+
+ entry->notification_val = event;
+ INIT_LIST_HEAD(&entry->notify_val_next);
+
+ mutex_lock(&acpi_notify->notification_list_lock);
+ list_add_tail(&entry->notify_val_next, &acpi_notify->notification_list);
+ mutex_unlock(&acpi_notify->notification_list_lock);
+
+ schedule_work(&acpi_notify->acpi_notification_work);
+}
+
+static void vfio_pci_acpi_notify_close_device(struct vfio_pci_core_device *vdev)
+{
+ struct vfio_acpi_notification *acpi_notify = vdev->acpi_notification;
+ struct pci_dev *pdev = vdev->pdev;
+ struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+ struct notification_queue *entry, *entry_tmp;
+ u64 cnt;
+
+ if (!acpi_notify || !acpi_notify->acpi_notify_trigger)
+ return;
+
+ acpi_remove_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
+ vfio_pci_core_acpi_notify);
+
+ eventfd_ctx_remove_wait_queue(acpi_notify->acpi_notify_trigger,
+ &acpi_notify->wait, &cnt);
+
+ flush_work(&acpi_notify->acpi_notification_work);
+
+ mutex_lock(&acpi_notify->notification_list_lock);
+ list_for_each_entry_safe(entry, entry_tmp,
+ &acpi_notify->notification_list,
+ notify_val_next) {
+ list_del(&entry->notify_val_next);
+ kfree(entry);
+ }
+ mutex_unlock(&acpi_notify->notification_list_lock);
+
+ eventfd_ctx_put(acpi_notify->acpi_notify_trigger);
+
+ kfree(acpi_notify);
+
+ vdev->acpi_notification = NULL;
+}
+#else
+static void vfio_pci_acpi_notify_close_device(struct vfio_pci_core_device *vdev) {}
+#endif /* CONFIG_ACPI */
+
void vfio_pci_core_close_device(struct vfio_device *core_vdev)
{
struct vfio_pci_core_device *vdev =
@@ -705,6 +770,8 @@ void vfio_pci_core_close_device(struct vfio_device *core_vdev)
vdev->req_trigger = NULL;
}
mutex_unlock(&vdev->igate);
+
+ vfio_pci_acpi_notify_close_device(vdev);
}
EXPORT_SYMBOL_GPL(vfio_pci_core_close_device);
@@ -882,6 +949,151 @@ int vfio_pci_core_register_dev_region(struct vfio_pci_core_device *vdev,
}
EXPORT_SYMBOL_GPL(vfio_pci_core_register_dev_region);
+#if IS_ENABLED(CONFIG_ACPI)
+static int vfio_pci_eventfd_wakeup(wait_queue_entry_t *wait, unsigned int mode,
+ int sync, void *key)
+{
+ struct vfio_acpi_notification *acpi_notify =
+ container_of(wait, struct vfio_acpi_notification, wait);
+ __poll_t flags = key_to_poll(key);
+
+ /*
+ * eventfd_read signalize EPOLLOUT at the end of its function - this
+ * means previous eventfd with its notification value was consumed so
+ * the next notification can be signalized now if pending - schedule
+ * proper work.
+ */
+ if (flags & EPOLLOUT) {
+ mutex_unlock(&acpi_notify->notification_lock);
+ schedule_work(&acpi_notify->acpi_notification_work);
+ }
+
+ return 0;
+}
+
+static void vfio_pci_ptable_queue_proc(struct file *file,
+ wait_queue_head_t *wqh, poll_table *pt)
+{
+ struct vfio_acpi_notification *acpi_notify =
+ container_of(pt, struct vfio_acpi_notification, pt);
+
+ add_wait_queue(wqh, &acpi_notify->wait);
+}
+
+static void acpi_notification_work_fn(struct work_struct *work)
+{
+ struct vfio_acpi_notification *acpi_notify;
+ struct notification_queue *entry;
+
+ acpi_notify = container_of(work, struct vfio_acpi_notification,
+ acpi_notification_work);
+
+ mutex_lock(&acpi_notify->notification_list_lock);
+ if (list_empty(&acpi_notify->notification_list) || !acpi_notify->acpi_notify_trigger)
+ goto out;
+
+ /*
+ * If the previous eventfd was not yet consumed by user-space lets hold
+ * on and exit. The notification function will be rescheduled when
+ * signaling eventfd will be possible (when the EPOLLOUT will be
+ * signalized and unlocks notify_events).
+ */
+ if (!mutex_trylock(&acpi_notify->notification_lock))
+ goto out;
+
+ entry = list_first_entry(&acpi_notify->notification_list,
+ struct notification_queue, notify_val_next);
+
+ list_del(&entry->notify_val_next);
+ mutex_unlock(&acpi_notify->notification_list_lock);
+
+ eventfd_signal(acpi_notify->acpi_notify_trigger, entry->notification_val);
+
+ kfree(entry);
+
+ return;
+out:
+ mutex_unlock(&acpi_notify->notification_list_lock);
+}
+
+static int vfio_pci_ioctl_acpi_notify_eventfd(struct vfio_pci_core_device *vdev, struct
+ vfio_irq_info __user *arg)
+{
+ struct file *acpi_notify_trigger_file;
+ struct vfio_acpi_notification *acpi_notify;
+ struct pci_dev *pdev = vdev->pdev;
+ struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+ struct vfio_acpi_notify_eventfd entry;
+ struct eventfd_ctx *efdctx;
+ acpi_status status;
+
+ if (!adev)
+ return -ENODEV;
+
+ if (copy_from_user(&entry, arg, sizeof(entry)))
+ return -EFAULT;
+
+ if (entry.notify_eventfd < 0)
+ return -EINVAL;
+
+ efdctx = eventfd_ctx_fdget(entry.notify_eventfd);
+ if (IS_ERR(efdctx))
+ return PTR_ERR(efdctx);
+
+ vdev->acpi_notification = kzalloc(sizeof(*acpi_notify), GFP_KERNEL);
+ if (!vdev->acpi_notification)
+ return -ENOMEM;
+
+ acpi_notify = vdev->acpi_notification;
+
+ INIT_WORK(&acpi_notify->acpi_notification_work, acpi_notification_work_fn);
+ INIT_LIST_HEAD(&acpi_notify->notification_list);
+
+ acpi_notify->acpi_notify_trigger = efdctx;
+
+ mutex_init(&acpi_notify->notification_lock);
+
+ /*
+ * Install custom wake-up handler to be notified whenever underlying
+ * eventfd is consumed by the user-space.
+ */
+ init_waitqueue_func_entry(&acpi_notify->wait, vfio_pci_eventfd_wakeup);
+ init_poll_funcptr(&acpi_notify->pt, vfio_pci_ptable_queue_proc);
+
+ acpi_notify_trigger_file = eventfd_fget(entry.notify_eventfd);
+ vfs_poll(acpi_notify_trigger_file, &acpi_notify->pt);
+
+ status = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY,
+ vfio_pci_core_acpi_notify, (void *)vdev);
+
+ if (ACPI_FAILURE(status)) {
+ u64 cnt;
+
+ pci_err(pdev, "Failed to install notify handler: %s",
+ acpi_format_exception(status));
+
+ eventfd_ctx_remove_wait_queue(acpi_notify->acpi_notify_trigger,
+ &acpi_notify->wait, &cnt);
+
+ flush_work(&acpi_notify->acpi_notification_work);
+
+ eventfd_ctx_put(acpi_notify->acpi_notify_trigger);
+
+ kfree(acpi_notify);
+
+ return -ENODEV;
+ }
+
+ return 0;
+}
+#else
+static int vfio_pci_ioctl_acpi_notify_eventfd(struct vfio_pci_core_device *vdev, struct
+ vfio_irq_info __user *arg)
+{
+ return -ENODEV;
+}
+#endif /* CONFIG_ACPI */
+
static int vfio_pci_ioctl_get_info(struct vfio_pci_core_device *vdev,
struct vfio_device_info __user *arg)
{
@@ -1398,6 +1610,8 @@ long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,
return vfio_pci_ioctl_reset(vdev, uarg);
case VFIO_DEVICE_SET_IRQS:
return vfio_pci_ioctl_set_irqs(vdev, uarg);
+ case VFIO_ACPI_NOTIFY_EVENTFD:
+ return vfio_pci_ioctl_acpi_notify_eventfd(vdev, uarg);
default:
return -ENOTTY;
}
diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h
index 367fd79226a3..3711e8a1c6f0 100644
--- a/include/linux/vfio_pci_core.h
+++ b/include/linux/vfio_pci_core.h
@@ -49,6 +49,16 @@ struct vfio_pci_region {
u32 flags;
};
+struct vfio_acpi_notification {
+ struct eventfd_ctx *acpi_notify_trigger;
+ struct work_struct acpi_notification_work;
+ struct list_head notification_list;
+ struct mutex notification_list_lock;
+ struct mutex notification_lock;
+ poll_table pt;
+ wait_queue_entry_t wait;
+};
+
struct vfio_pci_core_device {
struct vfio_device vdev;
struct pci_dev *pdev;
@@ -96,6 +106,7 @@ struct vfio_pci_core_device {
struct mutex vma_lock;
struct list_head vma_list;
struct rw_semaphore memory_lock;
+ struct vfio_acpi_notification *acpi_notification;
};
/* Will be exported for vfio pci drivers usage */
diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
index 0552e8dcf0cb..d4b602d8f4b2 100644
--- a/include/uapi/linux/vfio.h
+++ b/include/uapi/linux/vfio.h
@@ -1622,6 +1622,21 @@ struct vfio_iommu_spapr_tce_remove {
};
#define VFIO_IOMMU_SPAPR_TCE_REMOVE _IO(VFIO_TYPE, VFIO_BASE + 20)
+/**
+ * VFIO_ACPI_NOTIFY_EVENTFD - _IOW(VFIO_TYPE, VFIO_BASE + 21, struct vfio_acpi_notify_eventfd)
+ *
+ * Register ACPI notify handler for a given device which will allow to receive
+ * and propagate ACPI notifications to the user-space through the user provided
+ * eventfd.
+ *
+ * Return: 0 on success, -errno on failure.
+ */
+struct vfio_acpi_notify_eventfd {
+ __s32 notify_eventfd;
+ __u32 reserved;
+};
+#define VFIO_ACPI_NOTIFY_EVENTFD _IO(VFIO_TYPE, VFIO_BASE + 21)
+
/* ***************************************************************** */
#endif /* _UAPIVFIO_H */
--
2.40.1.495.gc816e09b53d-goog
1 year, 6 months
[PATCH 00/12] docs: Finish conversion of non-generated docs to rST and fix and cleanup CSS
by Peter Krempa
Browse the results at:
https://pipo.sk.gitlab.io/-/libvirt/-/jobs/4294950526/artifacts/website/i...
Peter Krempa (12):
css: Drop styles for '#projects' id
css: Drop style for '#changelog' id
css: Drop style for 'p.image' selector
css: Drop styles for '.mail' class
css: Drop styles for '.gitmirror' class
css: mobile: Replace tabs with spaces
css: mobile: Fix responsive design of 'docs' and 'knowledgebase' pages
css: mobile: Fix hiding of big logo in mobile layout
css: mobile: Make colums in "3 column" mobile layout wider
css: Fix styling of the "3 panel" pages
docs: acl: Convert to 'rst'
docs: index: Convert to 'rst'
docs/acl.html.in | 101 ------------------------------
docs/acl.rst | 76 +++++++++++++++++++++++
docs/aclpolkit.rst | 2 +-
docs/css/libvirt.css | 143 ++++++++-----------------------------------
docs/css/mobile.css | 136 ++++++++++++++++++++--------------------
docs/index.html.in | 87 --------------------------
docs/index.rst | 70 +++++++++++++++++++++
docs/meson.build | 15 +----
8 files changed, 245 insertions(+), 385 deletions(-)
delete mode 100644 docs/acl.html.in
create mode 100644 docs/acl.rst
delete mode 100644 docs/index.html.in
create mode 100644 docs/index.rst
--
2.40.1
1 year, 6 months
[PATCH 0/3] qemu: Introduce pipewire audio backend
by Michal Privoznik
You'd expect to see src/qemu/qemu_capabilities.c changed, wouldn't you.
Well, there's no way to query for supported audio backends, see:
https://gitlab.com/libvirt/libvirt/-/issues/473
Michal Prívozník (3):
conf: Introduce pipewire audio backend
qemu: Generate cmd line for pipewire audio backend
NEWS: Document pipewire audio backend
NEWS.rst | 10 +++
docs/formatdomain.rst | 35 +++++++++-
src/conf/domain_conf.c | 70 +++++++++++++++++++
src/conf/domain_conf.h | 12 ++++
src/conf/schemas/domaincommon.rng | 37 ++++++++++
src/qemu/qemu_command.c | 63 +++++++++++++++++
src/qemu/qemu_validate.c | 1 +
.../audio-many-backends.x86_64-latest.args | 2 +
.../qemuxml2argvdata/audio-many-backends.xml | 1 +
.../audio-pipewire-best.x86_64-latest.args | 36 ++++++++++
.../qemuxml2argvdata/audio-pipewire-best.xml | 43 ++++++++++++
.../audio-pipewire-full.x86_64-latest.args | 36 ++++++++++
.../qemuxml2argvdata/audio-pipewire-full.xml | 43 ++++++++++++
.../audio-pipewire-minimal.x86_64-latest.args | 36 ++++++++++
.../audio-pipewire-minimal.xml | 36 ++++++++++
tests/qemuxml2argvtest.c | 12 ++++
.../audio-pipewire-best.xml | 43 ++++++++++++
.../audio-pipewire-full.xml | 43 ++++++++++++
.../audio-pipewire-minimal.xml | 36 ++++++++++
tests/qemuxml2xmltest.c | 3 +
20 files changed, 596 insertions(+), 2 deletions(-)
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-best.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-best.xml
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-full.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-full.xml
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-minimal.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/audio-pipewire-minimal.xml
create mode 100644 tests/qemuxml2xmloutdata/audio-pipewire-best.xml
create mode 100644 tests/qemuxml2xmloutdata/audio-pipewire-full.xml
create mode 100644 tests/qemuxml2xmloutdata/audio-pipewire-minimal.xml
--
2.39.3
1 year, 6 months
[PATCH 0/2] qemu_domin: Account for NVMe disks when calculating memlock limit on hotplug
by Michal Privoznik
*** BLURB HERE ***
Michal Prívozník (2):
qemu_domin: Account for NVMe disks when calculating memlock limit on
hotplug
qemu: Drop @forceVFIO argument of qemuDomainGetMemLockLimitBytes() and
qemuDomainAdjustMaxMemLock()
src/qemu/qemu_domain.c | 75 +++++++++++++++++++++++++++--------------
src/qemu/qemu_domain.h | 9 ++---
src/qemu/qemu_hotplug.c | 16 ++++-----
src/qemu/qemu_process.c | 2 +-
tests/qemumemlocktest.c | 2 +-
5 files changed, 64 insertions(+), 40 deletions(-)
--
2.39.3
1 year, 6 months
[PATCH 0/2] conf: Fix formatting of 'associativity' and 'policy' cache attributes
by Peter Krempa
Peter Krempa (2):
virDomainNumaDefNodeCacheParseXML: Refactor parsing of cache XML
conf: numa: Allow formatting 'none' values for 'associativity' and
'policy' of cache
src/conf/numa_conf.c | 73 +++++--------------
.../numatune-hmat-none.x86_64-latest.args | 49 +++++++++++++
tests/qemuxml2argvdata/numatune-hmat-none.xml | 54 ++++++++++++++
tests/qemuxml2argvtest.c | 1 +
.../numatune-hmat-none.x86_64-latest.xml | 55 ++++++++++++++
tests/qemuxml2xmltest.c | 1 +
6 files changed, 178 insertions(+), 55 deletions(-)
create mode 100644 tests/qemuxml2argvdata/numatune-hmat-none.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/numatune-hmat-none.xml
create mode 100644 tests/qemuxml2xmloutdata/numatune-hmat-none.x86_64-latest.xml
--
2.40.1
1 year, 6 months
[libvirt PATCH] docs: Fix broken link to Windows MSI downloads
by Kashyap Chamarthy
Right now the URL is 404 due to missing .html.
Reported by: Sebastien Wains <swains(a)redhat.com>
Signed-off-by: Kashyap Chamarthy <kchamart(a)redhat.com>
---
docs/windows.html.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/windows.html.in b/docs/windows.html.in
index 0f2d9061c4..561c08cfa1 100644
--- a/docs/windows.html.in
+++ b/docs/windows.html.in
@@ -17,7 +17,7 @@
<p>
Users who need pre-built Windows DLLs of libvirt are advised
to use the <a href="https://virt-manager.org">Virt Viewer</a>
- pre-compiled <a href="https://virt-manager.org/download/">Windows MSI packages</a>
+ pre-compiled <a href="https://virt-manager.org/download.html">Windows MSI packages</a>
</p>
<p>
--
2.40.0
1 year, 6 months
[PATCH] virmockstathelpers: Adapt to musl-1.2.4
by Michal Privoznik
With musl-1.2.3: I get the following macros defined (from
$builddir/meson-config.h):
#define WITH_LSTAT 1
#define WITH_LSTAT64 1
#define WITH_LSTAT_DECL 1
#define WITH_STAT 1
#define WITH_STAT64 1
#define WITH_STAT_DECL 1
#define WITH___LXSTAT 1
#define WITH___LXSTAT64 1
#define WITH___XSTAT 1
#define WITH___XSTAT64 1
which in turn means the virmockstathelpers.c ends up defining:
MOCK_STAT64
MOCK_LSTAT64
But with musl-1.2.4 everything changes and the set of defined
macros gets simplified to:
#define WITH_LSTAT 1
#define WITH_LSTAT_DECL 1
#define WITH_STAT 1
#define WITH_STAT_DECL 1
#define WITH___LXSTAT 1
#define WITH___XSTAT 1
which results in no MOCK_* macros defined in
virmockstathelpers.c, i.e. no stat() mocking, nada. The reason
for this simplification are thess musl commits [1][2] which removed all
64 bit aliases. And that's not what our logic for deciding what
flavor of stat() to mock counted with.
Nevertheless, we do build with Alpine Linux in our CI, so how
come we don't see this problem there? Well, simply because Alpine
Linux maintainers decided to revert the commits [3][4]. But on
distributions that use vanilla musl, this problem can be seen
easily.
1: https://git.musl-libc.org/cgit/musl/commit/?id=246f1c811448f37a44b41cd8df...
2: https://git.musl-libc.org/cgit/musl/commit/?id=25e6fee27f4a293728dd15b659...
3: https://git.alpinelinux.org/aports/commit/main/musl?id=6a5563fbb45b3d9d60...
4: https://git.alpinelinux.org/aports/commit/main/musl?id=a089bd852f8983623f...
Resolves: https://bugs.gentoo.org/906167
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tests/virmockstathelpers.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/tests/virmockstathelpers.c b/tests/virmockstathelpers.c
index 5b1f3b08a7..a02ee04503 100644
--- a/tests/virmockstathelpers.c
+++ b/tests/virmockstathelpers.c
@@ -64,6 +64,10 @@
* building on Apple Silicon (aarch64) those functions are missing
* from the header altogether and should not be mocked.
*
+ * Starting from 1.2.4, the musl library dropped 64-bit aliases, i.e. there's
+ * no stat64() only stat(). BTW: while musl implements __xstat(), it's never
+ * declared. And even the implementation is but a direct call to stat().
+ *
* With all this in mind the list of functions we have to mock will depend
* on several factors
*
@@ -82,7 +86,9 @@
#if !defined(__APPLE__)
# if !defined(WITH___XSTAT_DECL)
# if defined(WITH_STAT)
-# if !defined(WITH___XSTAT) && !defined(WITH_STAT64)
+# if (!defined(WITH___XSTAT) && !defined(WITH_STAT64)) || \
+ (defined(WITH_STAT) && defined(WITH_STAT_DECL) && !defined(WITH_STAT64) && \
+ !defined(WITH___XSTAT64)) /* glibc || musl */
# define MOCK_STAT
# endif
# endif
@@ -99,7 +105,9 @@
# endif /* WITH___XSTAT_DECL */
# if !defined(WITH___LXSTAT_DECL)
# if defined(WITH_LSTAT)
-# if !defined(WITH___LXSTAT) && !defined(WITH_LSTAT64)
+# if (!defined(WITH___LXSTAT) && !defined(WITH_LSTAT64)) || \
+ (defined(WITH_LSTAT) && defined(WITH_LSTAT_DECL) && !defined(WITH_LSTAT64) \
+ && !defined(WITH___LXSTAT64)) /* glibc || musl */
# define MOCK_LSTAT
# endif
# endif
--
2.39.3
1 year, 6 months
[PATCH 0/3] backup: Fix schema and default filename filling logic
by Peter Krempa
Reported by 'philipp' on OFTC.
Peter Krempa (3):
virDomainBackupDefAssignStore: Restructure control flow
conf: backup: Fix logic for generating default backup filenames
schemas: backup: Allow missing 'type' attribute for backup disk
src/conf/backup_conf.c | 17 +++++++++++------
src/conf/schemas/domainbackup.rng | 4 ++++
tests/domainbackupxml2xmlin/backup-push.xml | 3 +++
tests/domainbackupxml2xmlout/backup-push.xml | 9 +++++++++
4 files changed, 27 insertions(+), 6 deletions(-)
--
2.40.1
1 year, 6 months
[libvirt PATCH 0/3] qemu: Find dbus-daemon at runtime
by Andrea Bolognani
Same as the changes made recently for QEMU helpers, except
even more straightforward.
Andrea Bolognani (3):
qemu: Find dbus-daemon at runtime
meson: Stop looking for dbus-daemon
qemu: Update documentation for dbus_daemon qemu.conf key
meson.build | 12 ------------
src/qemu/qemu.conf.in | 4 +++-
src/qemu/qemu_conf.c | 1 +
src/qemu/qemu_dbus.c | 14 +++++++++-----
src/qemu/test_libvirtd_qemu.aug.in | 2 +-
5 files changed, 14 insertions(+), 19 deletions(-)
--
2.40.1
1 year, 6 months