qemu/hw
Hanna Reitz 7e5cdb345f ide: Increment BB in-flight counter for TRIM BH
When we still have an AIOCB registered for DMA operations, we try to
settle the respective operation by draining the BlockBackend associated
with the IDE device.

However, this assumes that every DMA operation is associated with an
increment of the BlockBackend’s in-flight counter (e.g. through some
ongoing I/O operation), so that draining the BB until its in-flight
counter reaches 0 will settle all DMA operations.  That is not the case:
For TRIM, the guest can issue a zero-length operation that will not
result in any I/O operation forwarded to the BlockBackend, and also not
increment the in-flight counter in any other way.  In such a case,
blk_drain() will be a no-op if no other operations are in flight.

It is clear that if blk_drain() is a no-op, the value of
s->bus->dma->aiocb will not change between checking it in the `if`
condition and asserting that it is NULL after blk_drain().

The particular problem is that ide_issue_trim() creates a BH
(ide_trim_bh_cb()) to settle the TRIM request: iocb->common.cb() is
ide_dma_cb(), which will either create a new request, or find the
transfer to be done and call ide_set_inactive(), which clears
s->bus->dma->aiocb.  Therefore, the blk_drain() must wait for
ide_trim_bh_cb() to run, which currently it will not always do.

To fix this issue, we increment the BlockBackend's in-flight counter
when the TRIM operation begins (in ide_issue_trim(), when the
ide_trim_bh_cb() BH is created) and decrement it when ide_trim_bh_cb()
is done.

Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2029980
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220120142259.120189-1-hreitz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Tested-by: John Snow <jsnow@redhat.com>
2022-03-07 09:19:20 +01:00
..
9pfs
acpi
adc
alpha
arm target/arm: Report KVM's actual PSCI version to guest in dtb 2022-03-02 19:27:37 +00:00
audio
avr
block block: rename bdrv_invalidate_cache_all, blk_invalidate_cache and test_sync_op_invalidate_cache 2022-03-04 18:14:40 +01:00
char
core clock-vmstate: Add missing END_OF_LIST 2022-03-02 18:12:40 +00:00
cpu
cris
display hw/display/vmware_vga: replace fprintf calls with trace events 2022-03-04 11:38:07 +01:00
dma
gpio
hppa
hyperv
i2c hw/i2c: flatten pca954x mux device 2022-03-02 19:27:36 +00:00
i386 hw/i386: Replace magic number with field length calculation 2022-03-04 11:24:52 +01:00
ide ide: Increment BB in-flight counter for TRIM BH 2022-03-07 09:19:20 +01:00
input hw/input/tsc210x: Don't abort on bad SPI word widths 2022-03-02 19:27:36 +00:00
intc hw/intc: Add RISC-V AIA IMSIC device emulation 2022-03-03 13:14:50 +10:00
ipack
ipmi
isa
m68k
mem
microblaze
mips
misc aspeed queue: 2022-02-28 16:46:45 +00:00
net
nios2
nubus
nvme hw/nvme: 64-bit pi support 2022-03-03 09:30:21 +01:00
nvram block: rename bdrv_invalidate_cache_all, blk_invalidate_cache and test_sync_op_invalidate_cache 2022-03-04 18:14:40 +01:00
openrisc
pci
pci-bridge
pci-host ppc/pnv: Add support for PHB5 "Address-based trigger" mode 2022-03-02 06:51:39 +01:00
pcmcia
ppc hw/ppc/spapr_vio.c: use g_autofree in spapr_dt_vdevice() 2022-03-02 06:51:40 +01:00
rdma
remote
riscv hw: riscv: opentitan: fixup SPI addresses 2022-03-03 13:14:50 +10:00
rtc rtc: Have event RTC_CHANGE identify the RTC by QOM path 2022-02-28 11:39:35 +01:00
rx
s390x
scsi
sd
sensor
sh4
smbios
sparc
sparc64
ssi migration: Remove load_state_old and minimum_version_id_old 2022-03-02 18:20:45 +00:00
timer
tpm
tricore
usb hw/usb/redirect.c: Stop using qemu_oom_check() 2022-03-04 11:20:16 +01:00
vfio
virtio
watchdog
xen
xenpv
xtensa
Kconfig
meson.build