git: 60381fd1ee86 - main - memdesc: Retire MEMDESC_CCB.

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 14 Jul 2023 18:41:03 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=60381fd1ee8668ea1e4676a6128883d987cab858

commit 60381fd1ee8668ea1e4676a6128883d987cab858
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2023-07-14 18:30:31 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2023-07-14 18:32:16 +0000

    memdesc: Retire MEMDESC_CCB.
    
    Instead, change memdesc_ccb to examine the CCB and return a memdesc of
    a more generic type describing the data buffer.
    
    Reviewed by:    imp, markj
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D40880
---
 sys/cam/cam.c           |  72 +++++++++++++++++++++++++++
 sys/kern/subr_bus_dma.c | 129 ++----------------------------------------------
 sys/kern/subr_msan.c    |  78 -----------------------------
 sys/sys/memdesc.h       |  12 +----
 4 files changed, 76 insertions(+), 215 deletions(-)

diff --git a/sys/cam/cam.c b/sys/cam/cam.c
index ae1286c8bc6a..ce7dc81b3495 100644
--- a/sys/cam/cam.c
+++ b/sys/cam/cam.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
 #ifdef _KERNEL
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/memdesc.h>
 #include <sys/sysctl.h>
 #else /* _KERNEL */
 #include <stdlib.h>
@@ -571,3 +572,74 @@ cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended)
 	ccg->cylinders = ccg->volume_size / secs_per_cylinder;
 	ccg->ccb_h.status = CAM_REQ_CMP;
 }
+
+#ifdef _KERNEL
+struct memdesc
+memdesc_ccb(union ccb *ccb)
+{
+	struct ccb_hdr *ccb_h;
+	void *data_ptr;
+	uint32_t dxfer_len;
+	uint16_t sglist_cnt;
+
+	ccb_h = &ccb->ccb_h;
+	switch (ccb_h->func_code) {
+	case XPT_SCSI_IO: {
+		struct ccb_scsiio *csio;
+
+		csio = &ccb->csio;
+		data_ptr = csio->data_ptr;
+		dxfer_len = csio->dxfer_len;
+		sglist_cnt = csio->sglist_cnt;
+		break;
+	}
+	case XPT_CONT_TARGET_IO: {
+		struct ccb_scsiio *ctio;
+
+		ctio = &ccb->ctio;
+		data_ptr = ctio->data_ptr;
+		dxfer_len = ctio->dxfer_len;
+		sglist_cnt = ctio->sglist_cnt;
+		break;
+	}
+	case XPT_ATA_IO: {
+		struct ccb_ataio *ataio;
+
+		ataio = &ccb->ataio;
+		data_ptr = ataio->data_ptr;
+		dxfer_len = ataio->dxfer_len;
+		sglist_cnt = 0;
+		break;
+	}
+	case XPT_NVME_IO:
+	case XPT_NVME_ADMIN: {
+		struct ccb_nvmeio *nvmeio;
+
+		nvmeio = &ccb->nvmeio;
+		data_ptr = nvmeio->data_ptr;
+		dxfer_len = nvmeio->dxfer_len;
+		sglist_cnt = nvmeio->sglist_cnt;
+		break;
+	}
+	default:
+		panic("%s: Unsupported func code %d", __func__,
+		    ccb_h->func_code);
+	}
+
+	switch ((ccb_h->flags & CAM_DATA_MASK)) {
+	case CAM_DATA_VADDR:
+		return (memdesc_vaddr(data_ptr, dxfer_len));
+	case CAM_DATA_PADDR:
+		return (memdesc_paddr((vm_paddr_t)(uintptr_t)data_ptr,
+		    dxfer_len));
+	case CAM_DATA_SG:
+		return (memdesc_vlist(data_ptr, sglist_cnt));
+	case CAM_DATA_SG_PADDR:
+		return (memdesc_plist(data_ptr, sglist_cnt));
+	case CAM_DATA_BIO:
+		return (memdesc_bio(data_ptr));
+	default:
+		panic("%s: flags 0x%X unimplemented", __func__, ccb_h->flags);
+	}
+}
+#endif
diff --git a/sys/kern/subr_bus_dma.c b/sys/kern/subr_bus_dma.c
index 65a08aeba17c..bfaad30b37d3 100644
--- a/sys/kern/subr_bus_dma.c
+++ b/sys/kern/subr_bus_dma.c
@@ -304,94 +304,6 @@ bus_dmamap_load_ma_triv(bus_dma_tag_t dmat, bus_dmamap_t map,
 	return (error);
 }
 
