SDOCM00104583 RPMessage crash after 65k messages
authorRamsey Harris <ramsey@ti.com>
Thu, 17 Oct 2013 23:02:26 +0000 (16:02 -0700)
committerChris Ring <cring@ti.com>
Sat, 19 Oct 2013 18:55:42 +0000 (11:55 -0700)
The semaphore was posted for every message added to the pool.
Added VRING_USED_F_NO_NOTIFY flag to only post semaphore when
needed. Moved clearing of flag to avoid race condition with
remote processor. Also changed the semaphore from counting
mode to binary mode.

packages/ti/ipc/family/omap54xx/VirtQueue.c
packages/ti/ipc/family/vayu/VirtQueue.c
packages/ti/ipc/rpmsg/RPMessage.c

index c055ada73ba895e589029bb95bfd5877a942ed79..0c9a25043aab0dc203f6b0efb904bf0360ba0a13 100644 (file)
@@ -376,13 +376,20 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
         (IArg)vq, vq->last_avail_idx, vq->vring.avail->idx, vq->vring.num,
         (IArg)&vq->vring.avail, (IArg)vq->vring.avail);
 
+    /*  Clear flag here to avoid race condition with remote processor.
+     *  This is a negative flag, clearing it means that we want to
+     *  receive an interrupt when a buffer has been added to the pool.
+     */
+    vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
+
     /* There's nothing available? */
     if (vq->last_avail_idx == vq->vring.avail->idx) {
-        /* We need to know about added buffers */
-        vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
         head = (-1);
     }
     else {
+        /* No need to be kicked about added buffers anymore */
+        vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
+
         /*
          * Grab the next descriptor number they're advertising, and increment
          * the index we've seen.
index 42e9b8680afe849481b3c27760f2cb7c80545698..4ca8f1db5fb509ece75d2775b567f6da05cb13fe 100644 (file)
@@ -253,6 +253,7 @@ static Void _VirtQueue_init()
         initialized = 1;
     }
 }
+
 static inline Void * mapPAtoVA(UInt pa)
 {
     return (Void *)((pa & 0x000fffffU) | IPC_MEM_VRING0);
@@ -372,13 +373,20 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
         (IArg)vq, vq->last_avail_idx, vq->vring.avail->idx, vq->vring.num,
         (IArg)&vq->vring.avail, (IArg)vq->vring.avail);
 
+    /*  Clear flag here to avoid race condition with remote processor.
+     *  This is a negative flag, clearing it means that we want to
+     *  receive an interrupt when a buffer has been added to the pool.
+     */
+    vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
+
     /* There's nothing available? */
     if (vq->last_avail_idx == vq->vring.avail->idx) {
-        /* We need to know about added buffers */
-        vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
         head = (-1);
     }
     else {
+        /* No need to be kicked about added buffers anymore */
+        vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
+
         /*
          * Grab the next descriptor number they're advertising, and increment
          * the index we've seen.
index aa7008c87a574210a21dad11d43d4f57fc02893c..94fbc1bc0a8e3f3079c64cc15f000c63545d399a 100644 (file)
@@ -260,6 +260,7 @@ Void RPMessage_init(UInt16 remoteProcId)
 {
     GateHwi_Params gatePrms;
     HeapBuf_Params prms;
+    Semaphore_Params semParams;
     int     i;
     Registry_Result result;
     Bool    isHost;
@@ -298,7 +299,10 @@ Void RPMessage_init(UInt16 remoteProcId)
     if (module.heap == 0) {
        System_abort("RPMessage_init: HeapBuf_create returned 0\n");
     }
-    transport.semHandle_toHost = Semaphore_create(0, NULL, NULL);
+
+    Semaphore_Params_init(&semParams);
+    semParams.mode = Semaphore_Mode_BINARY;
+    transport.semHandle_toHost = Semaphore_create(0, &semParams, NULL);
 
     isHost = (MultiProc_self() == MultiProc_getId("HOST"));