Module: xenomai-2.4
Branch: master
Commit: c4c3c82791951df998ac4dc463f79a76884577b6
URL:    
http://git.xenomai.org/?p=xenomai-2.4.git;a=commit;h=c4c3c82791951df998ac4dc463f79a76884577b6

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Oct  4 13:22:10 2009 +0200

x86: upgrade I-pipe support to 2.6.30.8-x86-2.4-06

---

 ...patch => adeos-ipipe-2.6.30.8-x86-2.4-06.patch} |  146 ++++++++++++--------
 1 files changed, 88 insertions(+), 58 deletions(-)

diff --git a/ksrc/arch/x86/patches/adeos-ipipe-2.6.30-x86-2.4-05.patch 
b/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch
similarity index 98%
rename from ksrc/arch/x86/patches/adeos-ipipe-2.6.30-x86-2.4-05.patch
rename to ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch
index 377294f..b2ab1d8 100644
--- a/ksrc/arch/x86/patches/adeos-ipipe-2.6.30-x86-2.4-05.patch
+++ b/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch
@@ -67,7 +67,7 @@ index 65551c9..12776bf 100644
  KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
  
 diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
-index 42f2f83..9aa50d2 100644
+index 9b2c049..655142e 100644
 --- a/arch/x86/include/asm/apic.h
 +++ b/arch/x86/include/asm/apic.h
 @@ -393,7 +393,13 @@ static inline u32 safe_apic_wait_icr_idle(void)
@@ -125,7 +125,7 @@ index c2e6bed..7405507 100644
  
  BUILD_INTERRUPT(generic_interrupt, GENERIC_INTERRUPT_VECTOR)
 diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
-index b762ea4..c31b386 100644
+index b762ea4..159613e 100644
 --- a/arch/x86/include/asm/hw_irq.h
 +++ b/arch/x86/include/asm/hw_irq.h
 @@ -32,6 +32,13 @@ extern void error_interrupt(void);
@@ -150,6 +150,14 @@ index b762ea4..c31b386 100644
  #ifdef CONFIG_SMP
  extern void smp_reschedule_interrupt(struct pt_regs *);
  extern void smp_call_function_interrupt(struct pt_regs *);
+@@ -88,6 +96,7 @@ extern void smp_invalidate_interrupt(struct pt_regs *);
+ #else
+ extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *);
+ #endif
++extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
+ #endif
+ 
+ extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void);
 diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
 index 71c9e51..aab5873 100644
 --- a/arch/x86/include/asm/i387.h
@@ -207,7 +215,7 @@ index 0b72282..6574056 100644
  /*
 diff --git a/arch/x86/include/asm/ipipe.h b/arch/x86/include/asm/ipipe.h
 new file mode 100644
-index 0000000..56ca2bd
+index 0000000..017417c
 --- /dev/null
 +++ b/arch/x86/include/asm/ipipe.h
 @@ -0,0 +1,156 @@
@@ -238,10 +246,10 @@ index 0000000..56ca2bd
 +#ifdef CONFIG_IPIPE
 +
 +#ifndef IPIPE_ARCH_STRING
-+#define IPIPE_ARCH_STRING     "2.4-05"
++#define IPIPE_ARCH_STRING     "2.4-06"
 +#define IPIPE_MAJOR_NUMBER    2
 +#define IPIPE_MINOR_NUMBER    4
-+#define IPIPE_PATCH_NUMBER    5
++#define IPIPE_PATCH_NUMBER    6
 +#endif
 +
 +DECLARE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
@@ -1075,7 +1083,7 @@ index 3cbd79b..79a5ea1 100644
  /*
   * Local APIC timer IRQ vector is on a different priority level,
 diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h
-index 2bdab21..bcd2f5f 100644
+index c6ccbe7..71ede94 100644
 --- a/arch/x86/include/asm/irqflags.h
 +++ b/arch/x86/include/asm/irqflags.h
 @@ -4,6 +4,10 @@
@@ -1089,7 +1097,7 @@ index 2bdab21..bcd2f5f 100644
  /*
   * Interrupt control:
   */
