IPC: Always notify for every new vring buffer sent by host
authorJuan Gutierrez <jgutierrez@ti.com>
Wed, 12 Oct 2011 16:53:28 +0000 (11:53 -0500)
committerSuman Anna <s-anna@ti.com>
Thu, 13 Oct 2011 22:06:42 +0000 (17:06 -0500)
commit16fde2fa29c5bf35b4245e3c2344985effd58148
treeb8644f50e8e96c0975ad5b7a6d82816a5a930041
parentdece5f7a584f1c5def538c914de5459168c35d2a
IPC: Always notify for every new vring buffer sent by host

After receiving a notification for a new message from the host,
the guest loops and retrieves all the available messages. While
inside the loop and checking for new messages, the guest sets
the vring flag to NO_NOTIFY. This flag tells the host to not
notify the guest if a new message is put in shared memory. As
long as the guest is still inside the loop, new incoming
messages will be discovered without the need of being notified.
When no no more new messages are detected in shared memory, the
guest will set the vring flag as NOTIFY and gets out of the loop.

There is a small latency between the time the guest sets the flag
in shared memory and the time this value is properly read by the
host. Due to this latency, the guest could miss a notification
and thereby a new message, as the host could see the flag as
NO_NOTIFY and decides not to send an interrupt while the guest
is getting out of the loop and changing the flag value to NOTIFY.

This leads to the shared memory having a new message without the
guest never being aware as it never received a notification. The
guest will wait until next notification from the host. However,
this may result in a application deadlock as the host might never
send another message.

In order to avoid the above corner case, it is better to let the
host always notify the guest whenever a new message intended for
the guest is put in shared memory.

Signed-off-by: Juan Gutierrez <jgutierrez@ti.com>
src/ti/ipc/rpmsg/VirtQueue.c