summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-drivers/ati-drivers/files/15.9-preempt.patch')
-rw-r--r--x11-drivers/ati-drivers/files/15.9-preempt.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/x11-drivers/ati-drivers/files/15.9-preempt.patch b/x11-drivers/ati-drivers/files/15.9-preempt.patch
new file mode 100644
index 0000000..c659883
--- /dev/null
+++ b/x11-drivers/ati-drivers/files/15.9-preempt.patch
@@ -0,0 +1,103 @@
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c 2015-08-30 17:36:02.000000000 -0400
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c 2015-08-30 17:39:36.000000000 -0400
+@@ -21,6 +21,8 @@
+ !!! since it requires changes to linux/init/main.c.
+ #endif /* !MODULE */
+
++#include <linux/preempt.h>
++
+ // ============================================================
+ #include <linux/version.h>
+
+@@ -4997,7 +4999,9 @@ static unsigned int kas_spin_unlock(kas_
+ unsigned long ATI_API_CALL KAS_GetExecutionLevel(void)
+ {
+ unsigned long ret;
++ preempt_disable();
+ ret = kas_GetExecutionLevel();
++ preempt_enable();
+ return ret;
+ }
+
+@@ -5022,8 +5026,10 @@ unsigned int ATI_API_CALL KAS_Ih_Execute
+ KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X, 0x%08X\n", ih_routine, ih_context);
+
+ //Prevent simultaneous entry on some SMP systems.
++ preempt_disable();
+ if (test_and_set_bit(0, (void *)&(kasContext.in_interrupts[smp_processor_id()])))
+ {
++ preempt_enable();
+ KCL_DEBUG1(FN_FIREGL_KAS, "The processor is handling the interrupt\n");
+ return IRQ_NONE;
+ }
+@@ -5036,9 +5042,9 @@ unsigned int ATI_API_CALL KAS_Ih_Execute
+
+ kasSetExecutionLevel(orig_level);
+ spin_unlock(&kasContext.lock_ih);
+-
+ clear_bit(0, (void *)&(kasContext.in_interrupts[smp_processor_id()]));
+ KCL_DEBUG5(FN_FIREGL_KAS,"%d\n", ret);
++ preempt_enable();
+
+ return ret;
+ }
+@@ -5256,6 +5262,7 @@ unsigned int ATI_API_CALL KAS_Spinlock_A
+
+ KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X\n", hSpinLock);
+
++ preempt_disable();
+ spin_lock_info.routine_type = spinlock_obj->routine_type;
+ spin_lock_info.plock = &(spinlock_obj->lock);
+
+@@ -5263,6 +5270,7 @@ unsigned int ATI_API_CALL KAS_Spinlock_A
+
+ spinlock_obj->acquire_type = spin_lock_info.acquire_type;
+ spinlock_obj->flags = spin_lock_info.flags;
++ preempt_enable();
+
+ KCL_DEBUG5(FN_FIREGL_KAS,"%d\n", ret);
+ return ret;
+@@ -6034,6 +6042,8 @@ unsigned int ATI_API_CALL KAS_Interlocke
+
+ KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X, 0x%08X, 0x%08X\n", hListHead, hListEntry, phPrevEntry);
+
++ preempt_disable();
++
+ /* Protect the operation with spinlock */
+ spin_lock_info.routine_type = listhead_obj->routine_type;
+ spin_lock_info.plock = &(listhead_obj->lock);
+@@ -6041,6 +6051,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+ if (!kas_spin_lock(&spin_lock_info))
+ {
+ KCL_DEBUG_ERROR("Unable to grab list spinlock\n");
++ preempt_enable();
+ return 0; /* No spinlock - no operation */
+ }
+
+@@ -6065,6 +6076,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+ spin_unlock_info.flags = spin_lock_info.flags;
+
+ ret = kas_spin_unlock(&spin_unlock_info);
++ preempt_enable();
+ KCL_DEBUG5(FN_FIREGL_KAS,"%d", ret);
+ return ret;
+ }
+@@ -6153,8 +6165,10 @@ unsigned int ATI_API_CALL KAS_Interlocke
+ spin_lock_info.routine_type = listhead_obj->routine_type;
+ spin_lock_info.plock = &(listhead_obj->lock);
+
++ preempt_disable();
+ if (!kas_spin_lock(&spin_lock_info))
+ {
++ preempt_enable();
+ KCL_DEBUG_ERROR("Unable to grab list spinlock");
+ return 0; /* No spinlock - no operation */
+ }
+@@ -6178,6 +6192,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+ spin_unlock_info.flags = spin_lock_info.flags;
+
+ ret = kas_spin_unlock(&spin_unlock_info);
++ preempt_enable();
+ KCL_DEBUG5(FN_FIREGL_KAS,"%d", ret);
+ return ret;
+ }