Philippe Mathieu-Daudé <phi...@redhat.com> 于2020年9月4日周五 下午11:52写道: > > Let devices specify transaction attributes when calling > dma_memory_map(). > > Patch created mechanically using spatch with this script: > > @@ > expression E1, E2, E3, E4; > @@ > - dma_memory_map(E1, E2, E3, E4) > + dma_memory_map(E1, E2, E3, E4, MEMTXATTRS_UNSPECIFIED) > > Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com>
Reviewed-by: Li Qiang <liq...@gmail.com> > --- > include/hw/pci/pci.h | 3 ++- > include/sysemu/dma.h | 5 +++-- > dma-helpers.c | 3 ++- > hw/display/virtio-gpu.c | 8 ++++++-- > hw/hyperv/vmbus.c | 8 +++++--- > hw/ide/ahci.c | 9 ++++++--- > hw/usb/libhw.c | 3 ++- > hw/virtio/virtio.c | 6 ++++-- > 8 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index 0c3217e019c..a221dfb3b08 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -831,7 +831,8 @@ static inline void *pci_dma_map(PCIDevice *dev, > dma_addr_t addr, > { > void *buf; > > - buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir); > + buf = dma_memory_map(pci_get_address_space(dev), addr, plen, dir, > + MEMTXATTRS_UNSPECIFIED); > return buf; > } > > diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h > index b9cb9c8944b..bb8b0a059f5 100644 > --- a/include/sysemu/dma.h > +++ b/include/sysemu/dma.h > @@ -203,16 +203,17 @@ MemTxResult dma_memory_set(AddressSpace *as, dma_addr_t > addr, > * @addr: address within that address space > * @len: pointer to length of buffer; updated on return > * @dir: indicates the transfer direction > + * @attrs: memory attributes > */ > static inline void *dma_memory_map(AddressSpace *as, > dma_addr_t addr, dma_addr_t *len, > - DMADirection dir) > + DMADirection dir, MemTxAttrs attrs) > { > hwaddr xlen = *len; > void *p; > > p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE, > - MEMTXATTRS_UNSPECIFIED); > + attrs); > *len = xlen; > return p; > } > diff --git a/dma-helpers.c b/dma-helpers.c > index 6c3b2200f16..0507a6f95b9 100644 > --- a/dma-helpers.c > +++ b/dma-helpers.c > @@ -143,7 +143,8 @@ static void dma_blk_cb(void *opaque, int ret) > while (dbs->sg_cur_index < dbs->sg->nsg) { > cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte; > cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte; > - mem = dma_memory_map(dbs->sg->as, cur_addr, &cur_len, dbs->dir); > + mem = dma_memory_map(dbs->sg->as, cur_addr, &cur_len, dbs->dir, > + MEMTXATTRS_UNSPECIFIED); > /* > * Make reads deterministic in icount mode. Windows sometimes issues > * disk read requests with overlapping SGs. It leads > diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c > index 5f0dd7c1500..be7f5cdee46 100644 > --- a/hw/display/virtio-gpu.c > +++ b/hw/display/virtio-gpu.c > @@ -648,7 +648,9 @@ int virtio_gpu_create_mapping_iov(VirtIOGPU *g, > hwaddr len = l; > (*iov)[i].iov_len = l; > (*iov)[i].iov_base = dma_memory_map(VIRTIO_DEVICE(g)->dma_as, > - a, &len, > DMA_DIRECTION_TO_DEVICE); > + a, &len, > + DMA_DIRECTION_TO_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > if (addr) { > (*addr)[i] = a; > } > @@ -1049,7 +1051,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, > size_t size, > hwaddr len = res->iov[i].iov_len; > res->iov[i].iov_base = > dma_memory_map(VIRTIO_DEVICE(g)->dma_as, > - res->addrs[i], &len, DMA_DIRECTION_TO_DEVICE); > + res->addrs[i], &len, > + DMA_DIRECTION_TO_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > > if (!res->iov[i].iov_base || len != res->iov[i].iov_len) { > /* Clean up the half-a-mapping we just created... */ > diff --git a/hw/hyperv/vmbus.c b/hw/hyperv/vmbus.c > index 75af6b83dde..56621d72e5b 100644 > --- a/hw/hyperv/vmbus.c > +++ b/hw/hyperv/vmbus.c > @@ -372,7 +372,8 @@ static ssize_t gpadl_iter_io(GpadlIter *iter, void *buf, > uint32_t len) > > maddr = (iter->gpadl->gfns[idx] << TARGET_PAGE_BITS) | > off_in_page; > > - iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir); > + iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir, > + MEMTXATTRS_UNSPECIFIED); > if (mlen != pgleft) { > dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, 0); > iter->map = NULL; > @@ -488,7 +489,8 @@ int vmbus_map_sgl(VMBusChanReq *req, DMADirection dir, > struct iovec *iov, > goto err; > } > > - iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir); > + iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir, > + MEMTXATTRS_UNSPECIFIED); > if (!l) { > ret = -EFAULT; > goto err; > @@ -564,7 +566,7 @@ static vmbus_ring_buffer > *ringbuf_map_hdr(VMBusRingBufCommon *ringbuf) > dma_addr_t mlen = sizeof(*rb); > > rb = dma_memory_map(ringbuf->as, ringbuf->rb_addr, &mlen, > - DMA_DIRECTION_FROM_DEVICE); > + DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED); > if (mlen != sizeof(*rb)) { > dma_memory_unmap(ringbuf->as, rb, mlen, > DMA_DIRECTION_FROM_DEVICE, 0); > diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c > index b696c6291a3..fe1a4e2b1a2 100644 > --- a/hw/ide/ahci.c > +++ b/hw/ide/ahci.c > @@ -249,7 +249,8 @@ static void map_page(AddressSpace *as, uint8_t **ptr, > uint64_t addr, > dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len); > } > > - *ptr = dma_memory_map(as, addr, &len, DMA_DIRECTION_FROM_DEVICE); > + *ptr = dma_memory_map(as, addr, &len, DMA_DIRECTION_FROM_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > if (len < wanted) { > dma_memory_unmap(as, *ptr, len, DMA_DIRECTION_FROM_DEVICE, len); > *ptr = NULL; > @@ -938,7 +939,8 @@ static int ahci_populate_sglist(AHCIDevice *ad, > QEMUSGList *sglist, > > /* map PRDT */ > if (!(prdt = dma_memory_map(ad->hba->as, prdt_addr, &prdt_len, > - DMA_DIRECTION_TO_DEVICE))){ > + DMA_DIRECTION_TO_DEVICE, > + MEMTXATTRS_UNSPECIFIED))) { > trace_ahci_populate_sglist_no_map(ad->hba, ad->port_no); > return -1; > } > @@ -1299,7 +1301,8 @@ static int handle_cmd(AHCIState *s, int port, uint8_t > slot) > tbl_addr = le64_to_cpu(cmd->tbl_addr); > cmd_len = 0x80; > cmd_fis = dma_memory_map(s->as, tbl_addr, &cmd_len, > - DMA_DIRECTION_FROM_DEVICE); > + DMA_DIRECTION_FROM_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > if (!cmd_fis) { > trace_handle_cmd_badfis(s, port); > return -1; > diff --git a/hw/usb/libhw.c b/hw/usb/libhw.c > index 9c33a1640f7..f350eae443d 100644 > --- a/hw/usb/libhw.c > +++ b/hw/usb/libhw.c > @@ -36,7 +36,8 @@ int usb_packet_map(USBPacket *p, QEMUSGList *sgl) > > while (len) { > dma_addr_t xlen = len; > - mem = dma_memory_map(sgl->as, base, &xlen, dir); > + mem = dma_memory_map(sgl->as, base, &xlen, dir, > + MEMTXATTRS_UNSPECIFIED); > if (!mem) { > goto err; > } > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index e9830252176..c951131ba39 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -1320,7 +1320,8 @@ static bool virtqueue_map_desc(VirtIODevice *vdev, > unsigned int *p_num_sg, > iov[num_sg].iov_base = dma_memory_map(vdev->dma_as, pa, &len, > is_write ? > DMA_DIRECTION_FROM_DEVICE : > - DMA_DIRECTION_TO_DEVICE); > + DMA_DIRECTION_TO_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > if (!iov[num_sg].iov_base) { > virtio_error(vdev, "virtio: bogus descriptor or out of > resources"); > goto out; > @@ -1369,7 +1370,8 @@ static void virtqueue_map_iovec(VirtIODevice *vdev, > struct iovec *sg, > sg[i].iov_base = dma_memory_map(vdev->dma_as, > addr[i], &len, is_write ? > DMA_DIRECTION_FROM_DEVICE : > - DMA_DIRECTION_TO_DEVICE); > + DMA_DIRECTION_TO_DEVICE, > + MEMTXATTRS_UNSPECIFIED); > if (!sg[i].iov_base) { > error_report("virtio: error trying to map MMIO memory"); > exit(1); > -- > 2.26.2 > >