diff options
author | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-05-09 16:44:29 -0400 |
---|---|---|
committer | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-05-09 16:44:29 -0400 |
commit | a0615764712672e852ee44aabfaaaa0911f4a7c3 (patch) | |
tree | 12300d760b5ed76d56689edab3c8417cb8abddeb /arch | |
parent | d1f5f5e7f672ff07fbe2d5051c7360f8a89f7ddc (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.c | 46 |
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 */); | |||
58 | void __sys_pi_down(struct pi_semaphore * sem) | 58 | void __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 | ||
73 | asmlinkage long sys_pi_down(pi_sema_id sem_id) | 75 | asmlinkage 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 | */ |
97 | void __sys_pi_up(struct pi_semaphore * sem) | 99 | void __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 | ||
111 | asmlinkage long sys_pi_up(pi_sema_id sem_id) | 115 | asmlinkage long sys_pi_up(pi_sema_id sem_id) |