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

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to