}
+static int
+virCgroupV2DenyDevice(virCgroupPtr group,
+ char type,
+ int major,
+ int minor,
+ int perms)
+{
+ uint64_t key = virCgroupV2DevicesGetKey(major, minor);
+ uint32_t newval = virCgroupV2DevicesGetPerms(perms, type);
+ uint32_t val = 0;
+
+ if (virCgroupV2DevicesPrepareProg(group) < 0)
+ return -1;
+
+ if (group->unified.devices.count <= 0 ||
+ virBPFLookupElem(group->unified.devices.mapfd, &key, &val) < 0) {
+ VIR_DEBUG("nothing to do, device is not allowed");
+ return 0;
+ }
+
+ if (newval == val) {
+ if (virBPFDeleteElem(group->unified.devices.mapfd, &key) < 0) {
+ virReportSystemError(errno, "%s",
+ _("failed to remove device from BPF cgroup map"));
+ return -1;
+ }
+ group->unified.devices.count--;
+ } else {
+ val ^= val & newval;
+ if (virBPFUpdateElem(group->unified.devices.mapfd, &key, &val) < 0) {
+ virReportSystemError(errno, "%s",
+ _("failed to update device in BPF cgroup map"));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
virCgroupBackend virCgroupV2Backend = {
.type = VIR_CGROUP_BACKEND_TYPE_V2,
.getMemSwapUsage = virCgroupV2GetMemSwapUsage,
.allowDevice = virCgroupV2AllowDevice,
+ .denyDevice = virCgroupV2DenyDevice,
.setCpuShares = virCgroupV2SetCpuShares,
.getCpuShares = virCgroupV2GetCpuShares,