On 13/03/2015 02:38, Fam Zheng wrote: > The caller's workflow is like > > if (!address_space_map()) { > ... > cpu_register_map_client(); > } > > If bounce buffer became available after address_space_map() but before > cpu_register_map_client(), the caller could miss it and has to wait for the > next bounce buffer uesr to release, which may never happen in the worse case. > > Just notify the caller with the passed callback in cpu_register_map_client(). > > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > exec.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/exec.c b/exec.c > index 93ccd5a..82781e4 100644 > --- a/exec.c > +++ b/exec.c > @@ -2502,6 +2502,9 @@ void *cpu_register_map_client(void *opaque, void > (*callback)(void *opaque)) > client->opaque = opaque; > client->callback = callback; > QSLIST_INSERT_HEAD_ATOMIC(&map_client_list, client, link); > + if (!atomic_read(&bounce.in_use)) { > + callback(opaque);
This should call cpu_notify_map_clients instead, otherwise you get two calls. Paolo > + } > return client; > } > >