Message ID | 1426210723-16735-4-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
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 <famz@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; > } > >
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); + } return client; }
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 <famz@redhat.com> --- exec.c | 3 +++ 1 file changed, 3 insertions(+)