summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGowtham Tammana2021-03-01 12:23:01 -0600
committerGowtham Tammana2021-04-27 15:44:34 -0500
commite2a10f31e255a65ec30a6e10b890e77d7e9cb107 (patch)
treeac4b72f264f3047dbb69ac1d66f34a5b42068e7f
parent24757464ebd18da63f1bc03df12f9ce61961b996 (diff)
downloadti-gc320-driver-ti-5.0.11.p7-next.tar.gz
ti-gc320-driver-ti-5.0.11.p7-next.tar.xz
ti-gc320-driver-ti-5.0.11.p7-next.zip
km: fix lock on completion wait queueti-5.0.11.p7-nextti-5.0.11.p7-k5.10
Simple wait queues replaced wait queues in the completion interface starting from k5.7. As a result raw_spinlock_t is used to protect the waiter list. This fixes the lock usage to raw spinlock version. Also removing the PREEMPT_RT kernel check as raw spinlock version safe to use in rt kernel. Kernel commit in ti-linux-5.10.y a5c6234e10280 ("completion: Use simple wait queues") Signed-off-by: Gowtham Tammana <g-tammana@ti.com>
-rwxr-xr-xsrc/Kbuild8
-rwxr-xr-xsrc/hal/os/linux/kernel/gc_hal_kernel_os.c30
2 files changed, 0 insertions, 38 deletions
diff --git a/src/Kbuild b/src/Kbuild
index cf83713..2679697 100755
--- a/src/Kbuild
+++ b/src/Kbuild
@@ -244,14 +244,6 @@ else
244EXTRA_CFLAGS += -DgcdENABLE_OUTER_CACHE_PATCH=0 244EXTRA_CFLAGS += -DgcdENABLE_OUTER_CACHE_PATCH=0
245endif 245endif
246 246
247ifneq ($(CONFIG_PREEMPT_RT_BASE),)
248EXTRA_CFLAGS += -DgcdRT_KERNEL=1
249else ifneq ($(CONFIG_PREEMPT_RT),)
250EXTRA_CFLAGS += -DgcdRT_KERNEL=1
251else
252EXTRA_CFLAGS += -DgcdRT_KERNEL=0
253endif
254
255ifeq ($(USE_BANK_ALIGNMENT), 1) 247ifeq ($(USE_BANK_ALIGNMENT), 1)
256 EXTRA_CFLAGS += -DgcdENABLE_BANK_ALIGNMENT=1 248 EXTRA_CFLAGS += -DgcdENABLE_BANK_ALIGNMENT=1
257 ifneq ($(BANK_BIT_START), 0) 249 ifneq ($(BANK_BIT_START), 0)
diff --git a/src/hal/os/linux/kernel/gc_hal_kernel_os.c b/src/hal/os/linux/kernel/gc_hal_kernel_os.c
index 7ba962f..fd8b391 100755
--- a/src/hal/os/linux/kernel/gc_hal_kernel_os.c
+++ b/src/hal/os/linux/kernel/gc_hal_kernel_os.c
@@ -7030,11 +7030,7 @@ gckOS_WaitSignal(
7030 7030
7031 might_sleep(); 7031 might_sleep();
7032 7032
7033#if gcdRT_KERNEL
7034 raw_spin_lock_irq(&signal->obj.wait.lock); 7033 raw_spin_lock_irq(&signal->obj.wait.lock);
7035#else
7036 spin_lock_irq(&signal->obj.wait.lock);
7037#endif
7038 7034
7039 if (signal->obj.done) 7035 if (signal->obj.done)
7040 { 7036 {
@@ -7056,7 +7052,6 @@ gckOS_WaitSignal(
7056 ? MAX_SCHEDULE_TIMEOUT 7052 ? MAX_SCHEDULE_TIMEOUT
7057 : Wait * HZ / 1000; 7053 : Wait * HZ / 1000;
7058 7054
7059#if gcdRT_KERNEL
7060 DECLARE_SWAITQUEUE(wait); 7055 DECLARE_SWAITQUEUE(wait);
7061 /* using __prepare_to_swait definition, as its not exported. This 7056 /* using __prepare_to_swait definition, as its not exported. This
7062 * is same as `wait_for_completion()` except for the manualReset. 7057 * is same as `wait_for_completion()` except for the manualReset.
@@ -7064,15 +7059,6 @@ gckOS_WaitSignal(
7064 wait.task = current; 7059 wait.task = current;
7065 if (list_empty(&wait.task_list)) 7060 if (list_empty(&wait.task_list))
7066 list_add(&wait.task_list, &signal->obj.wait.task_list); 7061 list_add(&wait.task_list, &signal->obj.wait.task_list);
7067#else
7068 DECLARE_WAITQUEUE(wait, current);
7069 wait.flags |= WQ_FLAG_EXCLUSIVE;
7070#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
7071 __add_wait_queue_entry_tail(&signal->obj.wait, &wait);
7072#else
7073 __add_wait_queue_tail(&signal->obj.wait, &wait);
7074#endif
7075#endif
7076 7062
7077 while (gcvTRUE) 7063 while (gcvTRUE)
7078 { 7064 {
@@ -7085,19 +7071,11 @@ gckOS_WaitSignal(
7085 7071
7086 __set_current_state(TASK_INTERRUPTIBLE); 7072 __set_current_state(TASK_INTERRUPTIBLE);
7087 7073
7088#if gcdRT_KERNEL
7089 raw_spin_unlock_irq(&signal->obj.wait.lock); 7074 raw_spin_unlock_irq(&signal->obj.wait.lock);
7090#else
7091 spin_unlock_irq(&signal->obj.wait.lock);
7092#endif
7093 7075
7094 timeout = schedule_timeout(timeout); 7076 timeout = schedule_timeout(timeout);
7095 7077
7096#if gcdRT_KERNEL
7097 raw_spin_lock_irq(&signal->obj.wait.lock); 7078 raw_spin_lock_irq(&signal->obj.wait.lock);
7098#else
7099 spin_lock_irq(&signal->obj.wait.lock);
7100#endif
7101 7079
7102 if (signal->obj.done) 7080 if (signal->obj.done)
7103 { 7081 {
@@ -7117,21 +7095,13 @@ gckOS_WaitSignal(
7117 } 7095 }
7118 } 7096 }
7119 7097
7120#if gcdRT_KERNEL
7121 /* using __finish_swait definition, as its not exported */ 7098 /* using __finish_swait definition, as its not exported */
7122 __set_current_state(TASK_RUNNING); 7099 __set_current_state(TASK_RUNNING);
7123 if (!list_empty(&wait.task_list)) 7100 if (!list_empty(&wait.task_list))
7124 list_del_init(&wait.task_list); 7101 list_del_init(&wait.task_list);
7125#else
7126 __remove_wait_queue(&signal->obj.wait, &wait);
7127#endif
7128 } 7102 }
7129 7103
7130#if gcdRT_KERNEL
7131 raw_spin_unlock_irq(&signal->obj.wait.lock); 7104 raw_spin_unlock_irq(&signal->obj.wait.lock);
7132#else
7133 spin_unlock_irq(&signal->obj.wait.lock);
7134#endif
7135OnError: 7105OnError:
7136 /* Return status. */ 7106 /* Return status. */
7137 gcmkFOOTER_ARG("Signal=0x%X status=%d", Signal, status); 7107 gcmkFOOTER_ARG("Signal=0x%X status=%d", Signal, status);