drivers: disable priority inheritance on all signaling semaphores
authorHeesub Shin <heesub.shin@samsung.com>
Thu, 6 Apr 2017 01:48:41 +0000 (10:48 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Tue, 18 Apr 2017 03:02:11 +0000 (12:02 +0900)
Disable priority inheritance on all semaphores used for signaling.

Change-Id: Id395323d2856a20139c142daa7683d1a933fb877
Signed-off-by: Gregory Nutt <gnutt@nuttx.org>
[Shin: backported 4fcbe8e41 from NuttX]
Signed-off-by: Heesub Shin <heesub.shin@samsung.com>
os/drivers/analog/dac.c
os/drivers/can.c
os/drivers/pipes/pipe_common.c
os/drivers/pwm.c
os/drivers/sercomm/console.c
os/drivers/syslog/ramlog.c
os/drivers/usbdev/usbmsc.c
os/drivers/usbhost/usbhost_hidkbd.c
os/drivers/usbhost/usbhost_hidmouse.c

index e3d9f40..c800ed4 100644 (file)
@@ -72,8 +72,9 @@
 #include <errno.h>
 #include <debug.h>
 
-#include <tinyara/fs/fs.h>
 #include <tinyara/arch.h>
+#include <tinyara/semaphore.h>
+#include <tinyara/fs/fs.h>
 #include <tinyara/analog/dac.h>
 
 #include <arch/irq.h>
@@ -473,9 +474,16 @@ int dac_register(FAR const char *path, FAR struct dac_dev_s *dev)
 
        dev->ad_ocount = 0;
 
+       /* Initialize semaphores */
        sem_init(&dev->ad_xmit.af_sem, 0, 0);
        sem_init(&dev->ad_closesem, 0, 1);
 
+       /*
+        * The transmit semaphore is used for signaling and, hence, should
+        * not have priority inheritance enabled.
+        */
+       sem_setprotocol(&dev->ad_xmit.af_sem, SEM_PRIO_NONE);
+
        dev->ad_ops->ao_reset(dev);
 
        return register_driver(path, &dac_fops, 0555, dev);
index bd24376..ad1cd6f 100644 (file)
@@ -67,8 +67,9 @@
 #include <errno.h>
 #include <debug.h>
 
-#include <tinyara/fs/fs.h>
 #include <tinyara/arch.h>
+#include <tinyara/semaphore.h>
+#include <tinyara/fs/fs.h>
 #include <tinyara/can.h>
 
 #include <arch/irq.h>
@@ -651,12 +652,18 @@ int can_register(FAR const char *path, FAR struct can_dev_s *dev)
 
        dev->cd_ocount = 0;
 
+       /* Initialize semaphores */
        sem_init(&dev->cd_xmit.tx_sem, 0, 0);
        sem_init(&dev->cd_recv.rx_sem, 0, 0);
        sem_init(&dev->cd_closesem, 0, 1);
 
        for (i = 0; i < CONFIG_CAN_NPENDINGRTR; i++) {
+               /*
+                * Initialize wait semaphores. These semaphores are used for
+                * signaling and should not have priority inheritance enabled.
+                */
                sem_init(&dev->cd_rtr[i].cr_sem, 0, 0);
+               sem_setprotocol(&dev->cd_rtr[i].cr_sem. SEM_PRIO_NONE);
                dev->cd_rtr[i].cr_msg = NULL;
                dev->cd_npendrtr--;
        }
index 31ec931..9835d39 100644 (file)
 #include <assert.h>
 #include <debug.h>
 
-#include <tinyara/kmalloc.h>
-#include <tinyara/fs/fs.h>
 #ifdef CONFIG_DEBUG
 #include <tinyara/arch.h>
 #endif
+#include <tinyara/kmalloc.h>
+#include <tinyara/semaphore.h>
+#include <tinyara/fs/fs.h>
+#include <tinyara/fs/ioctl.h>
 
 #include "pipe_common.h"
 
@@ -173,6 +175,13 @@ FAR struct pipe_dev_s *pipecommon_allocdev(void)
                sem_init(&dev->d_bfsem, 0, 1);
                sem_init(&dev->d_rdsem, 0, 0);
                sem_init(&dev->d_wrsem, 0, 0);
+
+               /*
+                * The read/write wait semaphores are used for signaling and,
+                * hence, should not have priority inheritance enabled.
+                */
+               sem_setprotocol(&dev->d_rdsem, SEM_PRIO_NONE);
+               sem_setprotocol(&dev->d_wrsem, SEM_PRIO_NONE);
        }
 
        return dev;
