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. > > 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 >
signature.asc
Description: PGP signature