-/*
- * Load a cam control block.
- */
-static int
-_bus_dmamap_load_ccb(bus_dma_tag_t dmat, bus_dmamap_t map, union ccb *ccb,
-		    int *nsegs, int flags)
-{
-	struct ccb_hdr *ccb_h;
-	void *data_ptr;
-	int error;
-	uint32_t dxfer_len;
-	uint16_t sglist_cnt;
-
-	error = 0;
-	ccb_h = &ccb->ccb_h;
-	switch (ccb_h->func_code) {
-	case XPT_SCSI_IO: {
-		struct ccb_scsiio *csio;
-
-		csio = &ccb->csio;
-		data_ptr = csio->data_ptr;
-		dxfer_len = csio->dxfer_len;
-		sglist_cnt = csio->sglist_cnt;
-		break;
-	}
-	case XPT_CONT_TARGET_IO: {
-		struct ccb_scsiio *ctio;
-
-		ctio = &ccb->ctio;
-		data_ptr = ctio->data_ptr;
-		dxfer_len = ctio->dxfer_len;
-		sglist_cnt = ctio->sglist_cnt;
-		break;
-	}
-	case XPT_ATA_IO: {
-		struct ccb_ataio *ataio;
-
-		ataio = &ccb->ataio;
-		data_ptr = ataio->data_ptr;
-		dxfer_len = ataio->dxfer_len;
-		sglist_cnt = 0;
-		break;
-	}
-	case XPT_NVME_IO:
-	case XPT_NVME_ADMIN: {
-		struct ccb_nvmeio *nvmeio;
-
-		nvmeio = &ccb->nvmeio;
-		data_ptr = nvmeio->data_ptr;
-		dxfer_len = nvmeio->dxfer_len;
-		sglist_cnt = nvmeio->sglist_cnt;
-		break;
-	}
-	default:
-		panic("_bus_dmamap_load_ccb: Unsupported func code %d",
-		    ccb_h->func_code);
-	}
-
-	switch ((ccb_h->flags & CAM_DATA_MASK)) {
-	case CAM_DATA_VADDR:
-		error = _bus_dmamap_load_buffer(dmat, map, data_ptr, dxfer_len,
-		    kernel_pmap, flags, NULL, nsegs);
-		break;
-	case CAM_DATA_PADDR:
-		error = _bus_dmamap_load_phys(dmat, map,
-		    (vm_paddr_t)(uintptr_t)data_ptr, dxfer_len, flags, NULL,
-		    nsegs);
-		break;
-	case CAM_DATA_SG:
-		error = _bus_dmamap_load_vlist(dmat, map,
-		    (bus_dma_segment_t *)data_ptr, sglist_cnt, kernel_pmap,
-		    nsegs, flags, 0, dxfer_len);
-		break;
-	case CAM_DATA_SG_PADDR:
-		error = _bus_dmamap_load_plist(dmat, map,
-		    (bus_dma_segment_t *)data_ptr, sglist_cnt, nsegs, flags);
-		break;
-	case CAM_DATA_BIO:
-		error = _bus_dmamap_load_bio(dmat, map, (struct bio *)data_ptr,
-		    nsegs, flags);
-		break;
-	default:
-		panic("_bus_dmamap_load_ccb: flags 0x%X unimplemented",
-		    ccb_h->flags);
-	}
-	return (error);
-}
-
 /*
  * Load a uio.
  */
