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