* [PATCH 0/2] fixes for 33-rt4 found while testing on powerpc
@ 2010-03-02 21:51 Paul Gortmaker
2010-03-02 21:51 ` [PATCH 1/2] powerpc: replace kmap_atomic with kmap in pte_offset_map Paul Gortmaker
0 siblings, 1 reply; 3+ messages in thread
From: Paul Gortmaker @ 2010-03-02 21:51 UTC (permalink / raw)
To: linux-rt-users
These two commits were originally done by Kevin to solve problems on a
2.6.31 based RT tree. They carry forward onto 33-rt4 as-is, and I've
done a quick sanity test on an sbc8641d board (powerpc SMP dual core).
Paul.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] powerpc: replace kmap_atomic with kmap in pte_offset_map
2010-03-02 21:51 [PATCH 0/2] fixes for 33-rt4 found while testing on powerpc Paul Gortmaker
@ 2010-03-02 21:51 ` Paul Gortmaker
2010-03-02 21:51 ` [PATCH 2/2] rt: reserve TASK_STOPPED state when blocking on a spin lock Paul Gortmaker
0 siblings, 1 reply; 3+ messages in thread
From: Paul Gortmaker @ 2010-03-02 21:51 UTC (permalink / raw)
To: linux-rt-users
From: Kevin Hao <kexin.hao@windriver.com>
The pte_offset_map/pte_offset_map_nested use kmap_atomic to get the
virtual address for the pte table, but kmap_atomic will disable preempt.
Hence there will be call trace if we acquire a spin lock after invoking
pte_offset_map/pte_offset_map_nested in preempt-rt. To fix it, I've
replaced kmap_atomic with kmap in these macros.
Signed-off-by: Kevin Hao <kexin.hao@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
arch/powerpc/include/asm/pgtable-ppc32.h | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/include/asm/pgtable-ppc32.h b/arch/powerpc/include/asm/pgtable-ppc32.h
index 55646ad..a838099 100644
--- a/arch/powerpc/include/asm/pgtable-ppc32.h
+++ b/arch/powerpc/include/asm/pgtable-ppc32.h
@@ -307,6 +307,17 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
#define pte_offset_kernel(dir, addr) \
((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
+#ifdef CONFIG_PREEMPT_RT
+#define pte_offset_map(dir, addr) \
+ ((pte_t *) kmap(pmd_page(*(dir))) + pte_index(addr))
+#define pte_offset_map_nested(dir, addr) \
+ ((pte_t *) kmap(pmd_page(*(dir))) + pte_index(addr))
+
+#define pte_unmap(pte) \
+ kunmap((struct page *)_ALIGN_DOWN((unsigned int)pte, PAGE_SIZE))
+#define pte_unmap_nested(pte) \
+ kunmap((struct page *)_ALIGN_DOWN((unsigned int)pte, PAGE_SIZE))
+#else
#define pte_offset_map(dir, addr) \
((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE0) + pte_index(addr))
#define pte_offset_map_nested(dir, addr) \
@@ -314,6 +325,7 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
+#endif
/*
* Encode and decode a swap entry.
--
1.6.5.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] rt: reserve TASK_STOPPED state when blocking on a spin lock
2010-03-02 21:51 ` [PATCH 1/2] powerpc: replace kmap_atomic with kmap in pte_offset_map Paul Gortmaker
@ 2010-03-02 21:51 ` Paul Gortmaker
0 siblings, 0 replies; 3+ messages in thread
From: Paul Gortmaker @ 2010-03-02 21:51 UTC (permalink / raw)
To: linux-rt-users
From: Kevin Hao <kexin.hao@windriver.com>
When a process handles a SIGSTOP signal, it will set the state to
TASK_STOPPED, acquire tasklist_lock and notifiy the parent of the
status change. But in the rt kernel the process state will change
to TASK_UNINTERRUPTIBLE if it blocks on the tasklist_lock. So if
we send a SIGCONT signal to this process at this time, the SIGCONT
signal just does nothing because this process is not in TASK_STOPPED
state. Of course this is not what we wanted. Preserving the
TASK_STOPPED state when blocking on a spin lock can fix this bug.
Signed-off-by: Kevin Hao <kexin.hao@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
kernel/rtmutex.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
index 16bfa1c..23dd443 100644
--- a/kernel/rtmutex.c
+++ b/kernel/rtmutex.c
@@ -757,8 +757,9 @@ rt_set_current_blocked_state(unsigned long saved_state)
* saved_state. Now we can ignore further wakeups as we will
* return in state running from our "spin" sleep.
*/
- if (saved_state == TASK_INTERRUPTIBLE)
- block_state = TASK_INTERRUPTIBLE;
+ if (saved_state == TASK_INTERRUPTIBLE ||
+ saved_state == TASK_STOPPED)
+ block_state = saved_state;
else
block_state = TASK_UNINTERRUPTIBLE;
--
1.6.5.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-03-02 21:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-02 21:51 [PATCH 0/2] fixes for 33-rt4 found while testing on powerpc Paul Gortmaker
2010-03-02 21:51 ` [PATCH 1/2] powerpc: replace kmap_atomic with kmap in pte_offset_map Paul Gortmaker
2010-03-02 21:51 ` [PATCH 2/2] rt: reserve TASK_STOPPED state when blocking on a spin lock Paul Gortmaker
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).