@@ -566,49 +478,18 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat, bus_dmamap_t map, union ccb *ccb,
 		    bus_dmamap_callback_t *callback, void *callback_arg,
 		    int flags)
 {
-	bus_dma_segment_t *segs;
 	struct ccb_hdr *ccb_h;
 	struct memdesc mem;
-	int error;
-	int nsegs;
-
-#ifdef KMSAN
-	mem = memdesc_ccb(ccb);
-	_bus_dmamap_load_kmsan(dmat, map, &mem);
-#endif
 
 	ccb_h = &ccb->ccb_h;
 	if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_NONE) {
 		callback(callback_arg, NULL, 0, 0);
 		return (0);
 	}
-	if ((flags & BUS_DMA_NOWAIT) == 0) {
-		mem = memdesc_ccb(ccb);
-		_bus_dmamap_waitok(dmat, map, &mem, callback, callback_arg);
-	}
-	nsegs = -1;
-	error = _bus_dmamap_load_ccb(dmat, map, ccb, &nsegs, flags);
-	nsegs++;
-
-	CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
-	    __func__, dmat, flags, error, nsegs);
-
-	if (error == EINPROGRESS)
-		return (error);
 
-	segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error);
-	if (error)
-		(*callback)(callback_arg, segs, 0, error);
-	else
-		(*callback)(callback_arg, segs, nsegs, error);
-	/*
-	 * Return ENOMEM to the caller so that it can pass it up the stack.
-	 * This error only happens when NOWAIT is set, so deferral is disabled.
-	 */
-	if (error == ENOMEM)
-		return (error);
-
-	return (0);
+	mem = memdesc_ccb(ccb);
+	return (bus_dmamap_load_mem(dmat, map, &mem, callback, callback_arg,
+	    flags));
 }
 
 int
@@ -702,10 +583,6 @@ bus_dmamap_load_mem(bus_dma_tag_t dmat, bus_dmamap_t map,
 		error = _bus_dmamap_load_mbuf_sg(dmat, map, mem->u.md_mbuf,
 		    NULL, &nsegs, flags);
 		break;
-	case MEMDESC_CCB:
-		error = _bus_dmamap_load_ccb(dmat, map, mem->u.md_ccb, &nsegs,
-		    flags);
-		break;
 	}
 	nsegs++;
 
diff --git a/sys/kern/subr_msan.c b/sys/kern/subr_msan.c
index 236693cfd841..756d1fca4910 100644
--- a/sys/kern/subr_msan.c
+++ b/sys/kern/subr_msan.c
@@ -57,9 +57,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.14 2020/09/09 16:29:59 maxv Exp $");
 #include <sys/sysctl.h>
 #include <sys/uio.h>
 
-#include <cam/cam.h>
-#include <cam/cam_ccb.h>
-
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
@@ -555,42 +552,6 @@ kmsan_mark_bio(const struct bio *bp, uint8_t c)
 	kmsan_mark(bp->bio_data, bp->bio_length, c);
 }
 
-static void
-kmsan_mark_ccb(const union ccb *ccb, uint8_t c)
-{
-	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_IN)
-		return;
-	if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
-		return;
-
-	switch (ccb->ccb_h.func_code) {
-	case XPT_SCSI_IO: {
-		const struct ccb_scsiio *scsiio;
-
-		scsiio = &ccb->ctio;
-		kmsan_mark(scsiio->data_ptr, scsiio->dxfer_len, c);
-		break;
-	}
-	case XPT_ATA_IO: {
-		const struct ccb_ataio *ataio;
-
-		ataio = &ccb->ataio;
-		kmsan_mark(ataio->data_ptr, ataio->dxfer_len, c);
-		break;
-	}
-	case XPT_NVME_IO: {
-		const struct ccb_nvmeio *nvmeio;
-
-		nvmeio = &ccb->nvmeio;
-		kmsan_mark(nvmeio->data_ptr, nvmeio->dxfer_len, c);
-		break;
-	}
-	default:
-		kmsan_panic("%s: unhandled CCB type %d", __func__,
-		    ccb->ccb_h.func_code);
-	}
-}
-
 void
 kmsan_mark_mbuf(const struct mbuf *m, uint8_t c)
 {
@@ -613,39 +574,6 @@ kmsan_check_bio(const struct bio *bp, const char *descr)
 	kmsan_shadow_check((uintptr_t)bp->bio_data, bp->bio_length, descr);
 }
 
