From nobody Tue Aug 25 14:35:30 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=1786648669; cv=none; d=zohomail.com; s=zohoarc; b=G9n5UYptfPmyFClC1srQCypwAh6B3NukdFEcbSRq2+YHd3aSDFl08jV8+ymnDF1B/Gd1Rg3zVV9g6IV+OxsChHmo91gwH/y5KWy1HS85ZgpaSqH6OaDs8bW98vlD1QVImZWmgGv0CNPF/Spoix7r5spsXvL7uGV9GLhD+DQwgwA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648669; h=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=/jTzn0HvG5hjaHr/PvyqXMhrx/ABtZyLjl0bHhnmnoA=; b=If8NObLT4QMjPGfENb1yC9uiA/rvvtFiGaQYp7HoPxT0ddE0gqAkJTrqPbgPtLqvhRd2VqZW6u20VQCMzYwvQvgR5dEQ/KwCUh5QDIEtSD9/ea75GRez0zBt0en5Q1RRDXvz7rCAsk/cmPnLBrrWDwad6X56mmTOnm3wneRKIqI= 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 178664866903082.09816721569428; Thu, 13 Aug 2026 12:17:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuaud-0008Jr-5Y; Thu, 13 Aug 2026 15:16:23 -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 1wuaub-0008Iq-Ix for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:21 -0400 Received: from mail-wr1-x431.google.com ([2a00:1450:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuauZ-0002ul-2K for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:21 -0400 Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-47fd4531020so115360f8f.3 for ; Thu, 13 Aug 2026 12:16:18 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648577; x=1787253377; darn=nongnu.org; h=content-transfer-encoding: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=/jTzn0HvG5hjaHr/PvyqXMhrx/ABtZyLjl0bHhnmnoA=; b=DYj5vMTD8XZH6DfDfpxwT/X2vXQDCxdtSN1Py27HKtmFlUEsv2KiExkI6FGLlmC221 MVYE/HouUHdyfOaDM+/8pr/fyq3gq1W1tAKkB/J6v0rglcRWZBNc9ciXxz0pK0W324Et 1J42LnltTBXQ4eeHFqOBitq1ewANu85tH2QbLQamXgVppSBVvYzgQF2LdVGCI9KH2YhF 0ZUxJjo9u0lrJqnYb1Ur4vWJZJ6oHw+zCAEPPXPJjfszyOXpPjrdHkPqGectKy7/b5ce gSPjcznqZfGM0ebvos+e4WJ/T7vY55ESs+tNCW83u4nMJBhXy323Aymmcqin6j2EvsMd 9TFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648577; x=1787253377; h=content-transfer-encoding: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=/jTzn0HvG5hjaHr/PvyqXMhrx/ABtZyLjl0bHhnmnoA=; b=JDsPC/BXHKlNYYE5lx9YQtV4Ql+isGky39gDdIX9W0RMPlpD4QWOV32TB+V/XM/Vkq u+LZGRaBG3FohQUmkcncP2+EDQLvfbg+vrvGiOn7UsUbhJsBuMwiX3obUZSyVaJ98UoV Cm3+mkFC5Q/Un189nTJ/pt1aHG7+ASB/SvwGcGLE61Mp0K/qt15xbmp8kc4Goqqzq5VR knCqNclxpS2u9B98Zc1IO874hYDcCTa68Mh1Dd//0gUg7OkSvjhfIRuvGh8QvF2Itcj/ /rZYsMaGDxpfF+OgrsxXhavklmOL9X/778UIx2as+bLmaRhFrPOPnz07wTGKUia5kGR8 oyjQ== X-Gm-Message-State: AOJu0YwrZS7mxRavTpmIHL1XKFBpC3ibt/7mn7ELhHH2iiRfsaPCzP+S QgwZap2hqVCSi+rgNoq7wFy2tr0MZ/hlKuhEkc2vsWTtsvnCsGXR+KFtFCdHMvyuJyPxwgVF2Rh EVQEj X-Gm-Gg: AR+sD12lUvG66Kgy4YUAiDhNtpo/EZ6Fz3M8FvKpZPE1Hl713mWMjG6EqXsmT+4ai1+ HA0Q99NEFTYNGQ7PwJE0S8Ic+egDxri/yCdea6Xs4kT7/26+8BIz75hgImtWaoCpAgtPM3luW30 jA42z5XpbRJLXdtlZiXJnw1cw31U7eCBEFbT8gyVCTWlWw6HmyVenCnZX8HU9P707EdBm3fVCzf OO1zLkD4Whll4ybMInk9BNRp49VDs+cpPcKoMZT6PIPhd0QUKkNQ2zE469PgOwKFO/FyO/shyuI Z8Ml/1XoHr1zuzLAkOt9EWjvFEcnrJb82V+WMofi2QYt18VKH7o6RWo8rCzGmyzmQR49g8LRqop 6JkZpFzieNHsl5Z6vMNmpzpBxUVqxY7sqAvKHuysu6AkcxAT3yRRqQc16SLJ0GNGrXOimIjxE6H xZ1JwhguEmg6tJre0MTrOqdA/PxeroggeLdL1JIbuo/AU3kO+S7OU4Z9dQ X-Received: by 2002:adf:e18b:0:b0:481:568e:11b5 with SMTP id ffacd0b85a97d-4816070fc33mr716034f8f.5.1786648577283; Thu, 13 Aug 2026 12:16:17 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 1/7] tests/qtest/ide-test: parametrize the ATAPI CD-ROM read test Date: Thu, 13 Aug 2026 21:16:06 +0200 Message-ID: <20260813191613.2323728-2-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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::431; envelope-from=den@openvz.org; helo=mail-wr1-x431.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: 1786648670558158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648699; cv=none; d=zohomail.com; s=zohoarc; b=duBhO4D9cZ+7Mx6FuWByb5AiUgjXVS1NP+6XgVzOXJg253/JpoNcROW6x/s5YMWnMdpJhlOnKzxmInjbdOTkJbj7CzXhmu53fYHr/l4VO7UycmoqLBCmnx9X5IPz4Vmmxf9Ur8eWbOUO2yqg64RWjusaMPnkqyoQ/5PIYa2Tys0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648699; h=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=mDdh2UI45By9vRJbB1S6W1i0J2Q7pQgOqZLtO2CUFA0=; b=O+6VQ2Vo9tpX3xcuFUPucAsnVj+4mchAb8n1BjYAZa4B/orz7/bwxPs8MPTLkFjHkAgWvZUe2eAj57ZlyEkXBeH5j9DfMLZ8+QVnENlC+RsAsiCy3w44l+BENXRkDNH2NTH40RB9TwblDrImIXHYXaG00Srd2CfNrXwc7/+LfTU= 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 1786648699882884.7848960077783; Thu, 13 Aug 2026 12:18:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauj-0008MJ-0o; Thu, 13 Aug 2026 15:16:29 -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 1wuauc-0008JH-HA for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:22 -0400 Received: from mail-wr1-x436.google.com ([2a00:1450:4864:20::436]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuaua-0002v1-1R for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:22 -0400 Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-47f3b39f2a1so150971f8f.2 for ; Thu, 13 Aug 2026 12:16:19 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648578; x=1787253378; darn=nongnu.org; h=content-transfer-encoding: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=mDdh2UI45By9vRJbB1S6W1i0J2Q7pQgOqZLtO2CUFA0=; b=tTNxWTmkineoSGyG8D54faf55s7U9P/x5Pe+h44R/RepiSWnEhKj1sY2yICfY1RT1/ ocMy/YFMzaZtFVtcYW53cHgxt5r9+CRoFzN9WwvVav6RFPl7RWOpqSAdNd2UG8p0w0jm eeygQn1C29AH1FcafbkjkC6ojdRnQ00eDAHEfnQXJi1lBs0159H2/C9X/0EhKlEHSaNF lwhC3wFjDSuaqNN4CbaYDOcu+gw9UbwKy2FxNCjLJo7tmYXObPpMTLb7rNzBaoGj4AzK 65gxuX/rT1mpav4SUh85poXNqGbO2FWvgaZn7G8l3CSUMlDeaS62qdESx19rUGD2KOL6 pRRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648578; x=1787253378; h=content-transfer-encoding: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=mDdh2UI45By9vRJbB1S6W1i0J2Q7pQgOqZLtO2CUFA0=; b=rVYSmznNK+eVj5jeHjukmdXaUNhjHAbnLptfndjpQKevwRUR7JvLeJ9S5hZfhfAWsQ aE/rTmwEc+b8E6QjuqoJil9j5BMIAoIhes362uQTFRE3Tz0P8p0G83VktlqtNVomFv2N 4x7+41nDNFX7T0tLTVXOBLbE2R2XY/bFrBgo0YUBKkA/rnKzv3TyKCpABbSeGd7jXuMx hnh1TSpj/UAl2L14015IDkzGAktsOjAG/rQYDHpLm0t2eWIEvIu3dK6m0mirS2YbQJEJ rwO0JRerakM/lGGClONv4gV6ATQBYd0K5rybrgLCMmP1iaWcPoP3mRG0X/i0u6d3uK4M pSFA== X-Gm-Message-State: AOJu0YxMkCpcvnfUHiUlknKttpMJ8KKMjsDZm5XP8hafoxqbmNNXGSB2 RGxyEQZKNVm970mP7pQs6FjUa4eenG6cnuC5RUgd+/hAYffqWO/TUKcQSBWC4U5CGAigNPZ1M28 4HM/R X-Gm-Gg: AR+sD10LRlqOMrXuMtWg90Dilt0KHnuR2NBeybjhkYw5pQEn7bPcAXq46vm3ValIFFM UySjQP3Y/Fro0bHI+E1QcxAEap867A9y6yRnAYQqR09OmHPnnW3okAtTbTON/wiyVbRV7uSuGr3 PNw7bidwUfBvLnt8bkwX8SVRp+N0TweQNJyFKYUfCLiE4gu75DsHdG71zwSYcISUpQnYH3o0uFA tA3sOoMdaVmYaBS6r9AgzrcosUUx4szKIY9drcma5IAMvHValK4MKIsaTScRWGAQdDdA81uiYLd vPG7zlSlF/r1EqKQ6KG1foweZ9TO+UKhk5V5xnzwlqepRACK45lB62u+lfUNuAXQLa7F80ItBAF 2c1AR1M4Lwsy1Rpq2r+nAdUt2fs4mZuirQjPiBsp+iG1zUV+38QO/90f4mhEweuH3ieu5x4UmUT ueayZGqHdkK9GE3HYwLtQBqJy1JF6TbbfbyquYqqVlXfQNMGQsfPx+ezTU X-Received: by 2002:a7b:c5ce:0:b0:499:726c:d658 with SMTP id 5b1f17b1804b1-499879bb9e5mr5108275e9.19.1786648578251; Thu, 13 Aug 2026 12:16:18 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 2/7] tests/qtest/ide-test: add a multi-sector ATAPI DMA read test Date: Thu, 13 Aug 2026 21:16:07 +0200 Message-ID: <20260813191613.2323728-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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::436; envelope-from=den@openvz.org; helo=mail-wr1-x436.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: 1786648700710158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648628; cv=none; d=zohomail.com; s=zohoarc; b=mM3eU58GX1d0mcD8n00rv2X6FQP/MgBciNuyhFJ1F0RXfdSJ/bT0ntGHGVp5LeqgskUDERoOl0dmihseV3+LZ/xG4jwMuf/kzUsC8UCW0IUOl9hG4722gdzQzYQdklsiC5FSc3YD26jqJiAXxuRKDR4dmfjzQ17Mdbphyex+PCU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648628; h=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=ZV7lk03ivDAVRjiYPzcPDM1p8aqYpF7wvqB8znajYWk=; b=HKALNxagBOLDaH2JkGa+WEH0QS6j3iOpxjEYDjNLagszj36b0S8LlIaGfkUw9KzWT+gFZG9mhoNH9a1fzBcOfjiptbeWP2wdJSA9jx8JUClzt+MAkndmeYh4WDA18BdHrVIYOm8QwL1zPdkhsAvYN1kMmim5d+GO5cByXrPa0Y0= 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 1786648628328530.318225252525; Thu, 13 Aug 2026 12:17:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauf-0008Kb-3p; Thu, 13 Aug 2026 15:16:25 -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 1wuaud-0008Jf-1i for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:23 -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 1wuaua-0002vN-SB for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:22 -0400 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-47f7854678cso148551f8f.1 for ; Thu, 13 Aug 2026 12:16:20 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648579; x=1787253379; darn=nongnu.org; h=content-transfer-encoding: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=ZV7lk03ivDAVRjiYPzcPDM1p8aqYpF7wvqB8znajYWk=; b=gHM+3uwYxbnLVole7BdnsV5NvB52VPcOzZrp4msHXdNTdq2WxpGc+nYSZ2j+0jnCsE KsY6EpLipXFFmjPDyjmsDEvRK2YJomNtXGv5gH1QgkkuSCeuE0jUMfjuuquLPCP+ZsFX rGz83hwqgbfCENUy3NUImrmNOeJMS9yRR04J7AiRO0o5GX1QcZJRlMbwAv6nTfYU7yPy afdFPML6yjHRBFeTuADil3FQo57G/Fh/wV/t1fVb7KY9fTUmpwp8heoQ19i7FoQ5vLhw jHVzPM5Hg16kINH6iFSuhw71ThqZWv0Tru1BX2ztWFy7H0445rnYAUdRIt/gFJQPY8rK mXFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648579; x=1787253379; h=content-transfer-encoding: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=ZV7lk03ivDAVRjiYPzcPDM1p8aqYpF7wvqB8znajYWk=; b=pEbEd44+BT9zkLyDrnVvkOg1CszTjXh/L+DZuvo8fRdSPSZb46BuJrjK7jV7JgdShV NoukE7X4r0khcnTtMVoABmMcr5An4Ut+EF21wDgWJQAUNPE3aiEKm1zmJ53rBdmNXIlY hO7r0oAbcAO8cmhnNQMXo2zyTDeX0TyA9uJaFMEaN/uTbCLBcbaH5HtJ0jvEVqZGowMY cnBq//Jl5m7k0kEZG78W/3A4TZez6VeAa2YC3j6Gi4p2aZDDFGjRVmnJ9QRsZdgqhSDh 00H0RS8nmTCIPJAkEqT+qRNVvIZZMc874INvtNcHNOLqatQ0Wmy2PaeOdB3L1g423WYF Ywdg== X-Gm-Message-State: AOJu0Yz0sIMIX02NAl8I3GQx1F/58n31FT55ZQOO1qya9RzZ4zZ6WTn6 fn+hxJfK116UeJ2Vlj7YSrD8co1JmlLrPm0igOz1kFuZXJy3OOKMdMVdVkqhFcIMeDJh3Y6Dy/E Vhgws X-Gm-Gg: AR+sD13Qza2x2BNHbfJekeT/Mu8oCP31jkUTcQ2VIR7cbJ4GsRx2OoUEHmfiMPIP8hx ED2EA+D8Otdbd5UjIHrlbhdRUxuitYPZ6Mg09O5QwHuYLROEkHLip+rkfUdwIpX86JmtgrYQDz4 1+zalVKLwQEjcJhETXxa3XTAg1llaxLrCQjrqs+dIea36JHbCyu5cSV+2Rpn5I33m5AtQvxobTh trjAInTOvZSDbAd3cddG2ovofV0MEjDoWxhsG2C2ATUG93zk7b7zpux8mZBaSrXR3RHpAhbokzL Rl1uCCTMi/J3bV4ZBpccEona7q6eK9cUX09P0EEvTx6Xoxf4YYdWDyOMEOE79cC3Tpi2+YwjDZr CoO1a+xLwwodD2jonq1Wa2YO833c0qpQMIWznlPBTTqy1kq92g5QNPp3wtwN+U5dnAEh9nluLVb kFRObAycmLSA/RXW9kBUdG6Ci2aNpQf3YdN1WaqrVZKkKrb53y137N83qa X-Received: by 2002:a05:6000:460b:b0:47f:9176:da23 with SMTP id ffacd0b85a97d-481606a7015mr823589f8f.0.1786648579258; Thu, 13 Aug 2026 12:16:19 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 3/7] tests/qtest/ide-test: cover raw (2352-byte) ATAPI CD reads Date: Thu, 13 Aug 2026 21:16:08 +0200 Message-ID: <20260813191613.2323728-4-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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=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: 1786648630524158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648679; cv=none; d=zohomail.com; s=zohoarc; b=O3XBow9WYOMXDDy1uQPWxXdg/r708fgzAuAjGPSiJzPqEBEjUkscuE8lWGYlVeBHbNqdlc6kjpIlVNp9EbKgfy6aesvsNlJ2DqFjQYfZruJrdEJBBHl9S3ZNFJTdhb+HzkMZvjjti1UqcujlzICS2bofW56z7pTofopWVUsuRow= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648679; h=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=hXoCQSjkb1YT/aVngRd+8tQQ1QHaF51bKobunk1FA7w=; b=DMMeo73AmSjmFQBz6NcEpQMU8Q/li5relpgOfRNtkh7ER5JDNe9zj7mhvqcNF2ZwQsD/gMQD9AEM/qMe1CwLKZ0bk6VQpAnIzdnLTR5l/SSouV8pDoLxXHbQFWIxJ15/cO9KvBS+k/XvmJoL0EllNVWUHNJuhRaV61hw9wUGrzY= 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 1786648679981696.2932599906077; Thu, 13 Aug 2026 12:17:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauj-0008Mk-Fl; Thu, 13 Aug 2026 15:16:29 -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 1wuauf-0008Kd-3J for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:25 -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 1wuauc-0002w1-P4 for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:24 -0400 Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-47f93b2fe4cso113700f8f.0 for ; Thu, 13 Aug 2026 12:16:22 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648581; x=1787253381; darn=nongnu.org; h=content-transfer-encoding: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=hXoCQSjkb1YT/aVngRd+8tQQ1QHaF51bKobunk1FA7w=; b=hWp57WzyDlrnAZmWYYP4u6BLLsQVR+DXbgQu6fTxykaKhtPMhvGg5pvPhQ+Vg6FmVf G2u0Bj2XYjHyx6SAcSrvVyG0XkKrgbIfMR5VZd6kYCxToBIjq5UxJMOxkc3wofPlsFXw RZrLtuYVxygQuYPAs8DN0oReIavbYjExmRKlSBgrXGcpkIWDq6oOTP7CbdvZyhJM/61R FA/IuBPuakGFoWTOKWEorZ+WZaoMcxAg0M+Vf3Ao+hpGb6uvgFa3JRhFqOtT+eYLyCd7 y73WuxntxrcDqNgQkQJziCV6DXMl8DOWrMUGJJaG+yxpIruJlEXBFFIdXtV+ePcEu1ZT fpzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648581; x=1787253381; h=content-transfer-encoding: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=hXoCQSjkb1YT/aVngRd+8tQQ1QHaF51bKobunk1FA7w=; b=N6EveqdSb0LFVHgw8huD9SWKbe8aYcw53LcTBvvCIl3zuV3R9VEPmf40XcnsRB5HJr zdcVgx5NIN7ZmR+jO1P5ccdXtK6Lgnzi6yKYZdJhRqPHd9LkgYh7spe/MTNDuu5Pxm4Y HM1dPrMPnhmPnCRuNd1WR4KflhKTS/x/BC3UTcAcU3gMQ8W/ytR9FFp8+KKl0CH31u46 8THT6fGifcEp/tH0YJeXohXGByUC6Cqja3Fgw2gQcYqOkh+Vn7AfVzROi3GZgYO143lv CXiv5qZ+68ckGFZPzrEu6MqaHhxk3wTezRckO97d7FPO78MG1nGuC9rI7QEWOU9ZXALX ogew== X-Gm-Message-State: AOJu0YzcpCh9lkwiYwBVLw1ExmGY0+aMlQxCcl+QA7M5lxn+VJ2hFMHv XSwYEmE5b47vrtWxFQk+Q+ns0e5Bn0IjQuhrjd1gyQLsabT79ZczYUCzXkHa5EpWyhCMlJT/FlP +APuY X-Gm-Gg: AR+sD13pwpJVkrflCUdnyaRr526I8UhpeIQkp/cuQM15JC6mSjUUhyOl0+2uQ028k+2 OxSVVivbnQwA2/2ffKLY9Q+R+84wozpAu9OJjCOl4MRufUGTtIjBgUUjqjyPVNv0tuWRZdXVrZY zRrq6JicDuSd28bK2cGDhSvQTyRe+zem4J4NDYI3VyUjTPNT3XRq+Sk+XgRBTCNO3tc8GuON1dM N8Pu7lkoWfhPV99fhTksFmuHuEfR0uQ4ZkIBfU/DXVoQ7MQJuUdHiKUWb+Hd9wu9nJC0mBP3MsU Wb9x5lyF+ExW8PXd3eKDTxgSLha2IINiJlkAAcXUt+WTK4Vq3cJg2vvAuubVTB4G6po71HsdOJy XFThf7y3Zfi/DqEfa1h8yR6zjtNKut/C3yI1qSApgrWBIugAtFlQNDJee5J0WdgV0HoYoC1ffCk d8v7dlsBFXug2uSeYkuDLuaGXt018602KsPXiynQ939NebFgPvyWLnB1lXvHL69kCXMojS X-Received: by 2002:a05:6000:40de:b0:47f:83ee:e56f with SMTP id ffacd0b85a97d-48160748fb9mr609925f8f.18.1786648580954; Thu, 13 Aug 2026 12:16:20 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 4/7] tests/qtest/libqos/ahci: support raw (2352-byte) READ CD Date: Thu, 13 Aug 2026 21:16:09 +0200 Message-ID: <20260813191613.2323728-5-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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: 1786648682611158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648617; cv=none; d=zohomail.com; s=zohoarc; b=fsUSXblBr2Xxw1rqWIh8l8PmvQpHUCwkHUlbZ8VHuafAS6uWezGgtUnTu9jEyCjigLFdCCWwk0lyJkTsJsWDGpJKJtzX9DakPJcAkSCAhakA/putq8y85KJ3prJncxlqMPUR3/U1oIAbdv3teasvmFFaVyuFojfeom+uS85qPtM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648617; h=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=O7T4Trc836AVrEIefselYZIhl3b4OWCl4A790SBnZvs=; b=D9lAns+mqKVvSqPQ4bsKXdWxCneqM7TeJ1GFOeiIXweCpzucBPSBSBtkCaCUjP5j2A3KEHiuonp+jSKOLgyK/E6fDQPBJ+tBq7ZcDfTUB95eKXvBSqOAnvjQSC2JAPYS8U5It2yQmBz9fFOzhlYNuUDQZm16xivqWyGKKYm8sHY= 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 1786648617549318.821249696666; Thu, 13 Aug 2026 12:16:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauk-0008No-Bg; Thu, 13 Aug 2026 15:16:30 -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 1wuaui-0008Lr-BC for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:28 -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 1wuaue-0002wO-R3 for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:28 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-472326ca506so129569f8f.2 for ; Thu, 13 Aug 2026 12:16:23 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648582; x=1787253382; darn=nongnu.org; h=content-transfer-encoding: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=O7T4Trc836AVrEIefselYZIhl3b4OWCl4A790SBnZvs=; b=my9QsuVpJP94eUl8ZyDcn9ykq26oFJpQ0lNwV+bmjuaeH4s9tP7WTpbJny2yGejnLo H2W3VnqOFYE1vyyZWeQZugTQkFzG3kYPJhiLXlO0canDHdRFo2Ok+WV/1gUZCbU87XT2 NPdAELjMOUiVu0RlJH/SFtbNF6S6WgnzzUfc38nKzJm/MI0ynhkHWjk//KjRL3wrdSq4 qCKrGk3Lif3ai1fdivG+KCDnMZHS4pcea69VgqTpYsf/GE+TOwJQZkHco1AyDQeBKqjF NIELh441pvUn6bXMkvVaF+Pa+wLSMW44dcl+FwrO7oGEE6Zjy8ivvTF/QXVVO7hqJx8i g2DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648582; x=1787253382; h=content-transfer-encoding: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=O7T4Trc836AVrEIefselYZIhl3b4OWCl4A790SBnZvs=; b=Iy+JQ3B4Xsuz405WhCWfoC7fp+yuD5A5ZRgjdMqSr583AxmQ3HK76DQeU1t01l+dWl I7ZMETrp/c2KaO+RnByav+HI/S+SAsJVi3EqBkhqHuctfcp+BkpRiMoF0XM4JuXL6rEN IbEBEobhzjeyYR9vVajn9fXmM4xtiaiibunQ62wLXAJ/rTpOg0ZXsxY7trS+FVP0adAp Pj7/zBjLPQQCqP2Id320+90AesgicLYLx5Z+DkLI+kQ/GmfVyfQrDqVR8zTx0CJAZUNk rdrO+Yq488Cre5oGKZRHwRCHnHkTs2ZknXHHRiD6ryN9nSeuirl587B+zgB4Mf0ALfRk 3cmw== X-Gm-Message-State: AOJu0Yx+ZjfBJHvYDWj7qD9tMwvQU4WboLBBZKpOofaFA6bt2CyM9k8k do7kNP1s4SoQXWlgrSi7BFpvSzASx/8MEf+cNa7v4UO9dMHqHWMpKfK3DcIPtQuepFenIdQGCns jnPov X-Gm-Gg: AR+sD115n6xmoXpQfHYFY482qK29aBb6dpK8nNkCid5shVif7ixO99PDJNXuFgpl9vs xFjyiX+f1Qf2D+ytSEFF3wYC2pM9sRkj62wCSwm6U2Do3qKrN+2Pv6EZ9Gf2t3HAis0ww5+JT+G FyUAarfFo3E6LbNygQSXrWaSXqAOwO7L51a4X4/CVrX+idQV7VMbfvVVAInUWhP0g2zE168pAD+ 3zrHycNTM6vHTbceExWflB9bJuGDIDdpxkX/av6kz29mNEpE8TLQ7XIxPmE99SBYbk/byW7dN7V 6+G8mkfqtv+T2MDMpb5eXd3gf8Z/SmdvZyLvEfozdVrtWO0FS2alkpb+bzb9ATZbYxNSroXFEwo 1+nbKnXXuHq1c/1M6mLBWPjYqGyp9fQpxX9QpoxQ4Nzx47ktQM9MIHv/SWTlmasLaaZcLUezSDj wxNOIia+of3Iq8IgJN2L99Ak/VUaR4k3NUbcR271A1/KamKbGbkhIgDGoe X-Received: by 2002:adf:f252:0:b0:477:47c6:36e5 with SMTP id ffacd0b85a97d-48160788330mr514448f8f.25.1786648581932; Thu, 13 Aug 2026 12:16:21 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 5/7] tests/qtest/ahci: cover raw (2352-byte) ATAPI CD reads Date: Thu, 13 Aug 2026 21:16:10 +0200 Message-ID: <20260813191613.2323728-6-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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=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: 1786648620223158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648685; cv=none; d=zohomail.com; s=zohoarc; b=LSNdnadVa444ZzON32rW4Idx/lx2mw3u0LaHuLGNifC2KVBEcnkrYgDOAOA2MuZjQMJHGkdGD8CqLhMvcqWodlksx52VWSeYDAHoySN+ge323XVIJI7Lhp91Fc9UinHX4vttDaJVd1BRfYh3jwFovLUaudWn4u1DyRP8XDvLTcw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648685; h=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=iHABCY2WRGHEqCmZ//QpBhKBeLGz8HBNkdXy9XOa0vU=; b=bIT+22Nc9CqJ9w5I95WQqyuH4+G1Tx9XgUdw6n8ldII64DgZ5A6x+1ofmtPW+nU5VFHztq1bNJ7DroZ5nGHqYbXKpu0BV7y7bWo1AvMjE/LdddIvXg0k6QvmjqzvN2muXWFEonk/YdO2FFv33dv3EApdURnFyIm6SwipDPRHK9c= 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 1786648685597669.5758870156745; Thu, 13 Aug 2026 12:18:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauk-0008OU-PL; Thu, 13 Aug 2026 15:16:30 -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 1wuaui-0008M2-QZ for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:28 -0400 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuaue-0002wk-RQ for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:28 -0400 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-47f92e3c14bso161039f8f.0 for ; Thu, 13 Aug 2026 12:16:24 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648583; x=1787253383; darn=nongnu.org; h=content-transfer-encoding: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=iHABCY2WRGHEqCmZ//QpBhKBeLGz8HBNkdXy9XOa0vU=; b=eTlAPaaIXzHZrucIa7X46FkrXWRtD4nhQcHBL6oTcuE/LQsB13MCg7fXsqHcRUJ3gF tKkZ+KNqO+GdLclnRvZikiIOAB6aQI7jSBdQN+c6j1ALbWQrewEe9UFZHUle7AvWKWux dWlmq7CQ5FvQjjuOVhhAjMZTFH2kkaSrWoZ6xrUVKADzBZXQNAFtZXGNIcj/3dttL4hA 3+YpyEsmcwcgb9uTHb40FCbSJrK9rjhHNabrKcwZE4IhPVYuqCW0RZqedqVtD2HrLbz0 q/ipISnFYkoG2vyTMtGG0eQBei9ks85BM+5Yf+W7295JR2o1ls0k/y63RaOf45sDAIDk MWXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648583; x=1787253383; h=content-transfer-encoding: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=iHABCY2WRGHEqCmZ//QpBhKBeLGz8HBNkdXy9XOa0vU=; b=mWSWOFftch0BUz5kSEv2rFm8SmihmJ/ex2vaLRJetkjYsVmf8psd2LF19wAQvwvE46 yEac0jZUUjISrzIgljN2Ul24d7I4TBOEB8ZmleccO6vMvQhYa2mkzRRtVngEin3BQOjv Zsq5apepkK57wT4X12r9qCSffz23P77Jh9ZfIKucamrMDtFLn9M4CAmRcdbj+gt2BXMu 5LT5D7j8r3UY8x25LyMzyoNCh1sOvEDeNE4dWBj11qo/WR7TZJ19zJocQOwYiNxcghhe STinBxYrmWU8ejJ48vKp4WcuEOnYmGJM2cWKlzjz94VzTAH8urxTiSO448dvtOMQt61J lXyg== X-Gm-Message-State: AOJu0YxwqAJS1FKVD4DVFdnWqUI3XYTa2cWq6ryGCqua8PvVa2BOA+7H abnzPxmoh84KRWwh+DkPPkUe6dTXMO1BYr589dfTlL342OxHvhy+mdo0NeCNoq+zW4G7hH0nohX LM2/G X-Gm-Gg: AR+sD11yNVL3dmy7K0iny9SxhJ/gis9InVQxbud+MTBgdDMIZtKyUxNCppLMuvGdXHt pYnJLo6CZell9AISC5nPH66YgcFilhN8mKevqx4CSLEkrS5Kbb6GQO8uBckE7i9rosdcB09oXXP ZwpS5RPuVurK03GSZddNVn/I1MCJDSQCr/ZJF2u9YC2/wSxycROzckH3V3be0j/OLLiVH5f/qS3 aD+80UZ5I1TeNQeBrztckOrqniwsbiYNcBBl3rd5TvnZVnBNByuNEs7OC0ZaHPvqCustehPkC9E Z95JyTf1rRVCoOUBTyY0wH6IBA3aphk1KqDrWX+IZf+j129B3BHafGod0KOg7xcA1JQGzo0lx/N 9cm3z/xP4Nb1tiSiC8AslXjvHkuHvmHeU2JMmu6skB78C6uMK3mjpXjfEQ8iWeGxiAzkJaxwTu5 hk8V/QYhtaD1Oe5BOVIqFbfov0XFff9porNi41taXOgEIZlYkEN96Z3k9vndbLBA== X-Received: by 2002:a05:6000:2612:b0:47f:c648:e265 with SMTP id ffacd0b85a97d-48160758afcmr597476f8f.17.1786648583014; Thu, 13 Aug 2026 12:16:23 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 6/7] hw/ide/atapi: read the whole elementary transfer asynchronously Date: Thu, 13 Aug 2026 21:16:11 +0200 Message-ID: <20260813191613.2323728-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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::42d; envelope-from=den@openvz.org; helo=mail-wr1-x42d.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: 1786648686684158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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 14:35:30 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=1786648679; cv=none; d=zohomail.com; s=zohoarc; b=jy73gyfY4CVTwRP/S6X/3FL9NV6pULQ32gFK8oKDY9ebrAAt/cGItznoII2o5R+gXZoc7aEN4UmLE9tbnzEhd9VhTDMfW55m+ma1sz3eVzovcKxAXq/2KOqaCjgkiaN2JdDHW5eJdm2WGbwbmSExWq/59yNew8a4NY1MkgJIwYI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786648679; h=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=HHNGOJ4JW6/xM+akzv3IjGDFyOH8vS5GN6tAHz20i80=; b=NXwD+0DJMM/nTD19llKSfOt/cSpcTe53sa7vPs2sLHmpb++45uwXK98UgExwHrOcvKQxh7lpLB/R2iAO+4Bsi2wGRruMG5iDV7qiJGTW24fGqJ2NVGYU4JQBl1jOUYbNX9slGJ83zJYnL5VoESfANtT6Xkjq3PxlmW2w0LEbqkU= 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 1786648679272792.2835202719624; Thu, 13 Aug 2026 12:17:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wuauk-0008OS-P0; Thu, 13 Aug 2026 15:16:30 -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 1wuauj-0008N7-Qw for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:29 -0400 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wuaug-0002wu-PW for qemu-devel@nongnu.org; Thu, 13 Aug 2026 15:16:29 -0400 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-495590dde14so3811055e9.0 for ; Thu, 13 Aug 2026 12:16:25 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:859:6d78:3324:fe2c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4815f2b1f90sm1312493f8f.18.2026.08.13.12.16.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 12:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1786648584; x=1787253384; darn=nongnu.org; h=content-transfer-encoding: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=HHNGOJ4JW6/xM+akzv3IjGDFyOH8vS5GN6tAHz20i80=; b=K1kDNMtiWmV3TrXUWyGJpAkXrF9cm2D8wroERF3Ou4m5xolluLpRnB5cCnRWw7Pj2S 7woo+Hf/vpwB33POfWZG3MXoV28ltJz99s8PM9fFjb1dWbobjwvSdC0v7xXf/Xy3QcSd CCTFMZN7WQpkMxQjrwLQqDVxYpd7eBy9kAQXU/eAp7PYSnVwPlQQxtCcVw/caUoaMXt3 xFonIcYu403Dfs+4f7m1ZsNYAXl8NXRK6wHF4MR6NLxG4tmC4i493C7i9LNSmoBR0Aet htyOcZJ9JTEsg92PBB16udH1c5rD0RP3lh18ms/Nh+B+wD+PU/ZLtBfcEbJzqFKxWUzi 6JyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786648584; x=1787253384; h=content-transfer-encoding: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=HHNGOJ4JW6/xM+akzv3IjGDFyOH8vS5GN6tAHz20i80=; b=W8TsMjzYuHBwWoZ4/BSnnaMhinmyKro3dMQ3uOURn+TzNdCqT/SI5Jod+8SxUH79WX 86FAlAwwJV/P9TtsScZ2ia5HmPVhmVspht3jdvTd/EfCwj+PvvZY2LqvcVPRkOpofMjt 21EyHULymqD+fyEa4gQwQq5xYc6NRgt7KDLKH083WtoFPv9E02KHnUMRzwxLUOR+3VC4 aPILDdcH8nivRvC4cPGx8N4rc9DBdLl1fGHPOqIM0V62TonPUlIRJMjGKRuXOcJk042s xZfOqU6YUlW/pCGFthPYZjaabUqdAlbThq/jXaFkZ8Lw0ng2t9CLXvpkJzCnW2az/lGd XYnA== X-Gm-Message-State: AOJu0Yzv+3v1xKbJAgiSNnmuoy344fvRRLk4iG+legr9PZCir76xRU7F UdTmwENVhp+quLy90IJGZdSCMyf/pTbxCFpM6eBY62c9kUOCLbvdTPavYh2htia9w02XoUYl9k8 iD1g0 X-Gm-Gg: AR+sD11SwIjMeJ+RWo7PbxMELUH5AcJEPcmAQxFlwmnJOwqs5LEo6UQR0moXAGY76rd AF1L5shQrhQVI1UROPaYKfI5qRWvnxo7+g4DsgH/tCWLSx3ACkPc23qB+b0DUMIfhYXZkktXao+ /aNAPyqVGwqMoSW1eE641Yq+BsWv8KVexR2gWWseg7YZphL592shdxscb8xfyDziynuJW/jb3Te bfwEYOgefzmz1Y77dP+yYWQ+6FSxnbDJ40FoB4f9CKdczjNbkyTKScw4u7xnO6SW9aNcFSunguX vApNXdsJYjW73GgcxGejX5nfSeFWXKpbtKc33x+fuPcyrU0KKN7VvXJvJrFQhegCzUb0tbn1f70 I25AxZ4khP3rs9a2h8hf2WZT3i2E742g4dUOV3S84Tv5tomDU/mfc5DoX0N75XXLgJqlESUo45r MODSpeRfRFP/2WAIXtlIdbKVbfiAlZbql2I6zyrSPCwPvPx6jHtm/fwh2V X-Received: by 2002:a05:600c:8714:b0:495:4d00:2fda with SMTP id 5b1f17b1804b1-49987935852mr10229455e9.2.1786648584068; Thu, 13 Aug 2026 12:16:24 -0700 (PDT) From: "Denis V. Lunev" To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Richard Henderson , Stefan Hajnoczi , John Snow , philmd@oss.qualcomm.com, den@openvz.org Subject: [PULL v3 7/7] tests/qtest/ahci: regression test for ATAPI read vs. drain Date: Thu, 13 Aug 2026 21:16:12 +0200 Message-ID: <20260813191613.2323728-8-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260813191613.2323728-1-den@openvz.org> References: <20260813191613.2323728-1-den@openvz.org> MIME-Version: 1.0 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::32f; envelope-from=den@openvz.org; helo=mail-wm1-x32f.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: 1786648680560158500 Content-Type: text/plain; charset="utf-8" From: Denis V. Lunev 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 --- 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