On Thu, Jul 20, 2023 at 8:14 PM Stefan Hajnoczi <stefa...@redhat.com> wrote: > > On Tue, Jul 04, 2023 at 01:06:26AM -0700, Mattias Nissler wrote: > > According to old commit messages, this was introduced to retry a DMA > > operation at a later point in case the single bounce buffer is found to > > be busy. This was never used widely - only the dma-helpers code made use > > of it, but there are other device models that use multiple DMA mappings > > (concurrently) and just failed. > > > > After the improvement to support multiple concurrent bounce buffers, > > the condition the notification callback allowed to work around no > > longer exists, so we can just remove the logic and simplify the code. > > > > Signed-off-by: Mattias Nissler <mniss...@rivosinc.com> > > --- > > softmmu/dma-helpers.c | 28 ----------------- > > softmmu/physmem.c | 71 ------------------------------------------- > > 2 files changed, 99 deletions(-) > > I'm not sure if it will be possible to remove this once a limit is > placed bounce buffer space.
I investigated this in detail and concluded that you're right unfortunately. In particular, after I found that Linux likes to use megabyte-sided DMA buffers with xhci-attached USB storage, I don't think it's realistic to set a reasonable fixed limit that accommodates most workloads in practice. > > > > > diff --git a/softmmu/dma-helpers.c b/softmmu/dma-helpers.c > > index 2463964805..d05d226f11 100644 > > --- a/softmmu/dma-helpers.c > > +++ b/softmmu/dma-helpers.c > > @@ -68,23 +68,10 @@ typedef struct { > > int sg_cur_index; > > dma_addr_t sg_cur_byte; > > QEMUIOVector iov; > > - QEMUBH *bh; > > DMAIOFunc *io_func; > > void *io_func_opaque; > > } DMAAIOCB; > > > > -static void dma_blk_cb(void *opaque, int ret); > > - > > -static void reschedule_dma(void *opaque) > > -{ > > - DMAAIOCB *dbs = (DMAAIOCB *)opaque; > > - > > - assert(!dbs->acb && dbs->bh); > > - qemu_bh_delete(dbs->bh); > > - dbs->bh = NULL; > > - dma_blk_cb(dbs, 0); > > -} > > - > > static void dma_blk_unmap(DMAAIOCB *dbs) > > { > > int i; > > @@ -101,7 +88,6 @@ static void dma_complete(DMAAIOCB *dbs, int ret) > > { > > trace_dma_complete(dbs, ret, dbs->common.cb); > > > > - assert(!dbs->acb && !dbs->bh); > > dma_blk_unmap(dbs); > > if (dbs->common.cb) { > > dbs->common.cb(dbs->common.opaque, ret); > > @@ -164,13 +150,6 @@ static void dma_blk_cb(void *opaque, int ret) > > } > > } > > > > - if (dbs->iov.size == 0) { > > - trace_dma_map_wait(dbs); > > - dbs->bh = aio_bh_new(ctx, reschedule_dma, dbs); > > - cpu_register_map_client(dbs->bh); > > - goto out; > > - } > > - > > if (!QEMU_IS_ALIGNED(dbs->iov.size, dbs->align)) { > > qemu_iovec_discard_back(&dbs->iov, > > QEMU_ALIGN_DOWN(dbs->iov.size, > > dbs->align)); > > @@ -189,18 +168,12 @@ static void dma_aio_cancel(BlockAIOCB *acb) > > > > trace_dma_aio_cancel(dbs); > > > > - assert(!(dbs->acb && dbs->bh)); > > if (dbs->acb) { > > /* This will invoke dma_blk_cb. */ > > blk_aio_cancel_async(dbs->acb); > > return; > > } > > > > - if (dbs->bh) { > > - cpu_unregister_map_client(dbs->bh); > > - qemu_bh_delete(dbs->bh); > > - dbs->bh = NULL; > > - } > > if (dbs->common.cb) { > > dbs->common.cb(dbs->common.opaque, -ECANCELED); > > } > > @@ -239,7 +212,6 @@ BlockAIOCB *dma_blk_io(AioContext *ctx, > > dbs->dir = dir; > > dbs->io_func = io_func; > > dbs->io_func_opaque = io_func_opaque; > > - dbs->bh = NULL; > > qemu_iovec_init(&dbs->iov, sg->nsg); > > dma_blk_cb(dbs, 0); > > return &dbs->common; > > diff --git a/softmmu/physmem.c b/softmmu/physmem.c > > index 56130b5a1d..2b4123c127 100644 > > --- a/softmmu/physmem.c > > +++ b/softmmu/physmem.c > > @@ -2908,49 +2908,6 @@ typedef struct { > > uint8_t buffer[]; > > } BounceBuffer; > > > > -static size_t bounce_buffers_in_use; > > - > > -typedef struct MapClient { > > - QEMUBH *bh; > > - QLIST_ENTRY(MapClient) link; > > -} MapClient; > > - > > -QemuMutex map_client_list_lock; > > -static QLIST_HEAD(, MapClient) map_client_list > > - = QLIST_HEAD_INITIALIZER(map_client_list); > > - > > -static void cpu_unregister_map_client_do(MapClient *client) > > -{ > > - QLIST_REMOVE(client, link); > > - g_free(client); > > -} > > - > > -static void cpu_notify_map_clients_locked(void) > > -{ > > - MapClient *client; > > - > > - while (!QLIST_EMPTY(&map_client_list)) { > > - client = QLIST_FIRST(&map_client_list); > > - qemu_bh_schedule(client->bh); > > - cpu_unregister_map_client_do(client); > > - } > > -} > > - > > -void cpu_register_map_client(QEMUBH *bh) > > -{ > > - MapClient *client = g_malloc(sizeof(*client)); > > - > > - qemu_mutex_lock(&map_client_list_lock); > > - client->bh = bh; > > - QLIST_INSERT_HEAD(&map_client_list, client, link); > > - /* Write map_client_list before reading in_use. */ > > - smp_mb(); > > - if (qatomic_read(&bounce_buffers_in_use)) { > > - cpu_notify_map_clients_locked(); > > - } > > - qemu_mutex_unlock(&map_client_list_lock); > > -} > > - > > void cpu_exec_init_all(void) > > { > > qemu_mutex_init(&ram_list.mutex); > > @@ -2964,28 +2921,6 @@ void cpu_exec_init_all(void) > > finalize_target_page_bits(); > > io_mem_init(); > > memory_map_init(); > > - qemu_mutex_init(&map_client_list_lock); > > -} > > - > > -void cpu_unregister_map_client(QEMUBH *bh) > > -{ > > - MapClient *client; > > - > > - qemu_mutex_lock(&map_client_list_lock); > > - QLIST_FOREACH(client, &map_client_list, link) { > > - if (client->bh == bh) { > > - cpu_unregister_map_client_do(client); > > - break; > > - } > > - } > > - qemu_mutex_unlock(&map_client_list_lock); > > -} > > - > > -static void cpu_notify_map_clients(void) > > -{ > > - qemu_mutex_lock(&map_client_list_lock); > > - cpu_notify_map_clients_locked(); > > - qemu_mutex_unlock(&map_client_list_lock); > > } > > > > static bool flatview_access_valid(FlatView *fv, hwaddr addr, hwaddr len, > > @@ -3077,8 +3012,6 @@ void *address_space_map(AddressSpace *as, > > memory_region_ref(mr); > > > > if (!memory_access_is_direct(mr, is_write)) { > > - qatomic_inc_fetch(&bounce_buffers_in_use); > > - > > BounceBuffer *bounce = g_malloc(l + sizeof(BounceBuffer)); > > bounce->addr = addr; > > bounce->mr = mr; > > @@ -3122,10 +3055,6 @@ void address_space_unmap(AddressSpace *as, void > > *buffer, hwaddr len, > > } > > memory_region_unref(bounce->mr); > > g_free(bounce); > > - > > - if (qatomic_dec_fetch(&bounce_buffers_in_use) == 1) { > > - cpu_notify_map_clients(); > > - } > > return; > > } > > > > -- > > 2.34.1 > >