index a966789..d1675da 100644 (file)
@@ -18,7 +18,7 @@
 /****************************************************************************
  * drivers/pwm.c
  *
- *   Copyright (C) 2011-2013 Gregory Nutt. All rights reserved.
+ *   Copyright (C) 2011-2013, 2016 Gregory Nutt. All rights reserved.
  *   Author: Gregory Nutt <gnutt@nuttx.org>
  *
  * Redistribution and use in source and binary forms, with or without
 #include <errno.h>
 #include <debug.h>
 
+#include <tinyara/arch.h>
 #include <tinyara/kmalloc.h>
+#include <tinyara/semaphore.h>
 #include <tinyara/fs/fs.h>
-#include <tinyara/arch.h>
 #include <tinyara/pwm.h>
 
 #include <arch/irq.h>
@@ -590,7 +591,14 @@ int pwm_register(FAR const char *path, FAR struct pwm_lowerhalf_s *dev)
        sem_init(&upper->exclsem, 0, 1);
 #ifdef CONFIG_PWM_PULSECOUNT
        sem_init(&upper->waitsem, 0, 0);
+
+       /*
+        * The wait semaphore is used for signaling and, hence, should not
+        * have priority inheritance enabled.
+        */
+       sem_setprotocol(&upper->waitsem, SEM_PRIO_NONE);
 #endif
+
        upper->dev = dev;
 
        /* Register the PWM device */
index aa3b20e..4964b90 100644 (file)
@@ -64,6 +64,7 @@
 #include <string.h>
 
 #include "uart.h"
+#include <tinyara/semaphore.h>
 #include <tinyara/sercomm/sercomm.h>
 
 /* stubs to make serial driver happy */
@@ -217,6 +218,9 @@ int sercomm_register(FAR const char *path, FAR uart_dev_t *dev)
        sem_init(&dev->pollsem, 0, 1);
 #endif
 
+       sem_setprotocol(&dev->xmitsem, SEM_PRIO_NONE);
+       sem_setprotocol(&dev->recvsem, SEM_PRIO_NONE);
+
        dbg("Registering %s\n", path);
        return register_driver(path, &g_sercom_console_ops, 0666, NULL);
 }
index 84c1cfc..8c5b33b 100644 (file)
@@ -18,7 +18,7 @@
 /****************************************************************************
  * drivers/syslog/ramlog.c
  *
- *   Copyright (C) 2012 Gregory Nutt. All rights reserved.
+ *   Copyright (C) 2012, 2016 Gregory Nutt. All rights reserved.
  *   Author: Gregory Nutt <gnutt@nuttx.org>
  *
  * Redistribution and use in source and binary forms, with or without
 #include <assert.h>
 #include <debug.h>
 
-#include <tinyara/fs/fs.h>
+#include <tinyara/arch.h>
 #include <tinyara/kmalloc.h>
+#include <tinyara/semaphore.h>
 #include <tinyara/fs/fs.h>
-#include <tinyara/arch.h>
 #include <tinyara/syslog/ramlog.h>
 
 #include <arch/irq.h>
@@ -643,6 +643,12 @@ int ramlog_register(FAR const char *devpath, FAR char *buffer, size_t buflen)
                sem_init(&priv->rl_exclsem, 0, 1);
 #ifndef CONFIG_RAMLOG_NONBLOCKING
                sem_init(&priv->rl_waitsem, 0, 0);
+
+               /*
+                * The rl_waitsem semaphore is used for signaling and, hence,
+                * should not have priority inheritance enabled.
+                */
+               sem_setprotocol(&priv->rl_waitsem, SEM_PRIO_NONE);
 #endif
                priv->rl_bufsize = buflen;
                priv->rl_buffer = buffer;
