Browse Source

FIX Debian JPU futex error

leo.lu 1 year ago
parent
commit
43f4ea52f1

+ 1 - 1
codaj12/Makefile

@@ -75,7 +75,7 @@ ARFLAGS += cru
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 OBJDIR=obj
 ALLOBJS=*.o

+ 1 - 1
codaj12/codaj12_buildroot.mak

@@ -83,7 +83,7 @@ LDFLAGS  = $(PLATFORM_FLAGS)
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 BUILDLIST=DECTEST
 MAKEFILE=codaj12_buildroot.mak

+ 4 - 1
codaj12/jdi/linux/driver/jpu.c

@@ -248,9 +248,10 @@ static int jpu_free_instances(struct file *filp)
     jpudrv_instance_pool_t *vip;
     void *vip_base;
     int instance_pool_size_per_core;
+#if !defined(PTHREAD_MUTEX_ROBUST_NP)
     void *jdi_mutexes_base;
     const int PTHREAD_MUTEX_T_DESTROY_VALUE = 0xdead10cc;
-
+#endif
     DPRINTK("[JPUDRV] jpu_free_instances\n");
 
     instance_pool_size_per_core = (s_instance_pool.size/MAX_NUM_JPU_CORE); /* s_instance_pool.size  assigned to the size of all core once call JDI_IOCTL_GET_INSTANCE_POOL by user. */
@@ -263,6 +264,7 @@ static int jpu_free_instances(struct file *filp)
             vip = (jpudrv_instance_pool_t *)vip_base;
             if (vip) {
                 memset(&vip->codecInstPool[vil->inst_idx], 0x00, 4);    /* only first 4 byte is key point(inUse of CodecInst in jpuapi) to free the corresponding instance. */
+#if !defined(PTHREAD_MUTEX_ROBUST_NP)
 #define PTHREAD_MUTEX_T_HANDLE_SIZE 4
                 jdi_mutexes_base = (vip_base + (instance_pool_size_per_core - PTHREAD_MUTEX_T_HANDLE_SIZE*4));
                 DPRINTK("[JPUDRV] jpu_free_instances : force to destroy jdi_mutexes_base=%p in userspace \n", jdi_mutexes_base);
@@ -273,6 +275,7 @@ static int jpu_free_instances(struct file *filp)
                         jdi_mutexes_base += PTHREAD_MUTEX_T_HANDLE_SIZE;
                     }
                 }
+#endif
             }
             s_jpu_open_ref_count--;
             list_del(&vil->list);

+ 4 - 0
codaj12/jdi/linux/driver/jpu.h

@@ -50,6 +50,10 @@
 
 #define MEM2SYS(addr) ((addr) > 0x40000000 && (addr) < 0x240000000 ? ((addr)+0x400000000):(addr))
 
+#ifndef PTHREAD_MUTEX_ROBUST_NP
+#define PTHREAD_MUTEX_ROBUST_NP     1
+#endif
+
 typedef struct jpudrv_flush_cache_t {
     unsigned long start;
     unsigned long size;

+ 56 - 6
codaj12/jdi/linux/jdi.c

@@ -52,6 +52,8 @@
 
 
 #define JPU_DEVICE_NAME "/dev/jpu"
+#define JPU_MUTEX_NAME  "/jpumutex"
+static int mutex_fd = -1;
 #define JDI_INSTANCE_POOL_SIZE          sizeof(jpu_instance_pool_t)
 #define JDI_INSTANCE_POOL_TOTAL_SIZE    (JDI_INSTANCE_POOL_SIZE + sizeof(MUTEX_HANDLE)*JDI_NUM_LOCK_HANDLES)
 typedef pthread_mutex_t    MUTEX_HANDLE;
@@ -173,7 +175,7 @@ int jdi_init()
          * pthread_mutexattr_setrobust_np(attr, PTHREAD_MUTEX_ROBUST_NP) makes
          * next onwer call pthread_mutex_lock() without deadlock.
          */
-        pthread_mutexattr_setrobust_np(&mutexattr, PTHREAD_MUTEX_ROBUST_NP);
+        pthread_mutexattr_setrobust(&mutexattr, PTHREAD_MUTEX_ROBUST);
 #endif
         pthread_mutex_init((MUTEX_HANDLE *)jdi->jpu_mutex, &mutexattr);
 
@@ -183,6 +185,7 @@ int jdi_init()
             pCodecInst[0] = 0;    // indicate inUse of CodecInst
         }
         jdi->pjip->instance_pool_inited = TRUE;
