aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-05-09 16:44:29 -0400
committerJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-05-09 16:44:29 -0400
commita0615764712672e852ee44aabfaaaa0911f4a7c3 (patch)
tree12300d760b5ed76d56689edab3c8417cb8abddeb /arch
parentd1f5f5e7f672ff07fbe2d5051c7360f8a89f7ddc (diff)
Various changes that I don't want to lose, but the code does not work.
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/pi_sem_syscalls.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/arch/i386/kernel/pi_sem_syscalls.c b/arch/i386/kernel/pi_sem_syscalls.c
index 273eec16d3..1b85abae27 100644
--- a/arch/i386/kernel/pi_sem_syscalls.c
+++ b/arch/i386/kernel/pi_sem_syscalls.c
@@ -58,16 +58,18 @@ fastcall void __pi_up_wakeup(void /* special register calling convention */);
58void __sys_pi_down(struct pi_semaphore * sem) 58void __sys_pi_down(struct pi_semaphore * sem)
59{ 59{
60 might_sleep(); 60 might_sleep();
61 __asm__ __volatile__( 61// __asm__ __volatile__(
62 "# atomic down operation\n\t" 62// "# atomic down operation\n\t"
63 LOCK_PREFIX "decl %0\n\t" /* --sem->count */ 63// LOCK_PREFIX "decl %0\n\t" /* --sem->count */
64 "jns 2f\n" 64// "jns 2f\n"
65 "\tlea %0,%%eax\n\t" 65// "\tlea %0,%%eax\n\t"
66 "call __pi_down_failed\n" 66// "call __pi_down_failed\n"
67 "2:" 67// "2:"
68 :"+m" (sem->count) 68// :"+m" (sem->count)
69 : 69// :
70 :"memory","ax"); 70// :"memory","ax");
71 if (atomic_dec_return(&sem->count) < 0)
72 __pi_down(sem);
71} 73}
72 74
73asmlinkage long sys_pi_down(pi_sema_id sem_id) 75asmlinkage long sys_pi_down(pi_sema_id sem_id)
@@ -82,8 +84,8 @@ asmlinkage long sys_pi_down(pi_sema_id sem_id)
82 /* Update inherited priority if required. */ 84 /* Update inherited priority if required. */
83 spin_lock_irqsave(&pi_sems[sem_id].wait.lock, flags); 85 spin_lock_irqsave(&pi_sems[sem_id].wait.lock, flags);
84 if (!pi_sems[sem_id].holder) { 86 if (!pi_sems[sem_id].holder) {
85 pi_sems[sem_id].holder = current; 87 pi_sems[sem_id].holder = current;
86 curr_sched_plugin->inherit_priority(&pi_sems[sem_id], NULL); 88// curr_sched_plugin->inherit_priority(&pi_sems[sem_id], NULL);
87 } 89 }
88 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags); 90 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags);
89 return 0; 91 return 0;
@@ -96,16 +98,18 @@ asmlinkage long sys_pi_down(pi_sema_id sem_id)
96 */ 98 */
97void __sys_pi_up(struct pi_semaphore * sem) 99void __sys_pi_up(struct pi_semaphore * sem)
98{ 100{
99 __asm__ __volatile__( 101// __asm__ __volatile__(
100 "# atomic up operation\n\t" 102// "# atomic up operation\n\t"
101 LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ 103// LOCK_PREFIX "incl %0\n\t" /* ++sem->count */
102/* "jg 1f\n\t" *** removed, always call wakeup *** */ 104/* "jg 1f\n\t" *** removed, always call wakeup *** */
103 "lea %0,%%eax\n\t" 105// "lea %0,%%eax\n\t"
104 "call __pi_up_wakeup\n" 106// "call __pi_up_wakeup\n"
105 "1:" 107// "1:"
106 :"+m" (sem->count) 108// :"+m" (sem->count)
107 : 109// :
108 :"memory","ax"); 110// :"memory","ax");
111 atomic_inc(&sem->count);
112 __pi_up(sem);
109} 113}
110 114
111asmlinkage long sys_pi_up(pi_sema_id sem_id) 115asmlinkage long sys_pi_up(pi_sema_id sem_id)