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
This commit is contained in:
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/memdesc.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#else /* _KERNEL */
|
#else /* _KERNEL */
|
||||||
#include <stdlib.h>
|
#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->cylinders = ccg->volume_size / secs_per_cylinder;
|
||||||
ccg->ccb_h.status = CAM_REQ_CMP;
|
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
|
||||||
|
|||||||
+3
-126
@@ -304,94 +304,6 @@ bus_dmamap_load_ma_triv(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
return (error);
|
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.
|
* 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,
|
bus_dmamap_callback_t *callback, void *callback_arg,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
bus_dma_segment_t *segs;
|
|
||||||
struct ccb_hdr *ccb_h;
|
struct ccb_hdr *ccb_h;
|
||||||
struct memdesc mem;
|
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;
|
ccb_h = &ccb->ccb_h;
|
||||||
if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_NONE) {
|
if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_NONE) {
|
||||||
callback(callback_arg, NULL, 0, 0);
|
callback(callback_arg, NULL, 0, 0);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if ((flags & BUS_DMA_NOWAIT) == 0) {
|
|
||||||
mem = memdesc_ccb(ccb);
|
mem = memdesc_ccb(ccb);
|
||||||
_bus_dmamap_waitok(dmat, map, &mem, callback, callback_arg);
|
return (bus_dmamap_load_mem(dmat, map, &mem, callback, callback_arg,
|
||||||
}
|
flags));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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,
|
error = _bus_dmamap_load_mbuf_sg(dmat, map, mem->u.md_mbuf,
|
||||||
NULL, &nsegs, flags);
|
NULL, &nsegs, flags);
|
||||||
break;
|
break;
|
||||||
case MEMDESC_CCB:
|
|
||||||
error = _bus_dmamap_load_ccb(dmat, map, mem->u.md_ccb, &nsegs,
|
|
||||||
flags);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
nsegs++;
|
nsegs++;
|
||||||
|
|
||||||
|
|||||||
@@ -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/sysctl.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
|
||||||
#include <cam/cam.h>
|
|
||||||
#include <cam/cam_ccb.h>
|
|
||||||
|
|
||||||
#include <vm/vm.h>
|
#include <vm/vm.h>
|
||||||
#include <vm/pmap.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);
|
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
|
void
|
||||||
kmsan_mark_mbuf(const struct mbuf *m, uint8_t c)
|
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);
|
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
|
void
|
||||||
kmsan_check_mbuf(const struct mbuf *m, const char *descr)
|
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:
|
case MEMDESC_MBUF:
|
||||||
kmsan_check_mbuf(desc->u.md_mbuf, "dmasync");
|
kmsan_check_mbuf(desc->u.md_mbuf, "dmasync");
|
||||||
break;
|
break;
|
||||||
case MEMDESC_CCB:
|
|
||||||
kmsan_check_ccb(desc->u.md_ccb, "dmasync");
|
|
||||||
break;
|
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1608,9 +1533,6 @@ kmsan_bus_dmamap_sync(struct memdesc *desc, bus_dmasync_op_t op)
|
|||||||
case MEMDESC_MBUF:
|
case MEMDESC_MBUF:
|
||||||
kmsan_mark_mbuf(desc->u.md_mbuf, KMSAN_STATE_INITED);
|
kmsan_mark_mbuf(desc->u.md_mbuf, KMSAN_STATE_INITED);
|
||||||
break;
|
break;
|
||||||
case MEMDESC_CCB:
|
|
||||||
kmsan_mark_ccb(desc->u.md_ccb, KMSAN_STATE_INITED);
|
|
||||||
break;
|
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
+1
-11
@@ -49,7 +49,6 @@ struct memdesc {
|
|||||||
struct bio *md_bio;
|
struct bio *md_bio;
|
||||||
struct uio *md_uio;
|
struct uio *md_uio;
|
||||||
struct mbuf *md_mbuf;
|
struct mbuf *md_mbuf;
|
||||||
union ccb *md_ccb;
|
|
||||||
} u;
|
} u;
|
||||||
size_t md_opaque; /* type specific data. */
|
size_t md_opaque; /* type specific data. */
|
||||||
uint32_t md_type; /* Type of memory. */
|
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_BIO 5 /* Pointer to a bio (block io). */
|
||||||
#define MEMDESC_UIO 6 /* Pointer to a uio (any io). */
|
#define MEMDESC_UIO 6 /* Pointer to a uio (any io). */
|
||||||
#define MEMDESC_MBUF 7 /* Pointer to a mbuf (network 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
|
static inline struct memdesc
|
||||||
memdesc_vaddr(void *vaddr, size_t len)
|
memdesc_vaddr(void *vaddr, size_t len)
|
||||||
@@ -145,14 +143,6 @@ memdesc_mbuf(struct mbuf *mbuf)
|
|||||||
return (mem);
|
return (mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct memdesc
|
struct memdesc memdesc_ccb(union ccb *ccb);
|
||||||
memdesc_ccb(union ccb *ccb)
|
|
||||||
{
|
|
||||||
struct memdesc mem;
|
|
||||||
|
|
||||||
mem.u.md_ccb = ccb;
|
|
||||||
mem.md_type = MEMDESC_CCB;
|
|
||||||
|
|
||||||
return (mem);
|
|
||||||
}
|
|
||||||
#endif /* _SYS_MEMDESC_H_ */
|
#endif /* _SYS_MEMDESC_H_ */
|
||||||
|
|||||||
Reference in New Issue
Block a user