From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LOdi8-0005KV-Jj for qemu-devel@nongnu.org; Sun, 18 Jan 2009 14:53:32 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LOdi5-0005Iu-TM for qemu-devel@nongnu.org; Sun, 18 Jan 2009 14:53:31 -0500 Received: from [199.232.76.173] (port=52591 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LOdi5-0005Ig-Aa for qemu-devel@nongnu.org; Sun, 18 Jan 2009 14:53:29 -0500 Received: from mx2.redhat.com ([66.187.237.31]:57969) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LOdi4-0000Jx-De for qemu-devel@nongnu.org; Sun, 18 Jan 2009 14:53:28 -0500 From: Avi Kivity Date: Sun, 18 Jan 2009 21:53:16 +0200 Message-Id: <1232308399-21679-3-git-send-email-avi@redhat.com> In-Reply-To: <1232308399-21679-1-git-send-email-avi@redhat.com> References: <1232308399-21679-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH 2/5] Add map client retry notification Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Anthony Liguori The target memory mapping API may fail if the bounce buffer resources are exhausted. Add a notification mechanism to allow clients to retry the mapping operation when resources become available again. Signed-off-by: Avi Kivity --- cpu-all.h | 3 +++ exec.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/cpu-all.h b/cpu-all.h index 3439999..67e795e 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -928,6 +928,9 @@ void *cpu_physical_memory_map(target_phys_addr_t addr, int is_write); void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len, int is_write); +void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque)); +void cpu_unregister_map_client(void *cookie); + uint32_t ldub_phys(target_phys_addr_t addr); uint32_t lduw_phys(target_phys_addr_t addr); uint32_t ldl_phys(target_phys_addr_t addr); diff --git a/exec.c b/exec.c index 7162271..62bedc0 100644 --- a/exec.c +++ b/exec.c @@ -3053,6 +3053,43 @@ typedef struct { static BounceBuffer bounce; +typedef struct MapClient { + void *opaque; + void (*callback)(void *opaque); + LIST_ENTRY(MapClient) link; +} MapClient; + +static LIST_HEAD(map_client_list, MapClient) map_client_list + = LIST_HEAD_INITIALIZER(map_client_list); + +void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque)) +{ + MapClient *client = qemu_malloc(sizeof(*client)); + + client->opaque = opaque; + client->callback = callback; + LIST_INSERT_HEAD(&map_client_list, client, link); + return client; +} + +void cpu_unregister_map_client(void *_client) +{ + MapClient *client = (MapClient *)_client; + + LIST_REMOVE(client, link); +} + +static void cpu_notify_map_clients(void) +{ + MapClient *client; + + while (!LIST_EMPTY(&map_client_list)) { + client = LIST_FIRST(&map_client_list); + client->callback(client->opaque); + LIST_REMOVE(client, link); + } +} + void *cpu_physical_memory_map(target_phys_addr_t addr, target_phys_addr_t *plen, int is_write) @@ -3137,6 +3174,7 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len, } qemu_free(bounce.buffer); bounce.buffer = NULL; + cpu_notify_map_clients(); } /* warning: addr must be aligned */ -- 1.6.0.6