-void
-kmsan_check_ccb(const union ccb *ccb, const char *descr)
-{
-	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_OUT)
-		return;
-	switch (ccb->ccb_h.func_code) {
-	case XPT_SCSI_IO: {
-		const struct ccb_scsiio *scsiio;
-
-		scsiio = &ccb->ctio;
-		kmsan_check(scsiio->data_ptr, scsiio->dxfer_len, descr);
-		break;
-	}
-	case XPT_ATA_IO: {
-		const struct ccb_ataio *ataio;
-
-		ataio = &ccb->ataio;
-		kmsan_check(ataio->data_ptr, ataio->dxfer_len, descr);
-		break;
-	}
-	case XPT_NVME_IO: {
-		const struct ccb_nvmeio *nvmeio;
-
-		nvmeio = &ccb->nvmeio;
-		kmsan_check(nvmeio->data_ptr, nvmeio->dxfer_len, descr);
-		break;
-	}
-	default:
-		kmsan_panic("%s: unhandled CCB type %d", __func__,
-		    ccb->ccb_h.func_code);
-	}
-}
-
 void
 kmsan_check_mbuf(const struct mbuf *m, const char *descr)
 {
@@ -1586,9 +1514,6 @@ kmsan_bus_dmamap_sync(struct memdesc *desc, bus_dmasync_op_t op)
 		case MEMDESC_MBUF:
 			kmsan_check_mbuf(desc->u.md_mbuf, "dmasync");
 			break;
-		case MEMDESC_CCB:
-			kmsan_check_ccb(desc->u.md_ccb, "dmasync");
-			break;
 		case 0:
 			break;
 		default:
@@ -1608,9 +1533,6 @@ kmsan_bus_dmamap_sync(struct memdesc *desc, bus_dmasync_op_t op)
 		case MEMDESC_MBUF:
 			kmsan_mark_mbuf(desc->u.md_mbuf, KMSAN_STATE_INITED);
 			break;
-		case MEMDESC_CCB:
-			kmsan_mark_ccb(desc->u.md_ccb, KMSAN_STATE_INITED);
-			break;
 		case 0:
 			break;
 		default:
diff --git a/sys/sys/memdesc.h b/sys/sys/memdesc.h
index 68dc83d03ef0..1c92ae5b1eb5 100644
--- a/sys/sys/memdesc.h
+++ b/sys/sys/memdesc.h
@@ -49,7 +49,6 @@ struct memdesc {
 		struct bio		*md_bio;
 		struct uio		*md_uio;
 		struct mbuf		*md_mbuf;
-		union ccb		*md_ccb;
 	} u;
 	size_t		md_opaque;	/* type specific data. */
 	uint32_t	md_type;	/* Type of memory. */
@@ -62,7 +61,6 @@ struct memdesc {
 #define	MEMDESC_BIO	5	/* Pointer to a bio (block io). */
 #define	MEMDESC_UIO	6	/* Pointer to a uio (any io). */
 #define	MEMDESC_MBUF	7	/* Pointer to a mbuf (network io). */
-#define	MEMDESC_CCB	8	/* Cam control block. (scsi/ata io). */
 
 static inline struct memdesc
 memdesc_vaddr(void *vaddr, size_t len)
@@ -145,14 +143,6 @@ memdesc_mbuf(struct mbuf *mbuf)
 	return (mem);
 }
 
-static inline struct memdesc
-memdesc_ccb(union ccb *ccb)
-{
-	struct memdesc mem;
+struct memdesc	memdesc_ccb(union ccb *ccb);
 
-	mem.u.md_ccb = ccb;
-	mem.md_type = MEMDESC_CCB;
-
-	return (mem);
-}
 #endif /* _SYS_MEMDESC_H_ */