+        pthread_mutexattr_destroy(&mutexattr);
     }
     if (ioctl(jdi->jpu_fd, JDI_IOCTL_GET_REGISTER_INFO, &jdi->jdb_register) < 0)
     {
@@ -259,6 +262,14 @@ int jdi_release()
         close(jdi->jpu_fd);
     }
 
+    if (jdi->jpu_mutex)
+    {
+        munmap(jdi->jpu_mutex, sizeof(MUTEX_HANDLE) * JDI_NUM_LOCK_HANDLES);
+        close(mutex_fd);
+        jdi->jpu_mutex = NULL;
+        mutex_fd = -1;
+    }
+
     memset(jdi, 0x00, sizeof(jdi_info_t));
 
     return 0;
@@ -276,7 +287,8 @@ jpu_instance_pool_t *jdi_get_instance_pool()
 
     memset(&jdb, 0x00, sizeof(jpudrv_buffer_t));
     if (!jdi->pjip) {
-        jdb.size = JDI_INSTANCE_POOL_TOTAL_SIZE;
+        void *mutex_addr = NULL;
+        jdb.size = JDI_INSTANCE_POOL_SIZE;
         if (ioctl(jdi->jpu_fd, JDI_IOCTL_GET_INSTANCE_POOL, &jdb) < 0) {
             JLOG(ERR, "[JDI] fail to allocate get instance pool physical space=%d\n", (int)jdb.size);
             return NULL;
@@ -289,8 +301,36 @@ jpu_instance_pool_t *jdi_get_instance_pool()
         }
         jdi->pjip      = (jpu_instance_pool_t *)jdb.virt_addr;//lint !e511
         //change the pointer of jpu_mutex to at end pointer of jpu_instance_pool_t to assign at allocated position.
-        jdi->jpu_mutex = (void *)((unsigned long)jdi->pjip + JDI_INSTANCE_POOL_SIZE); //lint !e511
+        if (jdi->pjip && (jdi->pjip->instance_pool_inited == FALSE)) {
+            mutex_fd = shm_open(JPU_MUTEX_NAME, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);
+            if (mutex_fd < 0)
+            {
+                JLOG(ERR, "[JDI] shm_open failed with %s\n", JPU_MUTEX_NAME);
+                return NULL;
+            }
 
+            if (ftruncate(mutex_fd, sizeof(MUTEX_HANDLE) * JDI_NUM_LOCK_HANDLES) == -1)
+            {
+                shm_unlink(JPU_MUTEX_NAME);
+                JLOG(ERR, "[JDI] ftruncate failed with %s\n" JPU_MUTEX_NAME);
+                return NULL;
+            }
+        } else {
+            mutex_fd = shm_open(JPU_MUTEX_NAME, O_RDWR, S_IRWXU | S_IRWXG);
+            if (mutex_fd < 0)
+            {
+                JLOG(ERR, "[JDI] shm_open exist mutex failed with %s\n",JPU_MUTEX_NAME);
+                return NULL;
+            }
+        }
+        mutex_addr = mmap(NULL, sizeof(MUTEX_HANDLE) * JDI_NUM_LOCK_HANDLES, PROT_READ | PROT_WRITE, MAP_SHARED, mutex_fd, 0);
+        if (mutex_addr == MAP_FAILED)
+        {
+            JLOG(ERR, "[JDI] mmap failed with %s\n", JPU_MUTEX_NAME);
+            return NULL;
+        }
+ 
+        jdi->jpu_mutex = mutex_addr;
         JLOG(INFO, "[JDI] instance pool physaddr=%p, virtaddr=%p, base=%p, size=%d\n", jdb.phys_addr, jdb.virt_addr, jdb.base, jdb.size);
     }
 
@@ -361,6 +401,7 @@ int jdi_hw_reset()
 
 }
 
+#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
 static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
 {
     int mutex_value;
@@ -380,6 +421,7 @@ static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
         pthread_mutex_init(mutex, &mutexattr);
     }
 }
+#endif
 
 int jdi_lock()
 {
@@ -395,9 +437,17 @@ int jdi_lock()
     restore_mutex_in_dead((MUTEX_HANDLE *)jdi->jpu_mutex);
     pthread_mutex_lock((MUTEX_HANDLE*)jdi->jpu_mutex);
 #else
-    if (pthread_mutex_lock(&jdi->jpu_mutex) != 0) {
-        JLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
-        return -1;
+    int ret = -1;
+    ret = pthread_mutex_lock((MUTEX_HANDLE *)jdi->jpu_mutex);
+    if (ret != 0) {
+        if (ret == EOWNERDEAD)
+            ret = pthread_mutex_consistent((MUTEX_HANDLE *)jdi->jpu_mutex);
+
+        if (ret != 0)
+        {
+            JLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
+            return -1;
+        }
     }
 #endif