From nobody Fri Jan 24 19:41:51 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Yfp9C5wYnz5lqJ2; Fri, 24 Jan 2025 19:41:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Yfp9C2L15z3SYr; Fri, 24 Jan 2025 19:41:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737747711; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=AT2q6E3xbpDLphuTr3ixbmNVMML6V5hBoadCjvEsyu4=; b=u4Zo+QoQDOFchCzpeuu5NKK8QP94yWqXDaomXkkvnaDJEM1qxFYhI1/cNfqBs4fU3ZrUyu w41Y98F9spZ6/LW4YYEuAKids/0xZ69LrxZBZviDZDAQXkegRpfjuHfhYJdqEYuNZWWxRd W62lpzJbNGZ4Gp/PZ0TheD3Zh4d3VVElYvHQZZxltz/wAzLYQu3MoQIZ8RevyaxbEsm6qd BPOSAcZhVZcUlXCkkzpeYAv9HV0QZnNMWTrvmN8gJWkm5rAfRVw1PHyGq9ir/G4gTlreFr M87PZ0FU3/PmgnCZzggvzceifniZ1t4vwxy2VeNFhnRzpHYb3chs4h3mi/39/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737747711; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=AT2q6E3xbpDLphuTr3ixbmNVMML6V5hBoadCjvEsyu4=; b=fVSFH+X8uYCfBy7FDk4ujb0pbaOhNrda36OhgOP4SCKymsXU2vgFAvlGlGECSmhWDtSHur vWAI6ThBvu1ki7kUlF+KuLlt2hiE2o33p1FNX0c2ixF/6JEPATFHq/lJqqKJYBFXkU8KiA P4tXNiBuqddotgJ7vR9piEpGt6n5Zqxm0KaoOFIdaJARwvPJg3/B4Az3q68nk1kAbEa9zd Au4KHjiq8Srp0kcScKEjQcKKAngq4f4481pYyqJ5F5J5rVp8quwBs1Sq++NSAnUyZjlSlb 7HrAK5y+PfYqCpxksB64QhNCbTFfEdiMjqnVeqc7yTLXMPLdl0K2moO6CzMGUQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737747711; a=rsa-sha256; cv=none; b=LCtrnNCFAKm7R8wlIQ2N1Wp6yCvbAJWkxDE1nzWcjFFltn+whcMEyknXxCui37cB5SzoJV JATaaIVzjLXeA7yQypXbUgfGIDE8QzlvDFdz09iCHz8ZzC6L/Yqvrx4s668w04JZSLzU2+ TAccIuHHN4Adf2s/Zt1I6YjXHQm3Yoc2wdteuWCLkUMNpEnlGYOO/EH+zfEnDDU9Un94/0 WqTR/EBCeGuisNEqmrrOOm41qaiI+xzhcQe4wlwhmT2go1YSPglkcnkTQij6gPkc4ZGOoa pwyh/ornYIpVk5OWQsoJx/kfEdjvIpISuDac4/t+gkBY+PtBPXeS4icER0VTPQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Yfp9C1fxLzgJD; Fri, 24 Jan 2025 19:41:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50OJfpLo083280; Fri, 24 Jan 2025 19:41:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50OJfp9O083277; Fri, 24 Jan 2025 19:41:51 GMT (envelope-from git) Date: Fri, 24 Jan 2025 19:41:51 GMT Message-Id: <202501241941.50OJfp9O083277@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 813f244b27eb - main - ps3disk.c: Rewrite ps3disk_transfer List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 813f244b27eba29aebaad0b725f30c58216bfab9 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=813f244b27eba29aebaad0b725f30c58216bfab9 commit 813f244b27eba29aebaad0b725f30c58216bfab9 Author: Chattrapat Sangmanee AuthorDate: 2024-10-16 14:49:22 +0000 Commit: Warner Losh CommitDate: 2025-01-24 19:40:34 +0000 ps3disk.c: Rewrite ps3disk_transfer This function is bugged since the beginning, but it never hit because its variable doesn't allow. However, since commit a77e1f0f81df5fa3b4a6a38728ebace599cb18a4 it happen now. First, it assume that ds_len will always equal to real user requested size. So it being used for sector count calculation. This is no longer true, and will fail if attempt to read last few sectors. Use bp->bio_length instead. Second, this being a loop is pointless because nsegs will never be > 1 as specified at bus_dma_tag_create() call. And all it doing is to repeat very same command again but with different ds_addr. Since bio_driver2 tag ident pointer are being reused, the result will be discarded at ps3disk_intr(). Signed-off-by: Chattrapat Sangmanee Reviewed by: imp,mav Pull Request: https://github.com/freebsd/freebsd-src/pull/1414 --- sys/powerpc/ps3/ps3disk.c | 96 +++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/sys/powerpc/ps3/ps3disk.c b/sys/powerpc/ps3/ps3disk.c index 0931e6aad58b..4d9976ecccee 100644 --- a/sys/powerpc/ps3/ps3disk.c +++ b/sys/powerpc/ps3/ps3disk.c @@ -588,9 +588,10 @@ ps3disk_transfer(void *arg, bus_dma_segment_t *segs, int nsegs, int error) struct bio *bp = (struct bio *)(arg); struct ps3disk_softc *sc = (struct ps3disk_softc *)bp->bio_disk->d_drv1; struct ps3disk_region *rp = &sc->sc_reg[bp->bio_disk->d_unit]; + bus_dma_segment_t *seg = &segs[0]; uint64_t devid = ps3bus_get_device(sc->sc_dev); - uint64_t block; - int i, err; + uint64_t block, bio_length, sector_op_count; + int err; /* Locks already held by busdma */ PS3DISK_ASSERT_LOCKED(sc); @@ -603,49 +604,62 @@ ps3disk_transfer(void *arg, bus_dma_segment_t *segs, int nsegs, int error) return; } + /* supports only 1 segment */ + + KASSERT(nsegs == 1, + ("nsegs must be 1!, %d", nsegs)); + block = bp->bio_pblkno; - for (i = 0; i < nsegs; i++) { - KASSERT((segs[i].ds_len % sc->sc_blksize) == 0, - ("DMA fragments not blocksize multiples")); - - if (bp->bio_cmd == BIO_READ) { - err = lv1_storage_read(devid, rp->r_id, - block, segs[i].ds_len/sc->sc_blksize, - rp->r_flags, segs[i].ds_addr, - (uint64_t *)&bp->bio_driver2); - } else { - bus_dmamap_sync(sc->sc_dmatag, - (bus_dmamap_t)bp->bio_driver1, - BUS_DMASYNC_PREWRITE); - err = lv1_storage_write(devid, rp->r_id, - block, segs[i].ds_len/sc->sc_blksize, - rp->r_flags, segs[i].ds_addr, - (uint64_t *)&bp->bio_driver2); - } + bio_length = bp->bio_length; - if (err) { - if (err == LV1_BUSY) { - bioq_remove(&sc->sc_bioq, bp); - bioq_insert_tail(&sc->sc_deferredq, bp); - } else { - bus_dmamap_unload(sc->sc_dmatag, (bus_dmamap_t) - bp->bio_driver1); - bus_dmamap_destroy(sc->sc_dmatag, (bus_dmamap_t) - bp->bio_driver1); - device_printf(sc->sc_dev, "Could not read " - "sectors (0x%08x)\n", err); - bp->bio_error = EINVAL; - bp->bio_flags |= BIO_ERROR; - bioq_remove(&sc->sc_bioq, bp); - biodone(bp); - } - - break; - } + /* ds_len always >= bio_length */ + + KASSERT((seg->ds_len % bio_length) == 0, + ("ds_len not bio_length multiples, %lu, %lu", + (uint64_t)seg->ds_len, bio_length)); - DPRINTF(sc, PS3DISK_DEBUG_READ, "%s: tag 0x%016lx\n", - __func__, sc->sc_bounce_tag); + KASSERT((bio_length % sc->sc_blksize) == 0, + ("bio_length not blocksize multiples, %lu, %lu", + bio_length, (uint64_t)sc->sc_blksize)); + + sector_op_count = bio_length / sc->sc_blksize; + + if (bp->bio_cmd == BIO_READ) { + err = lv1_storage_read(devid, rp->r_id, + block, sector_op_count, + rp->r_flags, seg->ds_addr, + (uint64_t *)&bp->bio_driver2); + } else { + bus_dmamap_sync(sc->sc_dmatag, + (bus_dmamap_t)bp->bio_driver1, + BUS_DMASYNC_PREWRITE); + + err = lv1_storage_write(devid, rp->r_id, + block, sector_op_count, + rp->r_flags, seg->ds_addr, + (uint64_t *)&bp->bio_driver2); } + + if (err) { + if (err == LV1_BUSY) { + bioq_remove(&sc->sc_bioq, bp); + bioq_insert_tail(&sc->sc_deferredq, bp); + } else { + bus_dmamap_unload(sc->sc_dmatag, (bus_dmamap_t) + bp->bio_driver1); + bus_dmamap_destroy(sc->sc_dmatag, (bus_dmamap_t) + bp->bio_driver1); + device_printf(sc->sc_dev, "Could not read " + "sectors (0x%08x)\n", err); + bp->bio_error = EINVAL; + bp->bio_flags |= BIO_ERROR; + bioq_remove(&sc->sc_bioq, bp); + biodone(bp); + } + } + + DPRINTF(sc, PS3DISK_DEBUG_READ, "%s: tag 0x%016lx\n", + __func__, sc->sc_bounce_tag); } #ifdef PS3DISK_DEBUG