index 77ee045..82579c4 100644 (file)
@@ -91,6 +91,7 @@
 #include <tinyara/kmalloc.h>
 #include <tinyara/kthread.h>
 #include <tinyara/arch.h>
+#include <tinyara/semaphore.h>
 #include <tinyara/fs/fs.h>
 #include <tinyara/usb/usb.h>
 #include <tinyara/usb/storage.h>
@@ -1230,9 +1231,18 @@ int usbmsc_configure(unsigned int nluns, void **handle)
        priv = &alloc->dev;
        memset(priv, 0, sizeof(struct usbmsc_dev_s));
 
+       /* Initialize semaphores */
        sem_init(&priv->thsynch, 0, 0);
        sem_init(&priv->thlock, 0, 1);
        sem_init(&priv->thwaitsem, 0, 0);
+
+       /*
+        * The thsynch and thwaitsem semaphores are used for signaling and,
+        * hence, should not have priority inheritance enabled.
+        */
+       sem_setprotocol(&priv->thsynch, SEM_PRIO_NONE);
+       sem_setprotocol(&priv->thwaitsem, SEM_PRIO_NONE);
+
        sq_init(&priv->wrreqlist);
 
        priv->nluns = nluns;
index f5ac085..78c1cc6 100644 (file)
@@ -76,6 +76,7 @@
 #include <tinyara/fs/fs.h>
 #include <tinyara/arch.h>
 #include <tinyara/wqueue.h>
+#include <tinyara/semaphore.h>
 
 #include <tinyara/usb/usb.h>
 #include <tinyara/usb/usbhost.h>
@@ -1789,6 +1790,12 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_hubport_s *
                        sem_init(&priv->exclsem, 0, 1);
                        sem_init(&priv->waitsem, 0, 0);
 
+                       /*
+                        * The waitsem semaphore is used for signaling and,
+                        * hence, should not have priority inheritance enabled.
+                        */
+                       sem_setprotocol(&priv->waitsem, SEM_PRIO_NONE);
+
                        /* Return the instance of the USB keyboard class driver */
 
                        return &priv->usbclass;
@@ -2308,6 +2315,12 @@ int usbhost_kbdinit(void)
        sem_init(&g_exclsem, 0, 1);
        sem_init(&g_syncsem, 0, 0);
 
+       /*
+        * The g_syncsem semaphore is used for signaling and, hence, should
+        * not have priority inheritance enabled.
+        */
+       sem_setprotocol(&g_syncsem, SEM_PRIO_NONE);
+
        /* Advertise our availability to support (certain) devices */
 
        return usbhost_registerclass(&g_hidkbd);
index 163b783..fd61b34 100644 (file)
@@ -73,6 +73,7 @@
 #include <tinyara/kthread.h>
 #include <tinyara/fs/fs.h>
 #include <tinyara/wqueue.h>
+#include <tinyara/semaphore.h>
 
 #include <tinyara/usb/usb.h>
 #include <tinyara/usb/usbhost.h>
@@ -1836,6 +1837,12 @@ static FAR struct usbhost_class_s *usbhost_create(FAR struct usbhost_hubport_s *
                        sem_init(&priv->exclsem, 0, 1);
                        sem_init(&priv->waitsem, 0, 0);
 
+                       /*
+                        * The waitsem semaphore is used for signaling and,
+                        * hence, should not have priority inheritance enabled.
+                        */
+                       sem_setprotocol(&priv->waitsem, SEM_PRIO_NONE);
+
                        /* Return the instance of the USB mouse class driver */
 
                        return &priv->usbclass;
@@ -2414,6 +2421,12 @@ int usbhost_mouse_init(void)
        sem_init(&g_exclsem, 0, 1);
        sem_init(&g_syncsem, 0, 0);
 
+       /*
+        * The g_syncsem semaphore is used for signaling and, hence, should
+        * not have priority inheritance enabled.
+        */
+       sem_setprotocol(&g_syncsem, SEM_PRIO_NONE);
+
        /* Advertise our availability to support (certain) mouse devices */
 
        return usbhost_registerclass(&g_hidmouse);