-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Yusuf Caglar AKYUZ wrote:
> Hi,
> 
> I'm using dsplink 1.60 along with CE 2.21 and sometimes I face
> kernel oops messages. [1] Then the issuing process locks-up. The
> error always(up to now) shows-up while process is finishing. I
> debugged this issue a little deeper further down and I suspect that
> some mutex is tried to be locked after it is deleted.
> 

Hi again,

I found my problem. I *think* dsplink incorrectly handles kernel signals, 
actually it incorrectly handles message queue timeouts. Also when it 
receives the signal, it tries to use a deleted mutex also. 

My current solution is attached to illustrate my situation.

Regards,
Caglar

- --- sync_orig.c 2008-10-24 22:58:01.000000000 +0300
+++ sync.c      2009-03-10 12:49:04.000000000 +0200
@@ -30,9 +30,14 @@


 /*  ----------------------------------- OS Specific Headers         */
+#include <linux/version.h>
 #include <linux/autoconf.h>
 #include <linux/spinlock.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
 #include <asm/semaphore.h>
+#else
+#include <linux/semaphore.h>
+#endif
 #include <linux/timer.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
@@ -947,19 +952,25 @@
                     /* Schedule out for given timeout */
                     osStatus = schedule_timeout (MAX_SCHEDULE_TIMEOUT) ;
                     /* Take the lock */
- -                    SYNC_SpinLockStartEx (semObj->lock) ;
+                    //SYNC_SpinLockStartEx (semObj->lock) ;
+                   if (signal_pending(current)) {
+                       status = -ERESTARTSYS;
+                       SET_FAILURE_REASON ;
+                   }
+#if 0
                     if (osStatus == -ERESTARTSYS) { /* Interrupted? huh? */
                         status = -ERESTARTSYS ;
                         SET_FAILURE_REASON ;
                         break ;
                     }
+#endif
                 } while (0) ;
                 /* Remove from wait list */
                 remove_wait_queue (&semObj->list, &wait) ;
                 /* Set the current task status as running */
- -                set_current_state (TASK_RUNNING) ;
+                //set_current_state (TASK_RUNNING) ;
                 /* End the lock */
- -                SYNC_SpinLockEndEx (semObj->lock, 0u) ;
+                //SYNC_SpinLockEndEx (semObj->lock, 0u) ;
             }
             else {
                 if (semObj->semType == SyncSemType_Binary) {



-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.9 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iEYEARECAAYFAkm2SaIACgkQ/nL+S5dojejIagCfc+Si9VdNghcYguUBODFeLnY1
AugAoLhy1ozDCJZREeUxd75uZmYMBZul
=CGVj
-----END PGP SIGNATURE-----

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to