SOURCES: kernel-desktop-preempt-rt.patch - up to rt5
sparky
sparky at pld-linux.org
Fri Jun 30 23:22:10 CEST 2006
Author: sparky Date: Fri Jun 30 21:22:09 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- up to rt5
---- Files affected:
SOURCES:
kernel-desktop-preempt-rt.patch (1.13 -> 1.14)
---- Diffs:
================================================================
Index: SOURCES/kernel-desktop-preempt-rt.patch
diff -u SOURCES/kernel-desktop-preempt-rt.patch:1.13 SOURCES/kernel-desktop-preempt-rt.patch:1.14
--- SOURCES/kernel-desktop-preempt-rt.patch:1.13 Thu Jun 29 17:28:15 2006
+++ SOURCES/kernel-desktop-preempt-rt.patch Fri Jun 30 23:22:04 2006
@@ -1403,6 +1403,254 @@
#include "../../../../lib/inflate.c"
#ifndef STANDALONE_DEBUG
+Index: linux/arch/arm/common/dmabounce.c
+===================================================================
+--- linux.orig/arch/arm/common/dmabounce.c
++++ linux/arch/arm/common/dmabounce.c
+@@ -77,6 +77,8 @@ struct dmabounce_device_info {
+ #endif
+ struct dmabounce_pool small;
+ struct dmabounce_pool large;
++
++ rwlock_t lock;
+ };
+
+ static LIST_HEAD(dmabounce_devs);
+@@ -116,6 +118,7 @@ alloc_safe_buffer(struct dmabounce_devic
+ struct safe_buffer *buf;
+ struct dmabounce_pool *pool;
+ struct device *dev = device_info->dev;
++ unsigned long flags;
+
+ dev_dbg(dev, "%s(ptr=%p, size=%d, dir=%d)\n",
+ __func__, ptr, size, dir);
+@@ -163,8 +166,12 @@ alloc_safe_buffer(struct dmabounce_devic
+ print_alloc_stats(device_info);
+ #endif
+
++ write_lock_irqsave(&device_info->lock, flags);
++
+ list_add(&buf->node, &device_info->safe_buffers);
+
++ write_unlock_irqrestore(&device_info->lock, flags);
++
+ return buf;
+ }
+
+@@ -172,22 +179,32 @@ alloc_safe_buffer(struct dmabounce_devic
+ static inline struct safe_buffer *
+ find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr)
+ {
+- struct safe_buffer *b;
++ struct safe_buffer *b = NULL;
++ unsigned long flags;
++
++ read_lock_irqsave(&device_info->lock, flags);
+
+ list_for_each_entry(b, &device_info->safe_buffers, node)
+ if (b->safe_dma_addr == safe_dma_addr)
+- return b;
++ break;
+
+- return NULL;
++ read_unlock_irqrestore(&device_info->lock, flags);
++ return b;
+ }
+
+ static inline void
+ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *buf)
+ {
++ unsigned long flags;
++
+ dev_dbg(device_info->dev, "%s(buf=%p)\n", __func__, buf);
+
++ write_lock_irqsave(&device_info->lock, flags);
++
+ list_del(&buf->node);
+
++ write_unlock_irqrestore(&device_info->lock, flags);
++
+ if (buf->pool)
+ dma_pool_free(buf->pool->pool, buf->safe, buf->safe_dma_addr);
+ else
+@@ -396,7 +413,6 @@ dma_addr_t
+ dma_map_single(struct device *dev, void *ptr, size_t size,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+ dma_addr_t dma_addr;
+
+ dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
+@@ -404,12 +420,8 @@ dma_map_single(struct device *dev, void
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ dma_addr = map_single(dev, ptr, size, dir);
+
+- local_irq_restore(flags);
+-
+ return dma_addr;
+ }
+
+@@ -424,25 +436,18 @@ void
+ dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+-
+ dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
+ __func__, (void *) dma_addr, size, dir);
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ unmap_single(dev, dma_addr, size, dir);
+-
+- local_irq_restore(flags);
+ }
+
+ int
+ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+ int i;
+
+ dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n",
+@@ -450,8 +455,6 @@ dma_map_sg(struct device *dev, struct sc
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ for (i = 0; i < nents; i++, sg++) {
+ struct page *page = sg->page;
+ unsigned int offset = sg->offset;
+@@ -462,8 +465,6 @@ dma_map_sg(struct device *dev, struct sc
+ map_single(dev, ptr, length, dir);
+ }
+
+- local_irq_restore(flags);
+-
+ return nents;
+ }
+
+@@ -471,7 +472,6 @@ void
+ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+ int i;
+
+ dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n",
+@@ -479,55 +479,38 @@ dma_unmap_sg(struct device *dev, struct
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ for (i = 0; i < nents; i++, sg++) {
+ dma_addr_t dma_addr = sg->dma_address;
+ unsigned int length = sg->length;
+
+ unmap_single(dev, dma_addr, length, dir);
+ }
+-
+- local_irq_restore(flags);
+ }
+
+ void
+ dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+-
+ dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
+ __func__, (void *) dma_addr, size, dir);
+
+- local_irq_save(flags);
+-
+ sync_single(dev, dma_addr, size, dir);
+-
+- local_irq_restore(flags);
+ }
+
+ void
+ dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+-
+ dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n",
+ __func__, (void *) dma_addr, size, dir);
+
+- local_irq_save(flags);
+-
+ sync_single(dev, dma_addr, size, dir);
+-
+- local_irq_restore(flags);
+ }
+
+ void
+ dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+ int i;
+
+ dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n",
+@@ -535,23 +518,18 @@ dma_sync_sg_for_cpu(struct device *dev,
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ for (i = 0; i < nents; i++, sg++) {
+ dma_addr_t dma_addr = sg->dma_address;
+ unsigned int length = sg->length;
+
+ sync_single(dev, dma_addr, length, dir);
+ }
+-
+- local_irq_restore(flags);
+ }
+
+ void
+ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
+ enum dma_data_direction dir)
+ {
+- unsigned long flags;
+ int i;
+
+ dev_dbg(dev, "%s(sg=%p,nents=%d,dir=%x)\n",
+@@ -559,16 +537,12 @@ dma_sync_sg_for_device(struct device *de
+
+ BUG_ON(dir == DMA_NONE);
+
+- local_irq_save(flags);
+-
+ for (i = 0; i < nents; i++, sg++) {
+ dma_addr_t dma_addr = sg->dma_address;
+ unsigned int length = sg->length;
+
+ sync_single(dev, dma_addr, length, dir);
+ }
+-
+- local_irq_restore(flags);
+ }
+
+ static int
+@@ -622,6 +596,7 @@ dmabounce_register_dev(struct device *de
+
+ device_info->dev = dev;
+ INIT_LIST_HEAD(&device_info->safe_buffers);
++ rwlock_init(&device_info->lock);
+
+ #ifdef STATS
+ device_info->total_allocs = 0;
Index: linux/arch/arm/common/gic.c
===================================================================
--- linux.orig/arch/arm/common/gic.c
@@ -12066,29 +12314,26 @@
select HW_HAS_PCI
select IRQ_CPU
select IRQ_CPU_RM7K
-@@ -797,12 +798,21 @@ source "arch/mips/cobalt/Kconfig"
+@@ -797,6 +798,7 @@ source "arch/mips/cobalt/Kconfig"
endmenu
-+source "kernel/Kconfig.preempt"
+
config RWSEM_GENERIC_SPINLOCK
bool
-+ depends on PREEMPT_RT
default y
-
+@@ -804,6 +806,10 @@ config RWSEM_GENERIC_SPINLOCK
config RWSEM_XCHGADD_ALGORITHM
bool
-+ depends on !PREEMPT_RT
-+
+
+config ASM_SEMAPHORES
+ bool
-+# depends on !PREEMPT_RT
+ default y
-
++
config GENERIC_FIND_NEXT_BIT
bool
-@@ -849,6 +859,9 @@ config DMA_NEED_PCI_MAP_STATE
+ default y
+@@ -849,6 +855,9 @@ config DMA_NEED_PCI_MAP_STATE
config OWN_DMA
bool
@@ -12098,7 +12343,7 @@
config EARLY_PRINTK
bool
-@@ -1580,6 +1593,11 @@ config GENERIC_IRQ_PROBE
+@@ -1580,6 +1589,11 @@ config GENERIC_IRQ_PROBE
bool
default y
@@ -12110,14 +12355,24 @@
#
# - Highmem only makes sense for the 32-bit kernel.
# - The current highmem code will only work properly on physically indexed
-@@ -1669,10 +1687,6 @@ config MIPS_INSANE_LARGE
-
- endmenu
+@@ -1667,12 +1681,17 @@ config MIPS_INSANE_LARGE
+ This will result in additional memory usage, so it is not
+ recommended for normal users.
--config RWSEM_GENERIC_SPINLOCK
-- bool
-- default y
+-endmenu
-
+-config RWSEM_GENERIC_SPINLOCK
++config GENERIC_TIME
+ bool
+ default y
+
++source "kernel/time/Kconfig"
++
++config CPU_SPEED
++ int "CPU speed used for clocksource/clockevent calculations"
++ default 600
++endmenu
++
source "init/Kconfig"
menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)"
@@ -12385,7 +12640,7 @@
#else
.macro preempt_stop
- local_irq_disable
-+ mips_raw_local_irq_disable
++ raw_local_irq_disable
.endm
#define resume_kernel restore_all
#endif
@@ -12394,7 +12649,7 @@
resume_userspace:
- local_irq_disable # make sure we dont miss an
-+ mips_raw_local_irq_disable # make sure we dont miss an
++ raw_local_irq_disable # make sure we dont miss an
# interrupt setting need_resched
# between sampling and return
LONG_L a2, TI_FLAGS($28) # current->work
@@ -12403,22 +12658,32 @@
#ifdef CONFIG_PREEMPT
resume_kernel:
- local_irq_disable
-+ mips_local_irq_disable
++ raw_local_irq_disable
+ lw t0, kernel_preemption
+ beqz t0, restore_all
lw t0, TI_PRE_COUNT($28)
bnez t0, restore_all
need_resched:
-@@ -69,7 +71,7 @@ FEXPORT(ret_from_fork)
+@@ -61,7 +63,9 @@ need_resched:
+ LONG_L t0, PT_STATUS(sp) # Interrupts off?
+ andi t0, 1
+ beqz t0, restore_all
++ raw_local_irq_disable
+ jal preempt_schedule_irq
++ sw zero, TI_PRE_COUNT($28)
+ b need_resched
+ #endif
+
+@@ -69,7 +73,7 @@ FEXPORT(ret_from_fork)
jal schedule_tail # a0 = task_t *prev
FEXPORT(syscall_exit)
- local_irq_disable # make sure need_resched and
-+ mips_raw_local_irq_disable # make sure need_resched and
++ raw_local_irq_disable # make sure need_resched and
# signals dont change between
# sampling and return
LONG_L a2, TI_FLAGS($28) # current->work
-@@ -119,19 +121,21 @@ FEXPORT(restore_partial) # restore part
+@@ -119,19 +123,21 @@ FEXPORT(restore_partial) # restore part
.set at
work_pending:
@@ -12427,11 +12692,11 @@
+ andi t0, a2, (_TIF_NEED_RESCHED|_TIF_NEED_RESCHED_DELAYED)
beqz t0, work_notifysig
work_resched:
-+ mips_raw_local_irq_enable t0
++ raw_local_irq_enable t0
jal schedule
- local_irq_disable # make sure need_resched and
-+ mips_raw_local_irq_disable # make sure need_resched and
++ raw_local_irq_disable # make sure need_resched and
# signals dont change between
# sampling and return
LONG_L a2, TI_FLAGS($28)
@@ -12443,12 +12708,12 @@
bnez t0, work_resched
work_notifysig: # deal with pending signals and
-@@ -147,7 +151,7 @@ syscall_exit_work:
+@@ -147,7 +153,7 @@ syscall_exit_work:
li t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
and t0, a2 # a2 is preloaded with TI_FLAGS
beqz t0, work_pending # trace bit set?
- local_irq_enable # could let do_syscall_trace()
-+ mips_raw_local_irq_enable # could let do_syscall_trace()
++ raw_local_irq_enable # could let do_syscall_trace()
# call schedule() instead
move a0, sp
li a1, 1
@@ -12483,21 +12748,6 @@
}
setup_irq(2, &irq2);
-Index: linux/arch/mips/kernel/init_task.c
-===================================================================
---- linux.orig/arch/mips/kernel/init_task.c
-+++ linux/arch/mips/kernel/init_task.c
-@@ -9,8 +9,8 @@
- #include <asm/uaccess.h>
- #include <asm/pgtable.h>
-
--static struct fs_struct init_fs = INIT_FS;
--static struct files_struct init_files = INIT_FILES;
-+static struct fs_struct init_fs = INIT_FS(init_fs);
-+static struct files_struct init_files = INIT_FILES(init_files);
- static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
- static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
- struct mm_struct init_mm = INIT_MM(init_mm);
Index: linux/arch/mips/kernel/irq-msc01.c
===================================================================
--- linux.orig/arch/mips/kernel/irq-msc01.c
@@ -12628,12 +12878,8 @@
===================================================================
--- linux.orig/arch/mips/kernel/process.c
+++ linux/arch/mips/kernel/process.c
-@@ -53,17 +53,19 @@ extern void smtc_idle_loop_hook(void);
- */
- ATTRIB_NORET void cpu_idle(void)
+@@ -55,16 +55,18 @@ ATTRIB_NORET void cpu_idle(void)
{
-+ local_irq_enable();
-+
/* endless idle loop with no priority at all */
while (1) {
- while (!need_resched()) {
@@ -12646,11 +12892,14 @@
}
- preempt_enable_no_resched();
- schedule();
++ local_irq_disable();
+ __preempt_enable_no_resched();
+ __schedule();
preempt_disable();
++ local_irq_enable();
}
}
+
Index: linux/arch/mips/kernel/scall32-o32.S
===================================================================
--- linux.orig/arch/mips/kernel/scall32-o32.S
@@ -12660,10 +12909,49 @@
o32_syscall_exit:
- local_irq_disable # make sure need_resched and
-+ mips_raw_local_irq_disable # make sure need_resched and
++ raw_local_irq_disable # make sure need_resched and
# signals dont change between
# sampling and return
lw a2, TI_FLAGS($28) # current->work
+Index: linux/arch/mips/kernel/scall64-64.S
+===================================================================
+--- linux.orig/arch/mips/kernel/scall64-64.S
++++ linux/arch/mips/kernel/scall64-64.S
+@@ -71,7 +71,7 @@ NESTED(handle_sys64, PT_SIZE, sp)
+ 1: sd v0, PT_R2(sp) # result
+
+ n64_syscall_exit:
+- local_irq_disable # make sure need_resched and
++ raw_local_irq_disable # make sure need_resched and
+ # signals dont change between
+ # sampling and return
+ LONG_L a2, TI_FLAGS($28) # current->work
+Index: linux/arch/mips/kernel/scall64-n32.S
+===================================================================
+--- linux.orig/arch/mips/kernel/scall64-n32.S
++++ linux/arch/mips/kernel/scall64-n32.S
+@@ -68,7 +68,7 @@ NESTED(handle_sysn32, PT_SIZE, sp)
+ sd v0, PT_R0(sp) # set flag for syscall restarting
+ 1: sd v0, PT_R2(sp) # result
+
+- local_irq_disable # make sure need_resched and
++ raw_local_irq_disable # make sure need_resched and
+ # signals dont change between
+ # sampling and return
+ LONG_L a2, TI_FLAGS($28) # current->work
+Index: linux/arch/mips/kernel/scall64-o32.S
+===================================================================
+--- linux.orig/arch/mips/kernel/scall64-o32.S
++++ linux/arch/mips/kernel/scall64-o32.S
+@@ -97,7 +97,7 @@ NESTED(handle_sys, PT_SIZE, sp)
+ 1: sd v0, PT_R2(sp) # result
+
+ o32_syscall_exit:
+- local_irq_disable # make need_resched and
++ raw_local_irq_disable # make need_resched and
+ # signals dont change between
+ # sampling and return
+ LONG_L a2, TI_FLAGS($28)
Index: linux/arch/mips/kernel/semaphore.c
===================================================================
--- linux.orig/arch/mips/kernel/semaphore.c
@@ -12725,12 +13013,18 @@
{
int retval = 0;
struct task_struct *tsk = current;
-@@ -165,4 +165,4 @@ int __sched __down_interruptible(struct
+@@ -165,4 +165,10 @@ int __sched __down_interruptible(struct
return retval;
}
-EXPORT_SYMBOL(__down_interruptible);
+EXPORT_SYMBOL(__compat_down_interruptible);
++
++int fastcall compat_sem_is_locked(struct compat_semaphore *sem)
++{
++ return (int) atomic_read(&sem->count) < 0;
++}
++EXPORT_SYMBOL(compat_sem_is_locked);
Index: linux/arch/mips/kernel/signal.c
===================================================================
--- linux.orig/arch/mips/kernel/signal.c
@@ -12852,55 +13146,171 @@
===================================================================
--- linux.orig/arch/mips/kernel/time.c
+++ linux/arch/mips/kernel/time.c
-@@ -12,6 +12,7 @@
+@@ -10,8 +10,14 @@
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
++ *
++ * This implementation of High Res Timers uses two timers. One is the system
++ * timer. The second is used for the high res timers. The high res timers
++ * require the CPU to have count/compare registers. The mips_set_next_event()
++ * function schedules the next high res timer interrupt.
*/
#include <linux/config.h>
+#include <linux/clocksource.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
-@@ -50,7 +51,7 @@
+@@ -24,6 +30,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
++#include <linux/clockchips.h>
+
+ #include <asm/bootinfo.h>
+ #include <asm/cache.h>
+@@ -50,7 +57,27 @@
*/
extern volatile unsigned long wall_jiffies;
-DEFINE_SPINLOCK(rtc_lock);
++/* any missed timer interrupts */
++int missed_timer_count;
++
+DEFINE_RAW_SPINLOCK(rtc_lock);
++
++#ifdef CONFIG_HIGH_RES_TIMERS
++static void mips_set_next_event(unsigned long evt);
++static void mips_set_mode(int mode, void *priv);
++
++static struct clock_event lapic_clockevent = {
++ .name = "mips clockevent interface",
++ .capabilities = CLOCK_CAP_NEXTEVT | CLOCK_CAP_PROFILE |
++ CLOCK_HAS_IRQHANDLER
++#ifdef CONFIG_SMP
++ | CLOCK_CAP_UPDATE
++#endif
++ ,
++ .shift = 32,
++ .set_next_event = mips_set_next_event,
++};
++#endif
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/kernel-desktop-preempt-rt.patch?r1=1.13&r2=1.14&f=u
More information about the pld-cvs-commit
mailing list