diff options
author | Gowtham Tammana | 2021-03-01 12:23:01 -0600 |
---|---|---|
committer | Gowtham Tammana | 2021-04-27 15:44:34 -0500 |
commit | e2a10f31e255a65ec30a6e10b890e77d7e9cb107 (patch) | |
tree | ac4b72f264f3047dbb69ac1d66f34a5b42068e7f | |
parent | 24757464ebd18da63f1bc03df12f9ce61961b996 (diff) | |
download | ti-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-x | src/Kbuild | 8 | ||||
-rwxr-xr-x | src/hal/os/linux/kernel/gc_hal_kernel_os.c | 30 |
2 files changed, 0 insertions, 38 deletions
@@ -244,14 +244,6 @@ else | |||
244 | EXTRA_CFLAGS += -DgcdENABLE_OUTER_CACHE_PATCH=0 | 244 | EXTRA_CFLAGS += -DgcdENABLE_OUTER_CACHE_PATCH=0 |
245 | endif | 245 | endif |
246 | 246 | ||
247 | ifneq ($(CONFIG_PREEMPT_RT_BASE),) | ||
248 | EXTRA_CFLAGS += -DgcdRT_KERNEL=1 | ||
249 | else ifneq ($(CONFIG_PREEMPT_RT),) | ||
250 | EXTRA_CFLAGS += -DgcdRT_KERNEL=1 | ||
251 | else | ||
252 | EXTRA_CFLAGS += -DgcdRT_KERNEL=0 | ||
253 | endif | ||
254 | |||
255 | ifeq ($(USE_BANK_ALIGNMENT), 1) | 247 | ifeq ($(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 | ||
7135 | OnError: | 7105 | OnError: |
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); |