From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862921; cv=none; d=zohomail.com; s=zohoarc; b=kSVWtMAXRxXlgRSCJO6xxumj7NWueelo4wqI2+IYZ62jwZiPpY4HxNfZuvGD93/Bxm9ef0vH8zOPiUyuPBRvPj0HS/+KFGt3xtojSP7GOuWBl38448CQx+4C0tUcPpWJz8gO+bMhMsWQfBpa/d4ResbA+LsdA5MC/+nVQV2jiyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862921; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=F2xBTzfUJPYodvc2TaugF6oZDBuV9NLPBQJx1TnV3Es=; b=lfcJHV2aNkOT6wkemMGLXSNPHKsOb5gX8gs4bEXlV+1juko+qBfZYoZvyLyjP3R/gsugAQUFnWg/+HgxQyRo3hbPRC3MRCXsBNqBingvgcMFQVZhaVbh2eOC82ss00treGbyiWyRBekax9ixGD9+9kUfZb8dKe28NOKgcBD/7LM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862921513684.7785795874273; Tue, 4 Aug 2026 10:02:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVJ-0008WN-1O; Tue, 04 Aug 2026 13:00:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIV6-0008Ts-KX for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:26 -0400 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIV3-0000gN-RB for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:24 -0400 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-47fd4531020so4053f8f.3 for ; Tue, 04 Aug 2026 10:00:20 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862820; x=1786467620; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=F2xBTzfUJPYodvc2TaugF6oZDBuV9NLPBQJx1TnV3Es=; b=gCPkih+SgAzrV7Iy1P33lXbZ0LrjV4d4NGC/KUybAlO/26dBR4q4n+eTHcAkCfgYcT NjuQmuuykKPimCsv4JWyhvYhQCBI64ZzPx/9MIcMXOmH7/Y5C/74yX2xaWCdTNVzlb6I lK3uojTN5d4SHiXsP0p1WYCgeBqZfcK2V/T6KkefJMvG9pSM4QHPdO7pHj3gof5YqwUI 5MpXWN7Z0khnNLKWxb+l4zY9X2mbiLWjLW6KIqtM+1Q4TVtlBIN+i5pOquOKgX4Uou5r Gha8y6jokguD2Y8Vg87bezIFW55O3QqM2NL41GpDCgJjJ9JEXtMUgTT6KOXuHaqC7ts6 sCvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862820; x=1786467620; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=F2xBTzfUJPYodvc2TaugF6oZDBuV9NLPBQJx1TnV3Es=; b=Y6Ty9JWEmcvxKbMn2N13NH7nR7rUrtuM9ydxEsXT9jofOeDA0Gqr6AqB9PxmV96zFO scTS1TFwL9RSVsrovPXDszSXIUPbbUIx8iDoSrqe2cyRNWqbx9dYBod/igopURbG1U25 /PvGoQUakjoIH56ay9MnmwHyYpjfgzVsEXXYE72I1PoL7Rxj6RdYfXFNwcMMbLKWWj4p /kR5uXQs95oYP9FvWo2Y0pVxejCuqOH6H84Hvh4p24VtE5y3mjGijp3DQ/H7n8chfG2v Odtgj5RfXZhh/iWE6rYQ+mfOPGjVDHJaO8iLncv/Y1KjRJuVM0cTa54QJMVb8i0QTjrq 9PVQ== X-Gm-Message-State: AOJu0Yx8bU2vJCyDte/g7bzU+ZAWxBPRHoNi1tmkT4CuFB+wMtk3h0VP 1mirl5RDL9eVMcnTU0LO8vclC88Cnc/ThU3yL48vfwfp9hBi26KqnsnbzGHYoEnR0No0Ggjq9n+ WaYVU X-Gm-Gg: AR+sD107X/i7c3Okw24qa3KrMhec0q0Bm44srEz/LK+rT5kV1UwsugMTUBWQ5wA4scu Sbo52OybFtaUsbXU0R1m5dCmOMfbIh2pLgmy7BpdByIQLBre1xoVbMZkRmXgvBa/XGO0c9eC3NO 1TZd/KTRf6FRFzf1lnkBQK/92xUc7N3vkpiw12jiBZRx5mJuZwkm22az2tE6Un4XUDAB4t8+VaW Q2/1qpap9Gxm2mNyqN2xqKQQuHTa8qCTkLifWeVbdawbtNNDVKRa9UXNjx4Gvo4/hO2L27iyGjL wmcs0ZpSOlw+75Ni9jQ83JEj4Mc2Te2JFTHSGsaNQoXiDggo86Z1tN/SLgnUyIIIxXVW7EE4G7M O03kDq5nGJd0PSbQiVGqYMsLD/vMTKtLfZUf6X7piHW8wc6fIz2srmqErVJ3J482PPvF89B6Clg AQM/3GE5fohYRawAFrHlXoQ7uH9zWwN1wKibzvYGM6lKuu1lcy3Yz9FqxZ X-Received: by 2002:adf:e010:0:10b0:47f:8ce7:8684 with SMTP id ffacd0b85a97d-47fec509a94mr1025169f8f.6.1785862819613; Tue, 04 Aug 2026 10:00:19 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 1/7] tests/qtest/ide-test: parametrize the ATAPI CD-ROM read test Date: Tue, 4 Aug 2026 19:00:08 +0200 Message-ID: <20260804170015.3128363-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42a; envelope-from=den@openvz.org; helo=mail-wr1-x42a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862922280158500 cdrom_pio_impl() and test_cdrom_dma() duplicate the same image setup and data-integrity check around two different transfer mechanisms. Fold them into a single cdrom_read_impl(nblocks, flags) helper, with a CDROM_PIO/CDROM_DMA flag selecting the transfer, so further read coverage can be added once for both paths. No functional change: /ide/cdrom/pio, pio_large and dma run exactly as before. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 145 +++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 78 deletions(-) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index 721e78170b..c97bc17b67 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -1034,8 +1034,12 @@ static void ide_wait_intr(QTestState *qts, int irq) g_assert_not_reached(); } =20 -static void cdrom_pio_impl(int nblocks) +#define CDROM_PIO 0 +#define CDROM_DMA (1 << 0) + +static void cdrom_read_impl(int nblocks, unsigned flags) { + bool dma =3D flags & CDROM_DMA; QTestState *qts; QPCIDevice *dev; QPCIBar bmdma_bar, ide_bar; @@ -1063,57 +1067,75 @@ static void cdrom_pio_impl(int nblocks) dev =3D get_pci_device(qts, &bmdma_bar, &ide_bar); qtest_irq_intercept_in(qts, "ioapic"); =20 - /* PACKET command on device 0 */ - qpci_io_writeb(dev, ide_bar, reg_device, 0); - qpci_io_writeb(dev, ide_bar, reg_lba_middle, BYTE_COUNT_LIMIT & 0xFF); - qpci_io_writeb(dev, ide_bar, reg_lba_high, (BYTE_COUNT_LIMIT >> 8 & 0x= FF)); - qpci_io_writeb(dev, ide_bar, reg_command, CMD_PACKET); - /* HP0: Check_Status_A State */ - nsleep(qts, 400); - data =3D ide_wait_clear(qts, BSY); - /* HP1: Send_Packet State */ - assert_bit_set(data, DRQ | DRDY); - assert_bit_clear(data, ERR | DF | BSY); - - /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); - - /* Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. - * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 bytes. - * We allow an odd limit only when the remaining transfer size is - * less than BYTE_COUNT_LIMIT. However, SCSI's read10 command can only - * request n blocks, so our request size is always even. - * For this reason, we assume there is never a hanging byte to fetch. = */ - g_assert(!(rxsize & 1)); - limit =3D BYTE_COUNT_LIMIT & ~1; - for (i =3D 0; i < DIV_ROUND_UP(rxsize, limit); i++) { - size_t offset =3D i * (limit / 2); - size_t rem =3D (rxsize / 2) - offset; - - /* HP3: INTRQ_Wait */ - ide_wait_intr(qts, IDE_PRIMARY_IRQ); + if (dma) { + uintptr_t guest_buf =3D guest_alloc(&guest_malloc, rxsize); + PrdtEntry prdt[1]; + + prdt[0].addr =3D cpu_to_le32(guest_buf); + prdt[0].size =3D cpu_to_le32(rxsize | PRDT_EOT); + + send_dma_request_dev(qts, dev, bmdma_bar, ide_bar, CMD_PACKET, 0, + nblocks, prdt, ARRAY_SIZE(prdt), + send_scsi_cdb_read10); =20 - /* HP2: Check_Status_B (and clear IRQ) */ + qtest_memread(qts, guest_buf, rx, rxsize); + } else { + /* PACKET command on device 0 */ + qpci_io_writeb(dev, ide_bar, reg_device, 0); + qpci_io_writeb(dev, ide_bar, reg_lba_middle, BYTE_COUNT_LIMIT & 0x= FF); + qpci_io_writeb(dev, ide_bar, reg_lba_high, + (BYTE_COUNT_LIMIT >> 8 & 0xFF)); + qpci_io_writeb(dev, ide_bar, reg_command, CMD_PACKET); + /* HP0: Check_Status_A State */ + nsleep(qts, 400); data =3D ide_wait_clear(qts, BSY); + /* HP1: Send_Packet State */ assert_bit_set(data, DRQ | DRDY); assert_bit_clear(data, ERR | DF | BSY); =20 - /* HP4: Transfer_Data */ - for (j =3D 0; j < MIN((limit / 2), rem); j++) { - rx[offset + j] =3D cpu_to_le16(qpci_io_readw(dev, ide_bar, - reg_data)); + /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ + send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); + + /* + * Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. + * If BYTE_COUNT_LIMIT is odd, we transfer BYTE_COUNT_LIMIT - 1 by= tes. + * We allow an odd limit only when the remaining transfer size is + * less than BYTE_COUNT_LIMIT. However, SCSI's read10 command can = only + * request n blocks, so our request size is always even. + * For this reason, we assume there is never a hanging byte to fet= ch. + */ + g_assert(!(rxsize & 1)); + limit =3D BYTE_COUNT_LIMIT & ~1; + for (i =3D 0; i < DIV_ROUND_UP(rxsize, limit); i++) { + size_t offset =3D i * (limit / 2); + size_t rem =3D (rxsize / 2) - offset; + + /* HP3: INTRQ_Wait */ + ide_wait_intr(qts, IDE_PRIMARY_IRQ); + + /* HP2: Check_Status_B (and clear IRQ) */ + data =3D ide_wait_clear(qts, BSY); + assert_bit_set(data, DRQ | DRDY); + assert_bit_clear(data, ERR | DF | BSY); + + /* HP4: Transfer_Data */ + for (j =3D 0; j < MIN((limit / 2), rem); j++) { + rx[offset + j] =3D cpu_to_le16(qpci_io_readw(dev, ide_bar, + reg_data)); + } } - } =20 - /* Check for final completion IRQ */ - ide_wait_intr(qts, IDE_PRIMARY_IRQ); + /* Check for final completion IRQ */ + ide_wait_intr(qts, IDE_PRIMARY_IRQ); =20 - /* Sanity check final state */ - data =3D ide_wait_clear(qts, DRQ); - assert_bit_set(data, DRDY); - assert_bit_clear(data, DRQ | ERR | DF | BSY); + /* Sanity check final state */ + data =3D ide_wait_clear(qts, DRQ); + assert_bit_set(data, DRDY); + assert_bit_clear(data, DRQ | ERR | DF | BSY); + } =20 g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + g_free(pattern); g_free(rx); test_bmdma_teardown(qts); @@ -1122,51 +1144,18 @@ static void cdrom_pio_impl(int nblocks) =20 static void test_cdrom_pio(void) { - cdrom_pio_impl(1); + cdrom_read_impl(1, CDROM_PIO); } =20 static void test_cdrom_pio_large(void) { /* Test a few loops of the PIO DRQ mechanism. */ - cdrom_pio_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE); + cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_PIO); } =20 - static void test_cdrom_dma(void) { - QTestState *qts; - static const size_t len =3D ATAPI_BLOCK_SIZE; - size_t ret; - char *pattern =3D g_malloc(ATAPI_BLOCK_SIZE * 16); - char *rx =3D g_malloc0(len); - uintptr_t guest_buf; - PrdtEntry prdt[1]; - FILE *fh; - - qts =3D ide_test_start( - "-drive if=3Dnone,file=3D%s,media=3Dcdrom,format=3Draw,id=3Dsr= 0,index=3D0 " - "-device ide-cd,drive=3Dsr0,bus=3Dide.0", tmp_path[0]); - qtest_irq_intercept_in(qts, "ioapic"); - - guest_buf =3D guest_alloc(&guest_malloc, len); - prdt[0].addr =3D cpu_to_le32(guest_buf); - prdt[0].size =3D cpu_to_le32(len | PRDT_EOT); - - generate_pattern(pattern, ATAPI_BLOCK_SIZE * 16, ATAPI_BLOCK_SIZE); - fh =3D fopen(tmp_path[0], "wb+"); - ret =3D fwrite(pattern, ATAPI_BLOCK_SIZE, 16, fh); - g_assert_cmpint(ret, =3D=3D, 16); - fclose(fh); - - send_dma_request(qts, CMD_PACKET, 0, 1, prdt, 1, send_scsi_cdb_read10); - - /* Read back data from guest memory into local qtest memory */ - qtest_memread(qts, guest_buf, rx, len); - g_assert_cmpint(memcmp(pattern, rx, len), =3D=3D, 0); - - g_free(pattern); - g_free(rx); - test_bmdma_teardown(qts); + cdrom_read_impl(1, CDROM_DMA); } =20 int main(int argc, char **argv) --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862962; cv=none; d=zohomail.com; s=zohoarc; b=ANEsPfoILfuJaLFYEMD2QOkCab6MzRvvn7BC6qAjVdqEpdb9N9beo+bZCe3mzGjwIgeSA+aAOkxAi934+J0gHx2BpdqGMdyNUvPF1QmHt13uBEYEzhAV8iIAmCV9D4oK6qiNgvHW8UCr5fFoGW8AMjmdj3LHymTOSyVt1/WUXvI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862962; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cF/zvKp9V5nTLdLrbCLO9LIP5tYkEtz26Z+Uxc6lVP8=; b=LhEUjOi0HZsPnPBt/8vlf+Ok0sKCDBfjp6B0yWWX8AYIPByzvWUxYNltZFvOuBXbR/jyp4Dhr0gf9sDjxENzG9XJlHjAW5hGhRSbcNCXjjMIBlNpG3u+YNpVhdMD+HI2/2LvQqHxmcLdw86chPE4cY98m6h4fzsYLbll6DjdyiA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178586296271119.082399271081385; Tue, 4 Aug 2026 10:02:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVH-0008VW-FH; Tue, 04 Aug 2026 13:00:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIV7-0008Tv-VR for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:26 -0400 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIV6-0000gy-BC for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:25 -0400 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-47fecbbafdaso4380f8f.0 for ; Tue, 04 Aug 2026 10:00:23 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862822; x=1786467622; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=cF/zvKp9V5nTLdLrbCLO9LIP5tYkEtz26Z+Uxc6lVP8=; b=P0Av0vUmAsTmLJpMdcZd3xEhwxxcF+5yPE2VjdiLTKs6Zjxt2nDQohxU8CkfdjPJEF bfTbJCMcDg01nqNiyOdzTxWK1gPQIcv0ud6mssBYpL6UMCub7vldlNagzUGQiJa73Vd7 LMHprgRb6IsFpuXaL9r6+doeM/5E3gSgYyeaXo7Q4XCP3F4Vatdmz3p6GIsT5PHRqMD5 EJKMxyS4CyyMJQqK5fRIRIclzmZAgXSItdlyL5J02rQoiLZZtXAwBVNBfMGSrVhEnHXT ZW5ntEE37Fc4+vL1EhdBEJXDx1Re9K6Nzyk8498Z6jDKRI+rQWR9Gj4N0mJtdK1Og3xD YarA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862822; x=1786467622; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=cF/zvKp9V5nTLdLrbCLO9LIP5tYkEtz26Z+Uxc6lVP8=; b=YSOQQB0zIHLsAZnK9oAgnAzx56Jjcp1ArmuqDwUk3q40JpMAcx5fB+VEDzWJHu+6Tp 9WE9F6QqR/ZIHxIwarCb1ujAYjjO0+weLuDETLI09CmW0aagm1Nw2N8h2A+BIPq9tCRj HjnkuOFLnPqGR2G09qd2KhrWYQtWZZjqqr2QJYt4n82zw+AVBwVCkrqBND0jNIzY2ykU okjBttUdKKjw68A1Vyi5h3he4ltjJSIxN5Ek2KiOQr3PYxWdLZ8cF8w+IPN8RC9aiOD7 0lq2mOR6Ru2hCXxJHFjpBvhKR7uxbSYVhzoKdJgnab54/LYCsWQpIoM3nljxZzo4zP3Y k1UQ== X-Gm-Message-State: AOJu0YwlWL6pDtynu1H8n2b1tuOV1oPNyvkfgYO13qxjtvPvqxCRRcyQ 1tXRcxtBCE5nvWiFGdJjHAY2DGFhyt/Hlz1Jk89XbCDtLXTT71xinG6Zv1EtKH5ikHIVbo1jOI3 Gvcxe X-Gm-Gg: AR+sD13E74UPuAO9bIOMLnYzixtF0Vi6bADy3NHahx/qdFsuvphO/6mmNtRmcDDrHp8 BEhgoMyeOs0+cLXWQldKjWe8vsrVp/v2CaM0eSkRYjdMxxnXrV7sgX+TekNz8t2TKk+95SB84pS umdNsR/fR3auj/xzvMnuKHoJjz78JnEKLhmvkoKvrQFzStHg9pqK3XOXnW0+eYEGPXp2KHaCN6r 7Vx6gHUKFcUbfJwb1y7f542kcFFFCtaaZqou0yLwRsketwjvyKox4qJOfzj0jJ0Mzy7aJ76i9If 4Ep1bm8JAXvYPL82rOERZiSgjIPjFBZIJ6d3lZYNB2utUOs4HbMd/g/4Esz+931dURGrA+g6UBg jBAiJvyXWYLBxqV+Ms8pccOIZKBWUoVCeViJWw1nduKW31iVRjt7vVtRmOGY3ieFjIiHtQ8ADBZ dUcPxYSY7OyVOkQbxK+CCWC0X/M3OrnfoVanxRZYMz1itvLQ== X-Received: by 2002:a05:6000:2913:b0:47f:973b:71c8 with SMTP id ffacd0b85a97d-47fec62e4eamr909420f8f.21.1785862821108; Tue, 04 Aug 2026 10:00:21 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 2/7] tests/qtest/ide-test: add a multi-sector ATAPI DMA read test Date: Tue, 4 Aug 2026 19:00:09 +0200 Message-ID: <20260804170015.3128363-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42a; envelope-from=den@openvz.org; helo=mail-wr1-x42a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862964469158500 test_cdrom_pio_large() already exercises a multi-sector PIO read. Add the DMA counterpart through the same cdrom_read_impl() helper so the multi-block ATAPI DMA read path gets equivalent coverage. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index c97bc17b67..6e59197566 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -1158,6 +1158,11 @@ static void test_cdrom_dma(void) cdrom_read_impl(1, CDROM_DMA); } =20 +static void test_cdrom_dma_large(void) +{ + cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_DMA); +} + int main(int argc, char **argv) { const char *base; @@ -1217,6 +1222,7 @@ int main(int argc, char **argv) qtest_add_func("/ide/cdrom/pio", test_cdrom_pio); qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large); qtest_add_func("/ide/cdrom/dma", test_cdrom_dma); + qtest_add_func("/ide/cdrom/dma_large", test_cdrom_dma_large); =20 ret =3D g_test_run(); =20 --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862865; cv=none; d=zohomail.com; s=zohoarc; b=gLmOvVa6AXWOgoUpRtZgsZvW8MF2Y2Hz+/irrwg+SZrEg6OUQ5O8BtHHrYcuUKhYSNu4F72dA0SNMGYhYB1zVtgjPanvwg/wlwcLwYKA/rvEFvMc6IiVF5E1e9HvGyMWsIXvoHeLBE/aYXJ9zcEB/yawD/F7vKSew/tQKYt5S/c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862865; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=wLakvxnIRFSxCYZO4hGDcvxqjxdPRortIqu6+A1Fb4I=; b=fiKCytCxbr/3WGFnTA8bgBu/tPn2JeNAONJrGwv+QmJ3FJF0Xugg0gBRCua9hsYs1Z1tuone3dYJiAn8vS6ku4RyVYvDvvxIXsocxcj9Vzcv+6KPx4eI9JUUuHSQfRy7rqwHcc5kf44DHqCYYKSU5ERyhYS9ZF+WirjNCEf7Kvw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862865741667.741556272582; Tue, 4 Aug 2026 10:01:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVI-0008W9-KJ; Tue, 04 Aug 2026 13:00:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIVA-0008Ul-5Y for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:34 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIV8-0000hS-58 for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:27 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-4799b3f7c83so7601f8f.2 for ; Tue, 04 Aug 2026 10:00:25 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862825; x=1786467625; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=wLakvxnIRFSxCYZO4hGDcvxqjxdPRortIqu6+A1Fb4I=; b=rZJvEpcfI9W7C2dOrVYMmtYY3w8lINRNz8omdAVtVyduqskbtPF0eQi+sBkJSlcc3M 9wUSFt69LEQqO7unN3bOwDI9Cq5QNP6rKegf8Lm45RM7jVjN77KFB60hKPOE7CoR2qwL fwD1ktDHYK1Iv8lRV///VZiES1RuIFPO9OpP6KUDkuN/rv/9cKvUBsS6DvhofjbqQh+H XK1byp1gdKGdmiWne6T2yPcxFUYXgkwIS9TOgAEaCZlOKelLxTSJfQ18SGuXgTfCOEuf 100iwc1wiaNQyTrQp+g2vxK7k+bbv8OaR1AivAb9EIriZ6oaKxn90tOD0Vf6O0++CQRH MTGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862825; x=1786467625; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wLakvxnIRFSxCYZO4hGDcvxqjxdPRortIqu6+A1Fb4I=; b=m1VPfTkH1WFWvKpDe1Ue43TzAKwF6jw1uARbkuZy63nYG35BH148UAWhr1I5S4d2p7 eTfI/tnu+fj/7sYxzdS3NFBWocNxu7dblg9qf7uCdj0BO2/bmIEyyI2ujXOLHGNX3PGj 4nQXUanAoSsln5wuZdltl3bxiKmWIBdnYGO777OTTsUyiRYSkeIMfOrYq4OAOA36IY+r RvDFbGQqEWhG7rlVd9Ylmc13alwskbIhIfeiFNE5KF/bpsGSu+1OBm10VuYEkeknyq4U pY4EY8UJA2GxzaX0Cm1oIdRT3AhjAGwjjDemCApVF2Y9JRnoEOsshCpN3kAxFCZEm4VU xZ+w== X-Gm-Message-State: AOJu0Yw7B9TnyuqDL6K50ATFq3S6nwkjjWdI9bg9vz2D8BG4uMytkc85 SP7O78L/FyOitpl4dtO/vTbkDkO1+gjMhq9uJenewqSYh2dqanylwLKrOvL2RVq97kT5bPbYtYd U3YQx X-Gm-Gg: AR+sD12/KtIWfe8mv4tZrsM0HIXLspur7elkAgXf2pTAMm8IHHJfDx93efDeGheoVWR ZgMZtq9UAkZn0vWLOvcpf9PVn3ElQ6DPOqNuCt9GaqHKoTARd3iSaKfSUQGwhITdZt+gt1W8LSB v8sb1NopYEv8++kKrLvvgup9iqWyMByGp9JySAbHPV3jpWa9HS1ZqT4zR+ZhNHcl3v8ZlcY7ONl hxfimp3GSipe/qw9ALc50lccZhJVbzOMjyH68o9sTw1HyN0a6x1X615k/OlPhoyeZmwJYNGxCA+ 3ix/NQJKo53jkPlAs/qCZ3hXhK3RjPt7ToWyx3WhkiHTdpQQbko+jJPsbdtDVVqFmQf9yQjp3YV Uwa+jRqW5/BznfN4y2bX53EjepIff/DybAEok9IBdLLLcAgWLUHYczZF7yc0J26HKDITj9dV2hi pcjH/UbPxBr8U9EcMUgGJbbqX8KZzkI9GnDkOxPDAEhWmVrQ== X-Received: by 2002:a05:6000:290a:b0:47f:9283:1fb3 with SMTP id ffacd0b85a97d-47fec478c10mr1211134f8f.0.1785862822974; Tue, 04 Aug 2026 10:00:22 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 3/7] tests/qtest/ide-test: cover raw (2352-byte) ATAPI CD reads Date: Tue, 4 Aug 2026 19:00:10 +0200 Message-ID: <20260804170015.3128363-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::433; envelope-from=den@openvz.org; helo=mail-wr1-x433.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862868494158500 READ CD with the field-selector set to 0xf8 returns full 2352-byte raw sectors (sync + header + 2048 data + EDC/ECC), driving the ATAPI raw read path that READ10 never touches. Add a send_scsi_cdb_read_cd() helper and a CDROM_RAW flag to cdrom_read_impl(), then exercise both PIO and DMA. The PIO case uses a byte-count limit spanning several raw sectors so the device must rebuffer mid-burst, and each sector's 2048-byte payload is verified at its in-sector offset. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ide-test.c | 76 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 6 deletions(-) diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c index 6e59197566..b36b0f8875 100644 --- a/tests/qtest/ide-test.c +++ b/tests/qtest/ide-test.c @@ -48,6 +48,10 @@ =20 #define ATAPI_BLOCK_SIZE 2048 =20 +/* Raw READ CD sector: 12 sync + 4 header + 2048 data + 288 EDC/ECC. */ +#define ATAPI_RAW_SIZE 2352 +#define ATAPI_RAW_DATA 16 + /* How many bytes to receive via ATAPI PIO at one time. * Must be less than 0xFFFF. */ #define BYTE_COUNT_LIMIT 5120 @@ -982,6 +986,41 @@ static void send_scsi_cdb_read10(QPCIDevice *dev, QPCI= Bar ide_bar, } } =20 +typedef struct ReadCDCDB { + uint8_t opcode; + uint8_t sector_type; + uint32_t lba; + uint8_t length[3]; + uint8_t main_channel; + uint8_t sub_channel; + uint8_t control; +} __attribute__((__packed__)) ReadCDCDB; + +static void send_scsi_cdb_read_cd(QPCIDevice *dev, QPCIBar ide_bar, + uint64_t lba, int nblocks) +{ + ReadCDCDB pkt =3D { }; + int i; + + g_assert_cmpint(lba, <=3D, UINT32_MAX); + g_assert_cmpint(nblocks, >=3D, 0); + g_assert_cmpint(nblocks, <=3D, 0xffffff); + + /* Construct SCSI CDB packet */ + pkt.opcode =3D 0xbe; + pkt.lba =3D cpu_to_be32(lba); + pkt.length[0] =3D (nblocks >> 16) & 0xff; + pkt.length[1] =3D (nblocks >> 8) & 0xff; + pkt.length[2] =3D nblocks & 0xff; + pkt.main_channel =3D 0xf8; /* sync + headers + user data + EDC/ECC: 23= 52 */ + + /* Send Packet */ + for (i =3D 0; i < sizeof(ReadCDCDB) / 2; i++) { + qpci_io_writew(dev, ide_bar, reg_data, + le16_to_cpu(((uint16_t *)&pkt)[i])); + } +} + static void nsleep(QTestState *qts, int64_t nsecs) { const struct timespec val =3D { .tv_nsec =3D nsecs }; @@ -1036,10 +1075,12 @@ static void ide_wait_intr(QTestState *qts, int irq) =20 #define CDROM_PIO 0 #define CDROM_DMA (1 << 0) +#define CDROM_RAW (1 << 1) =20 static void cdrom_read_impl(int nblocks, unsigned flags) { bool dma =3D flags & CDROM_DMA; + bool raw =3D flags & CDROM_RAW; QTestState *qts; QPCIDevice *dev; QPCIBar bmdma_bar, ide_bar; @@ -1047,8 +1088,11 @@ static void cdrom_read_impl(int nblocks, unsigned fl= ags) int patt_blocks =3D MAX(16, nblocks); size_t patt_len =3D ATAPI_BLOCK_SIZE * patt_blocks; char *pattern =3D g_malloc(patt_len); - size_t rxsize =3D ATAPI_BLOCK_SIZE * nblocks; + unsigned xfer =3D raw ? ATAPI_RAW_SIZE : ATAPI_BLOCK_SIZE; + size_t rxsize =3D xfer * nblocks; uint16_t *rx =3D g_malloc0(rxsize); + void (*send_cdb)(QPCIDevice *, QPCIBar, uint64_t, int) =3D + raw ? send_scsi_cdb_read_cd : send_scsi_cdb_read10; int i, j; uint8_t data; uint16_t limit; @@ -1075,8 +1119,7 @@ static void cdrom_read_impl(int nblocks, unsigned fla= gs) prdt[0].size =3D cpu_to_le32(rxsize | PRDT_EOT); =20 send_dma_request_dev(qts, dev, bmdma_bar, ide_bar, CMD_PACKET, 0, - nblocks, prdt, ARRAY_SIZE(prdt), - send_scsi_cdb_read10); + nblocks, prdt, ARRAY_SIZE(prdt), send_cdb); =20 qtest_memread(qts, guest_buf, rx, rxsize); } else { @@ -1093,8 +1136,7 @@ static void cdrom_read_impl(int nblocks, unsigned fla= gs) assert_bit_set(data, DRQ | DRDY); assert_bit_clear(data, ERR | DF | BSY); =20 - /* SCSI CDB (READ10) -- read n*2048 bytes from block 0 */ - send_scsi_cdb_read10(dev, ide_bar, 0, nblocks); + send_cdb(dev, ide_bar, 0, nblocks); =20 /* * Read data back: occurs in bursts of 'BYTE_COUNT_LIMIT' bytes. @@ -1134,7 +1176,17 @@ static void cdrom_read_impl(int nblocks, unsigned fl= ags) assert_bit_clear(data, DRQ | ERR | DF | BSY); } =20 - g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + if (raw) { + /* The 2048-byte payload of each raw sector sits past its header. = */ + for (i =3D 0; i < nblocks; i++) { + uint8_t *sec =3D (uint8_t *)rx + i * ATAPI_RAW_SIZE + ATAPI_RA= W_DATA; + + g_assert_cmpint(memcmp(sec, pattern + i * ATAPI_BLOCK_SIZE, + ATAPI_BLOCK_SIZE), =3D=3D, 0); + } + } else { + g_assert_cmpint(memcmp(pattern, rx, rxsize), =3D=3D, 0); + } =20 g_free(pattern); g_free(rx); @@ -1163,6 +1215,16 @@ static void test_cdrom_dma_large(void) cdrom_read_impl(BYTE_COUNT_LIMIT * 4 / ATAPI_BLOCK_SIZE, CDROM_DMA); } =20 +static void test_cdrom_pio_raw(void) +{ + cdrom_read_impl(4, CDROM_RAW); +} + +static void test_cdrom_dma_raw(void) +{ + cdrom_read_impl(4, CDROM_DMA | CDROM_RAW); +} + int main(int argc, char **argv) { const char *base; @@ -1223,6 +1285,8 @@ int main(int argc, char **argv) qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large); qtest_add_func("/ide/cdrom/dma", test_cdrom_dma); qtest_add_func("/ide/cdrom/dma_large", test_cdrom_dma_large); + qtest_add_func("/ide/cdrom/pio_raw", test_cdrom_pio_raw); + qtest_add_func("/ide/cdrom/dma_raw", test_cdrom_dma_raw); =20 ret =3D g_test_run(); =20 --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862958; cv=none; d=zohomail.com; s=zohoarc; b=S0wf2HBjXKOsalP6XpKWWBIpjglJAAlaKTdG5IDk63OWq5dP6/3ooWbnSnEcA7JsYu4PhabxQJZBXxwc1jvtlTr4tn210vVzfKrzUIzUQcGnGdbBDmy7EQRtd/D+0c7JISwJ9ga5NpjlNEBUQToBhY6ROsNuljhTnBsc5/d+5+c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862958; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=FV5MKbsnMhY1E6YLy/SpDJtoSr5mU69E3e89mRGFx42rR4aHBhqBE8vIzZnabYYnHGvQ35ceBDVLapTFVNrjtIVpuWYPibufe+TpWW0+/Lkba6l6yEKJF1JBqNsgvmdmNqwgqUTEm/UUeb0HexkFuneZ2aLwaa1H6PjYxwqtLcg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862958860803.944782738704; Tue, 4 Aug 2026 10:02:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVL-00006m-GD; Tue, 04 Aug 2026 13:00:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIVJ-000051-Aw for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:37 -0400 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIVH-0000ib-Oc for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:37 -0400 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-47f633e6058so27619f8f.0 for ; Tue, 04 Aug 2026 10:00:35 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862834; x=1786467634; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=PwahHVmGkSIjcWIKyUnEygn8lE0VlB06XDTb3/ZVyig+rKqgD9TiDHU70iJtCAcmlu W6a5GNVoRvmWDoZq/EjM4axwzNvlqtBbFOzPBTF2rc5b+bCDAVE/e4zh68qAmBc4EC5U ZyvfDG0pEAhYJl1cze7BzauVUfaLEEC2a+Orz28j0x4HBZ19pgeEvW18bN2wGSt9ns4/ Ef7lMucKyxfqk1yKOx72mdXru8niN7VEBXaUJUkhtWJuyDkytxdp2cApIMdkiwa+/w2a 4wVkRY9+oRQU9cLKf2eaYhPyXsuVTB70hrUckKXba42CXMC/voBkk147Mi813H3Dbrlr BESg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862834; x=1786467634; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=agLMlyUmxtwx6g/99v7O2aIN4trfNG9SmIE8yPzBwqA=; b=ipA8fgHOHO64P7WOi2uVj1IqIoapVbXcU40ztKfl00/FBtnBU/pCZ+CwUqykxhUA+3 bn9ew3UUDrJleJiq42PipVZPNHTL1NEgGUWLCFPu0LSIINU1BE4JysCBVmRbbbs/E9wE eop3y361BSlwDWsVQhPJVBXVPGnUhjdEEwsMZ06msSIZRhQDJ6KZzCMFtUcMPGy37Aay 4CKB9xbLfjPOqZxRLU96qyp4JkjcIHBLXAppFiIuthC8l9Fao6Telc1Ue7Knt5k6bXLi WFeCYkX7hxN2jl97irqXnMC+FlQzHDKfbgT0tw6SAZ4alfU3H8SUbCX4XcxxiRCkn4Ms MVPQ== X-Gm-Message-State: AOJu0YxpixMsJepmKnriAgdDk8RGDgjD1hevdDA1xlpoQ6/5xSZZNWMm 8VXNlBZfywNweTvjcjaGbB8LSzn9jW6hCDxsA900O2vKo5FWTn+BARyPv7qVmbtClkXHWUWwwGC r4/Ac X-Gm-Gg: AR+sD11pF44kXFdETA/Hu4KtVdGw2Q0ju/GPWJOEfVjkg0vtO+92VJxpveH6Zg7UfkY Q69lrjNCV4IIInVyzAUY6AvRtZiB5sCPO3+sQIx7WUQniRgLQHAgVvtno05dbzu09Nn8GXgo3YM CW3375lDgTokVUCcjuSD3qhpj8jF5c2B6kaX0zGPW7kdq9topQIuQqjAtlc/OVlfK5ToOCWbg4j eBN4M03OfKNx75sj2/K/1e2e5fZ5vsFmNXNxT0YLRUEks7Pq9u7gGX6eSu/T6Awhrqmq7kHsHyg GtK8p07P3M76ohnhqybIOLVusXxGD+9hNfe09qUIIY7ZNaCCQYYqK4XlIBhJukQ+7sJkikDwr4e yLIdbg7fosvrNLiguQn1t0twiNK5i0vr6vw9ki0wlWUMG6thUN8E+WsJ7NcnWI5f3sOPKJhbgtc ZjCv3RGdI90HiYc6Qv50SOYEOrJhU9oDE= X-Received: by 2002:a05:6000:3113:b0:47f:80f0:8d33 with SMTP id ffacd0b85a97d-47fec6457camr980429f8f.30.1785862824261; Tue, 04 Aug 2026 10:00:24 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 4/7] tests/qtest/libqos/ahci: support raw (2352-byte) READ CD Date: Tue, 4 Aug 2026 19:00:11 +0200 Message-ID: <20260804170015.3128363-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::430; envelope-from=den@openvz.org; helo=mail-wr1-x430.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862960736158500 ahci_exec() always builds ATAPI commands with a 2048-byte logical sector size, so it cannot drive a READ CD that returns full 2352-byte raw sectors. Add an atapi_raw option that sets the READ CD field-selector to 0xf8 and the command's sector size to 2352 before the transfer is sized, so the derived block count stays correct while the buffer and byte counts cover the raw sectors. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/libqos/ahci.c | 5 +++++ tests/qtest/libqos/ahci.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tests/qtest/libqos/ahci.c b/tests/qtest/libqos/ahci.c index 0621a6c477..e3019a1eca 100644 --- a/tests/qtest/libqos/ahci.c +++ b/tests/qtest/libqos/ahci.c @@ -707,6 +707,11 @@ void ahci_exec(AHCIQState *ahci, uint8_t port, if (opts->atapi) { uint16_t bcl =3D opts->set_bcl ? opts->bcl : ATAPI_SECTOR_SIZE; cmd =3D ahci_atapi_command_create(op, bcl, opts->atapi_dma); + if (opts->atapi_raw) { + /* request full 2352-byte raw sectors; sector_size must match = */ + cmd->atapi_cmd[9] =3D 0xf8; + cmd->sector_size =3D ATAPI_RAW_SECTOR_SIZE; + } } else { cmd =3D ahci_command_create(op); } diff --git a/tests/qtest/libqos/ahci.h b/tests/qtest/libqos/ahci.h index a0487a1557..2a48a7523d 100644 --- a/tests/qtest/libqos/ahci.h +++ b/tests/qtest/libqos/ahci.h @@ -242,6 +242,7 @@ =20 #define AHCI_SECTOR_SIZE (512) #define ATAPI_SECTOR_SIZE (2048) +#define ATAPI_RAW_SECTOR_SIZE (2352) =20 #define AHCI_SIGNATURE_CDROM (0xeb140101) #define AHCI_SIGNATURE_DISK (0x00000101) @@ -485,6 +486,7 @@ typedef struct AHCIOpts { uint64_t buffer; /* Pointer to source or destination guest buffer */ bool atapi; /* ATAPI command? */ bool atapi_dma; /* Use DMA for ATAPI? */ + bool atapi_raw; /* READ CD returning 2352-byte raw sectors */ bool error; int (*pre_cb)(AHCIQState*, AHCICommand*, const struct AHCIOpts *); int (*mid_cb)(AHCIQState*, AHCICommand*, const struct AHCIOpts *); --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862865; cv=none; d=zohomail.com; s=zohoarc; b=mwL+diHn3XGvM+OBwnH6IBP2R67FxwNjD5Jc7d9xJ/S4ecGJgAhyBdpvlE6btQF2yHyDQ2ThMfsj+1kdpMrWh3YEhk7qlwkeuqQFCirxRsBx38kfmvIzWddyu2+vcWEjiJ9kU+ne3tSIVlwp0bNOSkUzxFntWRntHa9dF/Xemdw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862865; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=UG5IvEbeEQqtB8MltcsrGTmb0N6q1NPusUEGaO1Y9L9QQlTolp/2rdLoFpfuqs6j81dKr0Q9EZcf67K8kZmQYhw/eUzcoYrxxZJTXpj4DKV4mCMNlGq6i3HEAwttUW3fwHr07dMTojrY4UT8UyOWpBbpZfZquBD2/kJh6CM3yVI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862865612337.64423534257264; Tue, 4 Aug 2026 10:01:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVM-00006s-4P; Tue, 04 Aug 2026 13:00:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIVK-00006A-O3 for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:38 -0400 Received: from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIVI-0000ii-Kj for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:38 -0400 Received: by mail-wr1-x42e.google.com with SMTP id ffacd0b85a97d-47fe89fb333so16868f8f.3 for ; Tue, 04 Aug 2026 10:00:36 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862835; x=1786467635; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=Xv9eARI5x6MHTER8wpyJKJ4MANuGRlkshUC2ZvHmMDxpGhBClW0rxLrNuCHe41YYsz 1gy631tLsOV36a4wcaTnFbuPBNvpDsTZsV7xrIK421C+/exGLVFXPJ6ioG7NZdl+IM+Q ++HnCcH6dVxdvfykfj1oA5JDhhr3ZvXE31Z0yLIGU53bOnkrFGnwR0anyYGBUIQPl2Lj Zfn90o9xCayLSRfujyxUmbMka0BqomxYyEmoC3pxazE3DENT/phDhsneV886UkGxv+/W BAZoRh+xYZsoTtNkZ/nO5bj/Nhewyqsn19Lh0xbEJg1pi+cGEKyFgbEynXGYRXRJz+yj qUbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862835; x=1786467635; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0oNDH01FbQte7UkYHPhvNcB6113WA9wPSR1l+l/ks+A=; b=Kxh/+Lku22SYDVbT6T+7l1CHCckwbZYagn9me5sjN8P7Yaiop8E9ofRMyy1m53ZWR2 fEEqegDmDfbkIMqTtR+u/kmm8q4ggqJP9dJQlb2tJsV/IEnhgn8Z3hSxNZ6PiFJvSCEP Rq+2cSz4tuOpYmWW2MVvOjlzRdX3A8DBrxPS538v2RVt74/lxK94R9al1w2VdAfb9fuM Tr21NmOwUEJo6ORuCl7ZihkPUorS+dgsoARyw9U/q2wKwvRzQ6Uz2lUjoa0wNcJ4aL7X galzMoK1CybrRLAxJ+iSfaqLt6i6FpTNjpHM/eCe+VnAab/6m4NDLNZAKeTVaMdu/F4J 4Hsg== X-Gm-Message-State: AOJu0YxIdEZ+76d3Wi2A5YggcoH64oG+dFyUEiJs2BLmSUAN/n2Uf7Nz 5YI3AVWuGb97cmr9DVn8FAhTFDUjCJe/lT72sC66sYs1JRHqu3E+N/i7rPU98v6pAAlQ6kdYu8d m1UkI X-Gm-Gg: AR+sD12Eemp/0RRrrmK2k8lF2COGFt7uRnPRhq6YeWMLHcAkR/LEA+bWG1qZCqsOIP3 aQPeT+tmEEDTYAjfOEg7chGyE0LhnBHysfQlF3XmK2KQh9eyzn5rA/Bh1Mgxca++MMrAC3GZejE BX/eqxibQ08SAh+Qlq1FAYa+2Ct4a6GlqukdHtrUotiJ656yqxfIZv/QoKeoRVMC8lNtll+3R7i hZYvzbOmp++aOv+MeGbTwg9WxVCVfJ2DF0mQHUHN1Ar4lpqMTswgnNgxlhcn7DK2rNLvzBA/ps6 cy13st85kNKTnotfTbsi/1gd0zRCY1tAXrkdCzNdSEA+2UkJcIb+ctWakqqht71WLr7L6EyA1J0 8zRfcCDuJsl75VyuyR77PD42Ap8cLAoLjMOVKGvHWBD4hp7j2A7wIUVrH+V5OcXDsJAMo5qO8Lz fO513bCox+hviGwmBA0yul/IPnOjFSnJtuRFJNeqi96Zipuw== X-Received: by 2002:a05:6000:299b:20b0:462:e086:35f with SMTP id ffacd0b85a97d-47fec52b1aamr1021141f8f.21.1785862835001; Tue, 04 Aug 2026 10:00:35 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 5/7] tests/qtest/ahci: cover raw (2352-byte) ATAPI CD reads Date: Tue, 4 Aug 2026 19:00:12 +0200 Message-ID: <20260804170015.3128363-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42e; envelope-from=den@openvz.org; helo=mail-wr1-x42e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862867789158500 Add /ahci/cdrom/{pio,dma}/raw: read several sectors with READ CD in raw mode (atapi_raw), so the ATAPI 2352-byte unpack path is exercised through the AHCI delivery, which IDE coverage does not reach. Each sector's 2048-byte payload is verified at its in-sector offset. The PIO case uses a byte-count limit of one raw sector per DRQ burst: libqos asserts a one-sector PIO transfer, and the multi-sector unpack loop is already covered by the IDE raw test. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ahci-test.c | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c index 44799eea15..58bc04b3ef 100644 --- a/tests/qtest/ahci-test.c +++ b/tests/qtest/ahci-test.c @@ -1565,6 +1565,31 @@ static int ahci_cb_cmp_buff(AHCIQState *ahci, AHCICo= mmand *cmd, return 0; } =20 +static int ahci_cb_cmp_raw(AHCIQState *ahci, AHCICommand *cmd, + const AHCIOpts *opts) +{ + unsigned char *tx =3D opts->opaque; + unsigned char *rx; + unsigned i, nsectors; + + if (!opts->size) { + return 0; + } + + nsectors =3D opts->size / ATAPI_RAW_SECTOR_SIZE; + rx =3D g_malloc0(opts->size); + qtest_bufread(ahci->parent->qts, opts->buffer, rx, opts->size); + /* Each raw sector carries its 2048-byte payload past a 16-byte header= . */ + for (i =3D 0; i < nsectors; i++) { + g_assert_cmphex(memcmp(rx + i * ATAPI_RAW_SECTOR_SIZE + 16, + tx + i * ATAPI_SECTOR_SIZE, + ATAPI_SECTOR_SIZE), =3D=3D, 0); + } + g_free(rx); + + return 0; +} + static void ahci_test_cdrom(int nsectors, bool dma, uint8_t cmd, bool override_bcl, uint16_t bcl) { @@ -1625,6 +1650,47 @@ static void test_cdrom_pio_multi(void) ahci_test_cdrom_read10(3, false); } =20 +static void ahci_test_cdrom_raw(int nsectors, bool dma) +{ + AHCIQState *ahci; + unsigned char *tx; + char *iso; + int fd; + AHCIOpts opts =3D { + .size =3D (uint64_t)ATAPI_RAW_SECTOR_SIZE * nsectors, + .atapi =3D true, + .atapi_dma =3D dma, + .atapi_raw =3D true, + .set_bcl =3D true, + .bcl =3D ATAPI_RAW_SECTOR_SIZE, /* one raw sector per DRQ burst */ + .post_cb =3D ahci_cb_cmp_raw, + }; + uint64_t iso_size =3D (uint64_t)ATAPI_SECTOR_SIZE * (nsectors + 1); + + fd =3D prepare_iso(iso_size, &tx, &iso); + opts.opaque =3D tx; + + ahci =3D ahci_boot_and_enable("-drive if=3Dnone,id=3Ddrive0,file=3D%s,= format=3Draw " + "-M q35 " + "-device ide-cd,drive=3Ddrive0 ", iso); + + ahci_exec(ahci, ahci_port_select(ahci), CMD_ATAPI_READ_CD, &opts); + + g_free(tx); + ahci_shutdown(ahci); + remove_iso(fd, iso); +} + +static void test_cdrom_dma_raw(void) +{ + ahci_test_cdrom_raw(3, true); +} + +static void test_cdrom_pio_raw(void) +{ + ahci_test_cdrom_raw(3, false); +} + /* * Regression test: a buffered ATAPI read completing after a command * engine restart must not dereference the cleared cur_cmd. Cover both @@ -2100,8 +2166,10 @@ int main(int argc, char **argv) =20 qtest_add_func("/ahci/cdrom/dma/single", test_cdrom_dma); qtest_add_func("/ahci/cdrom/dma/multi", test_cdrom_dma_multi); + qtest_add_func("/ahci/cdrom/dma/raw", test_cdrom_dma_raw); qtest_add_func("/ahci/cdrom/pio/single", test_cdrom_pio); qtest_add_func("/ahci/cdrom/pio/multi", test_cdrom_pio_multi); + qtest_add_func("/ahci/cdrom/pio/raw", test_cdrom_pio_raw); =20 qtest_add_func("/ahci/cdrom/pio/bcl", test_atapi_bcl); qtest_add_func("/ahci/cdrom/eject", test_atapi_tray); --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862938; cv=none; d=zohomail.com; s=zohoarc; b=naDhWaKv37vDOh5Hk1scQBBRWpjho4NKpbQlfe9u8LP8EVJdIT65lNY2m/2eFk6lRWTh4PiNFIetRr8cpTLsFtFxXFddGbN6bds14j5i++PGKLo0Ieo6e+oo+0ePh1MWKTBaaCa0QG6+d3YcHgggKotYfb1+iekK6Nn3ps7d6kc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862938; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=GBzqqM1MZ/9f5ZCRJUjao6HKm4AsrAWCGDABWP1HLDYZuhxYxW7XoEAQHZ1nZ117K9Jt2UABuYpZDUDi15sBh2iwrVyawDE9g7oCOSk48sYLqTh1HLo3FTXk6MdxskGkVQZFucitbL3XhkzPZ7LefpQRSYL6/i/xh9iIHjeHyvQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862938547454.08703045033167; Tue, 4 Aug 2026 10:02:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVN-00008Z-Kr; Tue, 04 Aug 2026 13:00:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIVM-00006q-2g for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:40 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIVJ-0000iv-QJ for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:39 -0400 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-472326ca506so17548f8f.2 for ; Tue, 04 Aug 2026 10:00:37 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862836; x=1786467636; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=H4+sCTEFlcCDuaP0RZoeIZ2GMEdf/AjPR6j+vRrnqO625ZdOvgL2Ao446w82ivGYpV psoZWotoVF/gAAg0BeZ55S1BhFqRtjTsafUxl/UGBT3FSnGP/Rip5RUCYRZgd0109vDY CH+0E11uleK5eig7kY3RQf5UOnNZlECvuF+5fgGKR3jzmCMmiDpej1O4cMOLCJFy67b0 1akWZCSmRVZQf5251iVqnqGtWQh/qRmBc39yO4+tL69GMHt/KfT+dCjITLqLj1Nz2sK2 LN9gFzTajb5dGFczoJxPq01PO/7fFCJpBbOINH4yfn0aO5tAoEnQNB+Q7ksfdNZO64eS mhVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862836; x=1786467636; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qVItmy4f/C2z27f9ZFHpOg432dejiRYIjmnW1fhYMUs=; b=QwJinRE6zDgeaYipXrChyNut/q43ML8a/B5rRaiXAUE/40E7FCTywjdyfHCBk8HzAY +N6mSgiaY//XpFYGydWR61n/PW+hIvJt7IoSrZDq/MZlAU4ID3nK4bL9ZFvKizR5BxSV 0kW2CTAOQ4y19vjD5zYxob7nAUe3SpqyhUktSk1x3t0MeE3a7voxs2eC3Gwjv5AUZpre 18shbxLRwPvARespz8YgLcgzEL8k0cemr/PgeYB2aC/dqXgSVHzBFGvOsRJdJB6jXo7s gAuACQhKC3/b8T6t3YtEwpC1NcWC/tvAvwzCkK2fMtTef9PhfFuT33s+s0fn5J3edbIL 8RcQ== X-Gm-Message-State: AOJu0YwPyimRFwN2HuJAP8IG11fkLwALRA/KSH4dGKwooHJZpJI1Sc+k RJ1PmqoxyunQgEZhonEVLaWvJ5idKFhM5+7KN4jCqNDWghMOebTHSG7Ajiz6Ax8XViZXAmY/2OH RJJDl X-Gm-Gg: AR+sD132bZaiwyF1PTAd/Y0+4cx6FhD/McfY03E/ATEU81GdmW48wxJ8PFmk/zz9iXJ x4N5TdTAaS3rVTXKhMTcSxnbQWnmeiWgoAUvt1RacA+j1FhhTCncriKmzm7EAys11YgQcHSO/Wp EpBu7Y3gxgpxdsErAwiyOQRj7mfxsrLEr0egZUH/uYlbC4AMvAJ3xQLIwUb6ArfPG0XxalXDUGz yVIE2Hvz2XeKEVeLU7ykGHkqKj8bU3gLh7yM5tA5Li8phfJOTa7KkcZkfmSqcWNXxJH/aFyNbKX YlrlkAxh2zkuwzPKVIAsKxlOUDBRozCkOzRyUgh0e/5lAkgj1BCZm1wk+WFmxLovO2/JZG5Bm19 mV+2MIlMuNhNMW4TUegCBoMz/e7kRC1qP0LCrFkG1n3iujUEqBr/+e1qhUr/xoa51j04zIxXrCI 4Ou5n74GK0fKz1eSpNfJbpGe5nVPhI2TUfpvtwhk32uJ3bwQ== X-Received: by 2002:a5d:65c7:0:b0:47f:e877:641b with SMTP id ffacd0b85a97d-47fec50e3c7mr1134511f8f.11.1785862836311; Tue, 04 Aug 2026 10:00:36 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 6/7] hw/ide/atapi: read the whole elementary transfer asynchronously Date: Tue, 4 Aug 2026 19:00:13 +0200 Message-ID: <20260804170015.3128363-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::435; envelope-from=den@openvz.org; helo=mail-wr1-x435.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862940384158500 An ATAPI PIO read whose byte-count limit spans more than one CD sector must fetch the later sectors of a DRQ burst from inside the completion of the first, asynchronous read. cd_read_sector_sync() did this with a synchronous blk_pread(), which runs blk_wait_while_drained() before issuing the request. If a drain is in progress when that completion runs -- as happens when a guest reset reaches virtio_blk_stop_ioeventfd() -> bdrv_drain_all_begin() while an ATAPI read is in flight on the same QEMU -- the nested read is queued until the drained section ends while the outer completion still holds blk->in_flight. bdrv_drain_all_begin() then waits forever for that in_flight count to drop: the main loop is wedged in the drain with the BQL held, and every other QMP/monitor operation blocks behind it. Read the whole elementary transfer in a single asynchronous request up front instead, so no read is ever issued in the middle of a burst. cd_read_sector() now reads all the sectors a burst spans (the raw 2352-byte case is unpacked in place on completion) and cd_read_sector_sync() is removed. The DMA path already batched its reads and is unchanged. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- hw/ide/atapi.c | 180 +++++++++++++++++++++++-------------------------- 1 file changed, 84 insertions(+), 96 deletions(-) diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index a42b748521..0ea149ad8c 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -88,46 +88,14 @@ static void cd_data_to_raw(uint8_t *buf, int lba) memset(buf, 0, 288); } =20 -static int -cd_read_sector_sync(IDEState *s) -{ - int ret; - block_acct_start(blk_get_stats(s->blk), &s->acct, - ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); - - trace_cd_read_sector_sync(s->lba); - - switch (s->cd_sector_size) { - case 2048: - ret =3D blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, - ATAPI_SECTOR_SIZE, s->io_buffer, 0); - break; - case 2352: - ret =3D blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, - ATAPI_SECTOR_SIZE, s->io_buffer + 16, 0); - if (ret >=3D 0) { - cd_data_to_raw(s->io_buffer, s->lba); - } - break; - default: - block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); - return -EIO; - } - - if (ret < 0) { - block_acct_failed(blk_get_stats(s->blk), &s->acct); - } else { - block_acct_done(blk_get_stats(s->blk), &s->acct); - s->lba++; - s->io_buffer_index =3D 0; - } - - return ret; -} - static void cd_read_sector_cb(void *opaque, int ret) { IDEState *s =3D opaque; + int et =3D s->elementary_transfer_size; + int skip =3D s->io_buffer_index; + int nsec =3D DIV_ROUND_UP(skip + et, s->cd_sector_size); + uint8_t *buf; + int i; =20 trace_cd_read_sector_cb(s->lba, ret); =20 @@ -140,34 +108,64 @@ static void cd_read_sector_cb(void *opaque, int ret) block_acct_done(blk_get_stats(s->blk), &s->acct); =20 if (s->cd_sector_size =3D=3D 2352) { - cd_data_to_raw(s->io_buffer, s->lba); + /* unpack back-to-front so a sector never clobbers an unmoved one = */ + for (i =3D nsec - 1; i >=3D 0; i--) { + memmove(s->io_buffer + i * 2352 + 16, s->io_buffer + i * 2048, + ATAPI_SECTOR_SIZE); + cd_data_to_raw(s->io_buffer + i * 2352, s->lba + i); + } } =20 - s->lba++; - s->io_buffer_index =3D 0; s->status &=3D ~BUSY_STAT; =20 - ide_atapi_cmd_reply_end(s); + s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; + s->lcyl =3D et & 0xff; + s->hcyl =3D (et >> 8) & 0xff; + ide_bus_set_irq(s->bus); + + /* a boundary sector shared with the next burst is re-read there */ + buf =3D s->io_buffer + skip; + s->packet_transfer_size -=3D et; + s->lba +=3D (skip + et) / s->cd_sector_size; + s->io_buffer_index =3D (skip + et) % s->cd_sector_size; + s->elementary_transfer_size =3D 0; + + if (ide_transfer_start_norecurse(s, buf, et, ide_atapi_cmd_reply_end))= { + ide_atapi_cmd_reply_end(s); + } } =20 +/* + * Read the whole elementary transfer (one DRQ burst) in a single async + * request. No read is issued mid-burst, so unlike the old synchronous + * rebuffer it cannot deadlock against a concurrent drain. + */ static int cd_read_sector(IDEState *s) { - void *buf; + int et =3D s->elementary_transfer_size; + int skip =3D s->io_buffer_index; + int nsec =3D DIV_ROUND_UP(skip + et, s->cd_sector_size); =20 if (s->cd_sector_size !=3D 2048 && s->cd_sector_size !=3D 2352) { block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); return -EINVAL; } =20 - buf =3D (s->cd_sector_size =3D=3D 2352) ? s->io_buffer + 16 : s->io_bu= ffer; - qemu_iovec_init_buf(&s->qiov, buf, ATAPI_SECTOR_SIZE); + /* a burst is bounded by the byte count limit, so it fits io_buffer */ + assert(nsec * s->cd_sector_size <=3D s->io_buffer_total_len); + + /* + * Read the payload packed at the front of io_buffer; the 2352 raw cas= e is + * unpacked into place on completion. + */ + qemu_iovec_init_buf(&s->qiov, s->io_buffer, nsec * ATAPI_SECTOR_SIZE); =20 trace_cd_read_sector(s->lba); =20 block_acct_start(blk_get_stats(s->blk), &s->acct, - ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); + nsec * ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); =20 - ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, 4, + ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, nsec * 4, cd_read_sector_cb, s); =20 s->status |=3D BUSY_STAT; @@ -222,59 +220,49 @@ static uint16_t atapi_byte_count_limit(IDEState *s) void ide_atapi_cmd_reply_end(IDEState *s) { int byte_count_limit, size, ret; - while (s->packet_transfer_size > 0) { - trace_ide_atapi_cmd_reply_end(s, s->packet_transfer_size, - s->elementary_transfer_size, - s->io_buffer_index); - - /* see if a new sector must be read */ - if (s->lba !=3D -1 && s->io_buffer_index >=3D s->cd_sector_size) { - if (!s->elementary_transfer_size) { - ret =3D cd_read_sector(s); - if (ret < 0) { - ide_atapi_io_error(s, ret); - } - return; - } else { - /* rebuffering within an elementary transfer is - * only possible with a sync request because we - * end up with a race condition otherwise */ - ret =3D cd_read_sector_sync(s); - if (ret < 0) { - ide_atapi_io_error(s, ret); - return; - } + + trace_ide_atapi_cmd_reply_end(s, s->packet_transfer_size, + s->elementary_transfer_size, + s->io_buffer_index); + + if (s->lba !=3D -1 && s->packet_transfer_size > 0) { + byte_count_limit =3D atapi_byte_count_limit(s); + trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); + size =3D s->packet_transfer_size; + if (size > byte_count_limit) { + /* byte count limit must be even if this case */ + if (byte_count_limit & 1) { + byte_count_limit--; } + size =3D byte_count_limit; } - if (s->elementary_transfer_size > 0) { - /* there are some data left to transmit in this elementary - transfer */ - size =3D s->cd_sector_size - s->io_buffer_index; - if (size > s->elementary_transfer_size) - size =3D s->elementary_transfer_size; - } else { - /* a new transfer is needed */ - s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; - ide_bus_set_irq(s->bus); - byte_count_limit =3D atapi_byte_count_limit(s); - trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); - size =3D s->packet_transfer_size; - if (size > byte_count_limit) { - /* byte count limit must be even if this case */ - if (byte_count_limit & 1) - byte_count_limit--; - size =3D byte_count_limit; - } - s->lcyl =3D size & 0xff; - s->hcyl =3D size >> 8; - s->elementary_transfer_size =3D size; - /* we cannot transmit more than one sector at a time */ - if (s->lba !=3D -1) { - if (size > (s->cd_sector_size - s->io_buffer_index)) - size =3D (s->cd_sector_size - s->io_buffer_index); + s->elementary_transfer_size =3D size; + ret =3D cd_read_sector(s); + if (ret < 0) { + ide_atapi_io_error(s, ret); + } + return; + } + + while (s->packet_transfer_size > 0) { + /* a new transfer is needed */ + s->nsector =3D (s->nsector & ~7) | ATAPI_INT_REASON_IO; + ide_bus_set_irq(s->bus); + byte_count_limit =3D atapi_byte_count_limit(s); + trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit); + size =3D s->packet_transfer_size; + if (size > byte_count_limit) { + /* byte count limit must be even if this case */ + if (byte_count_limit & 1) { + byte_count_limit--; } - trace_ide_atapi_cmd_reply_end_new(s, s->status); + size =3D byte_count_limit; } + s->lcyl =3D size & 0xff; + s->hcyl =3D size >> 8; + s->elementary_transfer_size =3D size; + trace_ide_atapi_cmd_reply_end_new(s, s->status); + s->packet_transfer_size -=3D size; s->elementary_transfer_size -=3D size; s->io_buffer_index +=3D size; @@ -329,7 +317,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba= , int nb_sectors, s->lba =3D lba; s->packet_transfer_size =3D nb_sectors * sector_size; s->elementary_transfer_size =3D 0; - s->io_buffer_index =3D sector_size; + s->io_buffer_index =3D 0; s->cd_sector_size =3D sector_size; =20 ide_atapi_cmd_reply_end(s); --=20 2.53.0 From nobody Tue Aug 25 13:45:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=openvz.org ARC-Seal: i=1; a=rsa-sha256; t=1785862865; cv=none; d=zohomail.com; s=zohoarc; b=RYFnTjpnbQDCfIeON2B1D5gQbS/0dHD1d9/MM9prZDHhMeUXJ5IEBWepS5ZKOFoL1R76lVVrduQuHGK5VFSNdRxPGhi8sIoieYPFLdPA0hxDa5xvxDQk3lmmx9XBYbruYp/Sq6SGMTB3nfBnteYEjm1cauVuTwvFECj6sAN7JHU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1785862865; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=Q3soLNfSf3f44URZRZ30NwcB0vydor6lgxOD/tRkMPSI6dwXxMG0HtPhfUtID0TndUVWNsX/cUlWGKgBakuQVm5CTJt7blzOrsgtT5K5veCm0KQ7hcO9VZGjJCttlZv0utTwiVAOGWAQj3mXXr7JOffin+tfG8z7q1kqfplbL4E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1785862865832353.35534891557916; Tue, 4 Aug 2026 10:01:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wrIVO-000097-JA; Tue, 04 Aug 2026 13:00:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wrIVM-00008B-Uf for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:40 -0400 Received: from mail-wr1-x432.google.com ([2a00:1450:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wrIVL-0000jO-5w for qemu-devel@nongnu.org; Tue, 04 Aug 2026 13:00:40 -0400 Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-47c6e9a694bso25416f8f.1 for ; Tue, 04 Aug 2026 10:00:38 -0700 (PDT) Received: from athena ([213.133.28.44]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fec23ec3asm1234116f8f.31.2026.08.04.10.00.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Aug 2026 10:00:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1785862838; x=1786467638; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=fIFR4kIifoU2rIk8QgWCK3emgPTEvv6nl4PWWrv3+QcklJPalGObZAcrwv0uPaV400 HwU48RprDZNYDzIQHjeofZYSpn0vxpWd9JxxEUHr/VIkJtJVqUB8tMV9h9MdOgAHeH59 R5RT4oyLvwopFFFbTEa9QuHSXEYSczkKPXxHC5ZOsxxLATEsLn56mkSdqp2gNIR6hlNJ m9gXnpogUL2JHCFDlfvRs/3eLkt14pH1BbUrtF2bxEPG2W550AnLR3+MAYFpJ3i5nPrx PiruEb60JTn42hbGOz2hevsA504BPmbkxf3uEDfIhwp7uwIy3SCFLG6NPV/V4HcaYMuP tUbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785862838; x=1786467638; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=OtCL941QaxVDzOMEP5QDrXt6XcRnskNWRDsBxWp3Og4=; b=sEaCQSjiJLRDd+HCoGlDNYg4l/jGaAeWadHVQz/aICb5m6c9uQuLW/mNdlfq1y9sY7 DlpclYRtuXQHc+JNvaMFYNvsKEf85vqAsE2qCnPa/DjsAHvavrWtyhRvKyuS45eOQB5D S00v/3vrNoZsHEsazU4k78a9sfHkRFArl6ISLeAZ30poIva4e6qWerTMjnqVmvEzd7fN U8/73M1ifh0ymIcQjtUoroIZK2PUhWZpb3TNvrkrqLy7z9nw6+rnBBz8KhrTwW8Zxvm1 cHK5feJ1yvjZqOZZq/0NFLt2lRyzihwgUyIxV5iJA7rhezCLZy+TipiZWxbCBITo9nk1 PQsQ== X-Gm-Message-State: AOJu0YyDv1MvbmKPDQKrUdV1HygQWhC2sLlVvJUPLOMN/8STujyLiSF4 Nj7JTa95X0YXErpbSvmilB2YFbOx1f3n+mqx1F06uVQFc7WzGhuSRN3AIUL3OLE7iDs4scLQ8EA 5D9Jc X-Gm-Gg: AR+sD11vLSMOTX4ZfCSmtcOhly661zrycgvMioF4iBsIteTratbRPOjkNzAhm6yHXcU oon6SH7IOpWSFNflVzVimDbSYQzTf8HPIljoU/IcsYIOcb1DRtu6FIOW7TwBTZewhlQ3ZNSpq8K jE+9tlfdkYY0iCXdYohldvhmF4yt0xMVuV5ptunu+cvS9rZOdHeUynlbGW1ppXZ3tSNrSFC3jLp cNtfYs+QsOADGbS1PHUfuAxCGVshMvgZ3mLUBMGUxcRruDF5TCx/VN6Ji1SwD1xEfuMKlTA7S+2 PKDtpfknUXR0INRZJ8hi2auRvlgWWQq2xtg4hT5hKx0y1Wzm+ao3rD0KLXOX5cRvRSYWKD8qKEU nVi84zPWp2R2rhTA4s3L9ke9kNbPUo9XR1RRGyVoYJM2rq/8PeIxcjvSVW4IzHpM6NrzRnpbBuW 1yPxy3vw9iGLaKgtiKqOas1Z4+vwM0d4hyhinbL5MRzDOUtw== X-Received: by 2002:a05:6000:46d0:b0:47f:83ee:e56f with SMTP id ffacd0b85a97d-47fec634c42mr822651f8f.18.1785862837688; Tue, 04 Aug 2026 10:00:37 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, John Snow , "Denis V. Lunev" , Stefan Hajnoczi , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PULL v2 7/7] tests/qtest/ahci: regression test for ATAPI read vs. drain Date: Tue, 4 Aug 2026 19:00:14 +0200 Message-ID: <20260804170015.3128363-8-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260804170015.3128363-1-den@openvz.org> References: <20260804170015.3128363-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::432; envelope-from=den@openvz.org; helo=mail-wr1-x432.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @openvz.org) X-ZM-MESSAGEID: 1785862867796158500 Add /ahci/cdrom/drain/{pio,dma}: issue a multi-sector ATAPI read whose byte-count limit spans two sectors so the device must rebuffer in the middle of the DRQ burst, hold the backend read in flight with a blkdebug delay, and fire x-blockdev-set-iothread -- which runs bdrv_drain_all_begin() exactly like a guest reset does through virtio_blk_stop_ioeventfd(). On the unfixed PIO path the nested sector fetch is queued behind the drain and the main loop wedges, so the test hangs. The DMA variant never rebuffers and serves as a sanity twin. Signed-off-by: Denis V. Lunev CC: Stefan Hajnoczi CC: Philippe Mathieu-Daud=C3=A9 --- tests/qtest/ahci-test.c | 66 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c index 58bc04b3ef..71d23fe56a 100644 --- a/tests/qtest/ahci-test.c +++ b/tests/qtest/ahci-test.c @@ -1754,6 +1754,70 @@ static void test_atapi_engine_restart_dma(void) test_atapi_engine_restart_in_flight(true); } =20 +/* + * Regression test: a multi-sector ATAPI read fetches its later sectors fr= om + * inside the first read's completion; a concurrent drain (as a guest reset + * triggers via bdrv_drain_all_begin) must not wedge on that nested read. + * blkdebug keeps the read in flight across x-blockdev-set-iothread. + */ +static void test_atapi_drain_in_flight(bool dma) +{ + AHCIQState *ahci; + AHCICommand *cmd; + unsigned char *tx; + char *iso; + int fd; + uint8_t port; + uint64_t buffer; + uint16_t bcl =3D ATAPI_SECTOR_SIZE * 2; + uint64_t iso_size =3D (uint64_t)ATAPI_SECTOR_SIZE * 3; + + fd =3D prepare_iso(iso_size, &tx, &iso); + + /* 1s read delay: a wide margin so the drain starts before it complete= s */ + ahci =3D ahci_boot_and_enable( + "-blockdev driver=3Dfile,node-name=3Dfile0,filename=3D%s,read-only= =3Don " + "-blockdev driver=3Dblkdebug,node-name=3Dcd0,image=3Dfile0,read-on= ly=3Don," + "inject-error.0.event=3Dnone,inject-error.0.iotype=3Dread," + "inject-error.0.errno=3D0,inject-error.0.delay-ns=3D1000000000 " + "-M q35 " + "-device ide-cd,drive=3Dcd0 ", iso); + port =3D ahci_port_select(ahci); + + buffer =3D ahci_alloc(ahci, bcl); + qtest_memset(ahci->parent->qts, buffer, 0x00, bcl); + + cmd =3D ahci_atapi_command_create(CMD_ATAPI_READ_10, bcl, dma); + ahci_command_adjust(cmd, 0, buffer, bcl, 0); + ahci_command_commit(ahci, cmd, port); + ahci_command_issue_async(ahci, cmd); + + /* Drain (all nodes) while the delayed read is still in flight. */ + qtest_qmp_assert_success(ahci->parent->qts, + "{ 'execute': 'x-blockdev-set-iothread'," + " 'arguments': { 'node-name': 'cd0', 'iothread': null," + " 'force': true } }"); + + /* Round-trip through the device to confirm qemu is still alive. */ + ahci_px_rreg(ahci, port, AHCI_PX_TFD); + + ahci_command_free(cmd); + ahci_free(ahci, buffer); + g_free(tx); + ahci_shutdown(ahci); + remove_iso(fd, iso); +} + +static void test_atapi_drain_pio(void) +{ + test_atapi_drain_in_flight(false); +} + +static void test_atapi_drain_dma(void) +{ + test_atapi_drain_in_flight(true); +} + /* Regression test: Test that a READ_CD command with a BCL of 0 but a size= of 0 * completes as a NOP instead of erroring out. */ static void test_atapi_bcl(void) @@ -2177,6 +2241,8 @@ int main(int argc, char **argv) test_atapi_engine_restart_pio); qtest_add_func("/ahci/cdrom/engine_restart/dma", test_atapi_engine_restart_dma); + qtest_add_func("/ahci/cdrom/drain/pio", test_atapi_drain_pio); + qtest_add_func("/ahci/cdrom/drain/dma", test_atapi_drain_dma); =20 ret =3D g_test_run(); =20 --=20 2.53.0