-@@ -12,35 +16,59 @@ static inline unsigned long native_save_fl(void)
+@@ -12,6 +16,10 @@ static inline unsigned long native_save_fl(void)
  {
        unsigned long flags;
  
@@ -1097,9 +1105,11 @@ index 2bdab21..bcd2f5f 100644
 +      flags = (!__ipipe_test_root()) << 9;
 +      barrier();
 +#else
-       asm volatile("# __raw_save_flags\n\t"
-                    "pushf ; pop %0"
-                    : "=g" (flags)
+       /*
+        * Note: this needs to be "=r" not "=rm", because we have the
+        * stack offset from what gcc expects at the time the "pop" is
+@@ -23,30 +31,50 @@ static inline unsigned long native_save_fl(void)
+                    : "=r" (flags)
                     : /* no input */
                     : "memory");
 +#endif
@@ -1149,7 +1159,7 @@ index 2bdab21..bcd2f5f 100644
        asm volatile("sti; hlt": : :"memory");
  }
  
-@@ -66,6 +94,71 @@ static inline void raw_local_irq_restore(unsigned long 
flags)
+@@ -72,6 +100,71 @@ static inline void raw_local_irq_restore(unsigned long 
flags)
        native_restore_fl(flags);
  }
  
@@ -1221,7 +1231,7 @@ index 2bdab21..bcd2f5f 100644
  static inline void raw_local_irq_disable(void)
  {
        native_irq_disable();
-@@ -99,16 +192,38 @@ static inline void halt(void)
+@@ -105,16 +198,38 @@ static inline void halt(void)
   */
  static inline unsigned long __raw_local_irq_save(void)
  {
@@ -1262,7 +1272,7 @@ index 2bdab21..bcd2f5f 100644
  
  #ifdef CONFIG_X86_64
  #define SWAPGS        swapgs
-@@ -151,8 +266,10 @@ static inline unsigned long __raw_local_irq_save(void)
+@@ -157,8 +272,10 @@ static inline unsigned long __raw_local_irq_save(void)
  #define raw_local_save_flags(flags)                           \
        do { (flags) = __raw_local_save_flags(); } while (0)
  
@@ -1335,10 +1345,10 @@ index c45a0a5..f326e5b 100644
  
  extern atomic_t nmi_active;
 diff --git a/arch/x86/include/asm/processor.h 
b/arch/x86/include/asm/processor.h
-index c2cceae..90fe438 100644
+index 68e7172..491404c 100644
 --- a/arch/x86/include/asm/processor.h
 +++ b/arch/x86/include/asm/processor.h
-@@ -426,6 +426,7 @@ struct thread_struct {
+@@ -436,6 +436,7 @@ struct thread_struct {
        unsigned short          ds;
        unsigned short          fsindex;
        unsigned short          gsindex;
@@ -1347,7 +1357,7 @@ index c2cceae..90fe438 100644
        unsigned long           ip;
        unsigned long           fs;
 diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h
-index 643c59b..eb5b882 100644
+index 5bd119b..9c1be69 100644
 --- a/arch/x86/include/asm/system.h
 +++ b/arch/x86/include/asm/system.h
 @@ -126,8 +126,10 @@ do {                                                      
                \
@@ -1547,7 +1557,7 @@ index 306e5e8..a9b89cd 100644
  
  static void flat_send_IPI_mask(const struct cpumask *cpumask, int vector)
 diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index 30da617..a2c5284 100644
+index edfc25c..cf587ff 100644
 --- a/arch/x86/kernel/apic/io_apic.c
 +++ b/arch/x86/kernel/apic/io_apic.c
 @@ -72,8 +72,12 @@
@@ -1806,7 +1816,7 @@ index 30da617..a2c5284 100644
   * This function currently is only a helper for the i386 smp boot process 
where
   * we need to reprogram the ioredtbls to cater for the cpus which have come 
online
 diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c
-index dbf5445..ce36fb1 100644
+index 6ef00ba..22ad255 100644
 --- a/arch/x86/kernel/apic/ipi.c
 +++ b/arch/x86/kernel/apic/ipi.c
 @@ -29,12 +29,12 @@ void default_send_IPI_mask_sequence_phys(const struct 
cpumask *mask, int vector)
@@ -1874,9 +1884,9 @@ index dbf5445..ce36fb1 100644
  }
  
  #ifdef CONFIG_X86_32
-@@ -106,10 +106,10 @@ void default_send_IPI_mask_logical(const struct cpumask 
*cpumask, int vector)
-       unsigned long mask = cpumask_bits(cpumask)[0];
-       unsigned long flags;
+@@ -109,10 +109,10 @@ void default_send_IPI_mask_logical(const struct cpumask 
*cpumask, int vector)
+       if (WARN_ONCE(!mask, "empty IPI mask"))
+               return;
  
 -      local_irq_save(flags);
 +      local_irq_save_hw(flags);
@@ -3129,10 +3139,10 @@ index df89102..cfb29a2 100644
  handle_real_irq:
 diff --git a/arch/x86/kernel/ipipe.c b/arch/x86/kernel/ipipe.c
 new file mode 100644
-index 0000000..9b9d084
+index 0000000..dcf9764
 --- /dev/null
 +++ b/arch/x86/kernel/ipipe.c
-@@ -0,0 +1,957 @@
+@@ -0,0 +1,964 @@
 +/*   -*- linux-c -*-
 + *   linux/arch/x86/kernel/ipipe.c
 + *
@@ -3408,6 +3418,13 @@ index 0000000..9b9d084
 +                           NULL,
 +                           &__ipipe_ack_apic,
 +                           IPIPE_STDROOT_MASK);
++
++      ipipe_virtualize_irq(ipipe_root_domain,
++                           ipipe_apic_vector_irq(IRQ_MOVE_CLEANUP_VECTOR),
++                           
(ipipe_irq_handler_t)&smp_irq_move_cleanup_interrupt,
++                           NULL,
++                           &__ipipe_ack_apic,
++                           IPIPE_STDROOT_MASK);
 +#else
 +      (void)vector;
 +#endif        /* CONFIG_SMP */
@@ -4414,7 +4431,7 @@ index a1d2883..a84914a 100644
  EXPORT_SYMBOL_GPL(math_state_restore);
  
 diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
-index d7ac84e..b0105b9 100644
+index 6a17769..d78abc4 100644
 --- a/arch/x86/kernel/vm86_32.c
 +++ b/arch/x86/kernel/vm86_32.c
 @@ -148,12 +148,14 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs 
*regs)
@@ -4432,7 +4449,7 @@ index d7ac84e..b0105b9 100644
  
        ret = KVM86->regs32;
  
-@@ -325,12 +327,14 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, 
struct task_struct *tsk
+@@ -324,12 +326,14 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, 
struct task_struct *tsk
        tsk->thread.saved_fs = info->regs32->fs;
        tsk->thread.saved_gs = get_user_gs(info->regs32);
  
@@ -4645,7 +4662,7 @@ index a03b727..6d8facc 100644
 +}
 +#endif /* CONFIG_IPIPE */
 diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
-index 821e970..9294287 100644
+index c814e14..40feb73 100644
 --- a/arch/x86/mm/tlb.c
 +++ b/arch/x86/mm/tlb.c
 @@ -57,10 +57,14 @@ static union smp_flush_state 
flush_state[NUM_INVALIDATE_TLB_VECTORS];
@@ -4663,16 +4680,16 @@ index 821e970..9294287 100644
  }
  EXPORT_SYMBOL_GPL(leave_mm);
  
-@@ -193,6 +197,9 @@ static void flush_tlb_others_ipi(const struct cpumask 
*cpumask,
-       apic->send_IPI_mask(to_cpumask(f->flush_cpumask),
-                     INVALIDATE_TLB_VECTOR_START + sender);
+@@ -191,6 +195,9 @@ static void flush_tlb_others_ipi(const struct cpumask 
*cpumask,
+               apic->send_IPI_mask(to_cpumask(f->flush_cpumask),
+                             INVALIDATE_TLB_VECTOR_START + sender);
  
 +#ifdef CONFIG_IPIPE
-+      WARN_ON_ONCE(irqs_disabled_hw()); 
++              WARN_ON_ONCE(irqs_disabled_hw()); 
 +#endif
-       while (!cpumask_empty(to_cpumask(f->flush_cpumask)))
-               cpu_relax();
- 
+               while (!cpumask_empty(to_cpumask(f->flush_cpumask)))
+                       cpu_relax();
+       }
 diff --git a/drivers/pci/htirq.c b/drivers/pci/htirq.c
 index 6808d83..4166013 100644
 --- a/drivers/pci/htirq.c
@@ -4765,7 +4782,7 @@ index 76da125..21d717c 100644
  
        mmdrop(active_mm);
 diff --git a/fs/exec.c b/fs/exec.c
-index 895823d..ec10cab 100644
+index 42414e5..4d1fc09 100644
 --- a/fs/exec.c
 +++ b/fs/exec.c
 @@ -698,6 +698,7 @@ static int exec_mmap(struct mm_struct *mm)
@@ -4824,7 +4841,7 @@ index b2ba2fc..ed01ab9 100644
  }
  
 diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h
-index d7d50d7..5d5b6ba 100644
+index aa00800..886c45f 100644
 --- a/include/asm-generic/percpu.h
 +++ b/include/asm-generic/percpu.h
 @@ -56,6 +56,20 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
@@ -6070,7 +6087,7 @@ index 883cd44..37dcbb0 100644
  
  #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
 diff --git a/include/linux/mm.h b/include/linux/mm.h
-index bff1f0d..5451a53 100644
+index 0c21af6..097ac12 100644
 --- a/include/linux/mm.h
 +++ b/include/linux/mm.h
 @@ -106,6 +106,8 @@ extern unsigned int kobjsize(const void *objp);
@@ -6110,7 +6127,7 @@ index 72b1a10..80553be 100644
  
  #define inc_preempt_count() add_preempt_count(1)
 diff --git a/include/linux/sched.h b/include/linux/sched.h
-index b4c38bc..6282707 100644
+index 03c6c36..610fc20 100644
 --- a/include/linux/sched.h
 +++ b/include/linux/sched.h
 @@ -59,6 +59,7 @@ struct sched_param {
@@ -6509,7 +6526,7 @@ index 7be4d38..01db31a 100644
          Append an extra string to the end of your kernel version.
          This will show up when you type uname, for example.
 diff --git a/init/main.c b/init/main.c
-index d721dad..6b492a7 100644
+index 303903c..a1c5265 100644
 --- a/init/main.c
 +++ b/init/main.c
 @@ -554,7 +554,7 @@ asmlinkage void __init start_kernel(void)
@@ -6533,7 +6550,7 @@ index d721dad..6b492a7 100644
        profile_init();
        if (!irqs_disabled())
                printk(KERN_CRIT "start_kernel(): bug: interrupts were "
-@@ -779,6 +784,7 @@ static void __init do_basic_setup(void)
+@@ -780,6 +785,7 @@ static void __init do_basic_setup(void)
        usermodehelper_init();
        driver_init();
        init_irq_proc();
@@ -6566,7 +6583,7 @@ index abf9cf3..887651d 100644
        exit_files(tsk);
        exit_fs(tsk);
 diff --git a/kernel/fork.c b/kernel/fork.c
-index 875ffbd..899defb 100644
+index f4be1ee..1ac44c0 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
 @@ -488,6 +488,7 @@ void mmput(struct mm_struct *mm)
@@ -6577,7 +6594,7 @@ index 875ffbd..899defb 100644
                set_mm_exe_file(mm, NULL);
                if (!list_empty(&mm->mmlist)) {
                        spin_lock(&mmlist_lock);
-@@ -892,7 +893,7 @@ static void copy_flags(unsigned long clone_flags, struct 
task_struct *p)
+@@ -879,7 +880,7 @@ static void copy_flags(unsigned long clone_flags, struct 
task_struct *p)
  {
        unsigned long new_flags = p->flags;
  
@@ -6586,7 +6603,7 @@ index 875ffbd..899defb 100644
        new_flags |= PF_FORKNOEXEC;
        new_flags |= PF_STARTING;
        p->flags = new_flags;
-@@ -1266,6 +1267,9 @@ static struct task_struct *copy_process(unsigned long 
clone_flags,
+@@ -1255,6 +1256,9 @@ static struct task_struct *copy_process(unsigned long 
clone_flags,
        write_unlock_irq(&tasklist_lock);
        proc_fork_connector(p);
        cgroup_post_fork(p);
@@ -6596,7 +6613,7 @@ index 875ffbd..899defb 100644
        return p;
  
  bad_fork_free_graph:
-@@ -1666,11 +1670,14 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
+@@ -1656,11 +1660,14 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
                }
  
                if (new_mm) {
@@ -10495,10 +10512,10 @@ index 5052b54..bfaf8ec 100644
  /* cpu currently holding logbuf_lock */
  static volatile unsigned int printk_cpu = UINT_MAX;
 diff --git a/kernel/sched.c b/kernel/sched.c
-index 26efa47..450d5cd 100644
+index 0d3d47f..dd38aac 100644
 --- a/kernel/sched.c
 +++ b/kernel/sched.c
-@@ -2368,7 +2368,7 @@ static int try_to_wake_up(struct task_struct *p, 
unsigned int state, int sync)
+@@ -2369,7 +2369,7 @@ static int try_to_wake_up(struct task_struct *p, 
unsigned int state, int sync)
        rq = task_rq_lock(p, &flags);
        update_rq_clock(rq);
        old_state = p->state;
@@ -10507,7 +10524,7 @@ index 26efa47..450d5cd 100644
                goto out;
  
        if (p->se.on_rq)
-@@ -2745,13 +2745,15 @@ asmlinkage void schedule_tail(struct task_struct *prev)
+@@ -2746,13 +2746,15 @@ asmlinkage void schedule_tail(struct task_struct *prev)
  #endif
        if (current->set_child_tid)
                put_user(task_pid_vnr(current), current->set_child_tid);
@@ -10524,7 +10541,7 @@ index 26efa47..450d5cd 100644
  context_switch(struct rq *rq, struct task_struct *prev,
               struct task_struct *next)
  {
-@@ -2793,12 +2795,23 @@ context_switch(struct rq *rq, struct task_struct *prev,
+@@ -2794,12 +2796,23 @@ context_switch(struct rq *rq, struct task_struct *prev,
        switch_to(prev, next, prev);
  
        barrier();
@@ -10548,7 +10565,7 @@ index 26efa47..450d5cd 100644
  }
  
  /*
-@@ -4861,6 +4874,7 @@ notrace unsigned long get_parent_ip(unsigned long addr)
+@@ -4862,6 +4875,7 @@ notrace unsigned long get_parent_ip(unsigned long addr)
  
  void __kprobes add_preempt_count(int val)
  {
@@ -10556,7 +10573,7 @@ index 26efa47..450d5cd 100644
  #ifdef CONFIG_DEBUG_PREEMPT
        /*
         * Underflow?
-@@ -4883,6 +4897,7 @@ EXPORT_SYMBOL(add_preempt_count);
+@@ -4884,6 +4898,7 @@ EXPORT_SYMBOL(add_preempt_count);
  
  void __kprobes sub_preempt_count(int val)
  {
@@ -10564,7 +10581,7 @@ index 26efa47..450d5cd 100644
  #ifdef CONFIG_DEBUG_PREEMPT
        /*
         * Underflow?
-@@ -4931,6 +4946,7 @@ static noinline void __schedule_bug(struct task_struct 
*prev)
+@@ -4932,6 +4947,7 @@ static noinline void __schedule_bug(struct task_struct 
*prev)
   */
  static inline void schedule_debug(struct task_struct *prev)
  {
@@ -10572,7 +10589,7 @@ index 26efa47..450d5cd 100644
        /*
         * Test if we are atomic. Since do_exit() needs to call into
         * schedule() atomically, we ignore that path for now.
-@@ -5007,7 +5023,7 @@ pick_next_task(struct rq *rq)
+@@ -5008,7 +5024,7 @@ pick_next_task(struct rq *rq)
  /*
   * schedule() is the main scheduler function.
   */
@@ -10581,7 +10598,7 @@ index 26efa47..450d5cd 100644
  {
        struct task_struct *prev, *next;
        unsigned long *switch_count;
-@@ -5019,6 +5035,9 @@ asmlinkage void __sched __schedule(void)
+@@ -5020,6 +5036,9 @@ asmlinkage void __sched __schedule(void)
        rcu_qsctr_inc(cpu);
        prev = rq->curr;
        switch_count = &prev->nivcsw;
@@ -10591,7 +10608,7 @@ index 26efa47..450d5cd 100644
  
        release_kernel_lock(prev);
  need_resched_nonpreemptible:
-@@ -5058,25 +5077,31 @@ need_resched_nonpreemptible:
+@@ -5059,25 +5078,31 @@ need_resched_nonpreemptible:
                rq->curr = next;
                ++*switch_count;
  
@@ -10626,7 +10643,7 @@ index 26efa47..450d5cd 100644
        preempt_enable_no_resched();
        if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
                goto need_resched;
-@@ -5906,6 +5931,7 @@ recheck:
+@@ -5907,6 +5932,7 @@ recheck:
  
        oldprio = p->prio;
        __setscheduler(rq, p, policy, param->sched_priority);
@@ -10634,7 +10651,7 @@ index 26efa47..450d5cd 100644
  
        if (running)
                p->sched_class->set_curr_task(rq);
-@@ -6253,6 +6279,7 @@ static void __cond_resched(void)
+@@ -6254,6 +6280,7 @@ static void __cond_resched(void)
  #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
        __might_sleep(__FILE__, __LINE__);
  #endif
@@ -10642,7 +10659,7 @@ index 26efa47..450d5cd 100644
        /*
         * The BKS might be reacquired before we have dropped
         * PREEMPT_ACTIVE, which could trigger a second
-@@ -10239,3 +10266,60 @@ struct cgroup_subsys cpuacct_subsys = {
+@@ -10240,3 +10267,60 @@ struct cgroup_subsys cpuacct_subsys = {
        .subsys_id = cpuacct_subsys_id,
  };
  #endif        /* CONFIG_CGROUP_CPUACCT */
@@ -10704,7 +10721,7 @@ index 26efa47..450d5cd 100644
 +
 +#endif /* CONFIG_IPIPE */
 diff --git a/kernel/signal.c b/kernel/signal.c
-index d803473..d37655f 100644
+index 2dfc931..8640f4e 100644
 --- a/kernel/signal.c
 +++ b/kernel/signal.c
 @@ -515,6 +515,7 @@ void signal_wake_up(struct task_struct *t, int resume)
@@ -10866,7 +10883,7 @@ index f1ed080..aa45f71 100644
        /* ftrace_dyn_arch_init places the return code in addr */
        if (addr)
 diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
-index 6cdcf38..96d98a6 100644
+index 3be4b7c..c970fab 100644
 --- a/lib/Kconfig.debug
 +++ b/lib/Kconfig.debug
 @@ -128,6 +128,8 @@ config DEBUG_SECTION_MISMATCH
@@ -11308,6 +11325,19 @@ index cbe9e05..b9d0ed0 100644
        current->mm->def_flags = def_flags;
        if (flags == MCL_FUTURE)
                goto out;
+diff --git a/mm/slub.c b/mm/slub.c
+index 0b95a6c..94b4041 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -2490,6 +2490,8 @@ static inline int kmem_cache_close(struct kmem_cache *s)
+  */
+ void kmem_cache_destroy(struct kmem_cache *s)
+ {
++      if (s->flags & SLAB_DESTROY_BY_RCU)
++              rcu_barrier();
+       down_write(&slub_lock);
+       s->refcount--;
+       if (!s->refcount) {
 diff --git a/mm/vmalloc.c b/mm/vmalloc.c
 index 083716e..ca13739 100644
 --- a/mm/vmalloc.c


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to