From 6baf5be73e09c7927239ac86da52318260b1c708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Wed, 24 Oct 2012 14:29:13 +0000 Subject: [PATCH] [rt] reenable rt featureset svn path=/dists/trunk/linux/; revision=19458 --- debian/changelog | 3 + debian/config/amd64/defines | 2 +- debian/config/defines | 2 +- debian/config/i386/defines | 2 +- ...-skip-nr_running-sanity-check-in-wor.patch | 35 - ...lab-lockdep-Annotate-all-slab-caches.patch | 134 --- .../0004-tick-Add-tick-skew-boot-option.patch | 103 --- ...gle-worker-accounting-from-rq-3Elock.patch | 263 ------ ...ps-enable-interrupts-in-signal.patch.patch | 24 - ...able-interrupts-in-signal-code.patch.patch | 24 - .../0012-timekeeping-Split-xtime_lock.patch | 522 ----------- ...et-Use-disable_irq_nosync-in-8139too.patch | 27 - ...rq-Disable-random-call-on-preempt-rt.patch | 29 - ...o_drain-to-use-the-right-array-cache.patch | 53 -- .../rt/0102-panic-disable-random-on-rt.patch | 25 - ...-ipv4-route-use-locks-on-up-rt.patch.patch | 23 - ...ue-avoid-the-lock-in-cpu-dying.patch.patch | 65 -- .../rt/0109-timers-preempt-rt-support.patch | 47 - .../0110-timers-fix-timer-hotplug-on-rt.patch | 51 -- ...ing-debug_activate-aid-Was-Re-ANNOUN.patch | 38 - ...ert-reader_lock-from-raw_spin_lock-i.patch | 434 --------- ...bstitution-for-synchronize_rcu_bh-on.patch | 39 - .../all/rt/0191-lglocks-rt.patch.patch | 125 --- ...-workqueue-Fix-cpuhotplug-trainwreck.patch | 807 ----------------- ...-workqueue-Fix-PF_THREAD_BOUND-abuse.patch | 103 --- ...ueue-Use-get_cpu_light-in-flush_gcwq.patch | 82 -- .../all/rt/0211-hotplug-stuff.patch.patch | 28 - .../all/rt/0212-debugobjects-rt.patch.patch | 37 - .../0216-console-make-rt-friendly.patch.patch | 85 -- .../0217-fix-printk-flush-of-messages.patch | 55 -- .../0218-power-use-generic-rwsem-on-rt.patch | 26 - .../rt/0230-scsi-fcoe-rt-aware.patch.patch | 113 --- .../rt/0235-timer-Fix-hotplug-for-rt.patch | 73 -- ...sible-lockup-when-taking-pi_lock-in-.patch | 45 - ...heck-for-irqs-disabled-before-grabbi.patch | 35 - ...t-Use-non-rt-for_each_cpu-in-rt-code.patch | 109 --- ...8-mips-remove-smp-reserve-lock.patch.patch | 44 - ...ude-bug.h-in-spinlock_rt.h-to-satisf.patch | 29 - ...Mark-low-level-irq-handlers-NO_THREA.patch | 40 - .../all/rt/0256-Linux-3.4.4-rt13-REBASE.patch | 16 - ...RT.patch => acpi-use-local-irq-nort.patch} | 12 +- ...atch => arch-use-pagefault-disabled.patch} | 318 ++++--- ...ng.patch => arm-allow-irq-threading.patch} | 15 +- ...ve-irq-handler-when-clock-is-unused.patch} | 27 +- ...tclib-default-to-tclib-timer-for-rt.patch} | 16 +- ...tch => arm-convert-boot-lock-to-raw.patch} | 82 +- ....patch => arm-disable-highmem-on-rt.patch} | 13 +- ... => arm-mark-pmu-interupt-no-thread.patch} | 13 +- ...=> arm-omap-make-wakeupgen_lock-raw.patch} | 27 +- ...=> ata-disable-interrupts-if-non-rt.patch} | 18 +- ...-shorten-interrupt-disabled-regions.patch} | 23 +- ....patch => bug-rt-dependend-variants.patch} | 33 +- ...ource-tclib-allow-higher-clockrates.patch} | 39 +- ...patch => cond-resched-lock-rt-tweak.patch} | 11 +- ...ch.patch => cond-resched-softirq-rt.patch} | 25 +- ...plug-lock-a-sleeping-spinlock-on-rt.patch} | 27 +- .../all/rt/cpu-rt-rework-cpu-down.patch | 550 +++++++++++ ...ants.patch.patch => cpu-rt-variants.patch} | 13 +- ...h => cpumask-disable-offstack-on-rt.patch} | 23 +- ...make-core-static-and-init-scru-early.patch | 51 ++ .../features/all/rt/debugobjects-rt.patch | 25 + ...-rt-aware.patch => dm-make-rt-aware.patch} | 13 +- .../drivers-net-8139-disable-irq-nosync.patch | 27 + ...t-at91-make-mdio-protection-rt-safe.patch} | 24 +- ...vers-net-ehea-mark-rx-irq-no-thread.patch} | 15 +- ... => drivers-net-fix-livelock-issues.patch} | 91 +- ...> drivers-net-gianfar-make-rt-aware.patch} | 20 +- ...s-net-tulip-add-missing-pci-disable.patch} | 15 +- ...ivers-net-vortex-fix-locking-issues.patch} | 18 +- ...ndom-reduce-preempt-disabled-region.patch} | 21 +- ...ll-flush_to_ldisc-when-the-irq-is-t.patch} | 24 +- ...ivers-serial-cleanup-locking-for-rt.patch} | 16 +- ...h => drivers-tty-fix-omap-lock-crap.patch} | 15 +- ...h.patch => early-printk-consolidate.patch} | 194 ++-- ...ch.patch => epoll-use-get-cpu-light.patch} | 15 +- ...ix-up.patch.patch => filemap-fix-up.patch} | 13 +- ....patch => fix-rt-int3-x86_32-3.2-rt.patch} | 25 +- ....patch.patch => fs-block-rt-support.patch} | 23 +- ...ache-use-cpu-chill-in-trylock-loops.patch} | 47 +- ...jbd-pull-plug-when-waiting-for-space.patch | 31 + ...tch => fs-jbd-replace-bh_state-lock.patch} | 28 +- ...atch => fs-namespace-preemption-fix.patch} | 14 +- ...=> fs-ntfs-disable-interrupt-non-rt.patch} | 14 +- ... fs-replace-bh_uptodate_lock-for-rt.patch} | 45 +- ...ace-crap.patch.patch => ftrace-crap.patch} | 33 +- ...h => ftrace-migrate-disable-tracing.patch} | 43 +- ...s-out.patch => futex-requeue-pi-fix.patch} | 38 +- ...> generic-cmpxchg-use-raw-local-irq.patch} | 18 +- ...irq-add-default-mask-cmdline-option.patch} | 21 +- ...tch => genirq-disable-irqpoll-on-rt.patch} | 14 +- ...tch.patch => genirq-force-threading.patch} | 27 +- ...or-rt.patch => genirq-nodebug-shirq.patch} | 15 +- ..._count-as-oul-to-kill-build-warning.patch} | 15 +- ...all-cpu_unplug_begin-a-little-early.patch} | 13 +- ...ch => hotplug-light-get-online-cpus.patch} | 37 +- ...nc_unplug-no-27-5cn-27-in-task-name.patch} | 13 +- ...atch => hotplug-use-migrate-disable.patch} | 15 +- ...timer-add-missing-debug_activate-aid.patch | 49 + ...ch => hrtimer-fix-reprogram-madness.patch} | 17 +- ...imer-callback-changes-for-preempt-r.patch} | 163 ++-- ...=> hrtimers-prepare-full-preemption.patch} | 52 +- ...atdetect.patch.patch => hwlatdetect.patch} | 71 +- ... => ide-use-nort-local-irq-variants.patch} | 86 +- ...infiniband-mellanox-ib-use-nort-irq.patch} | 17 +- ...=> inpt-gameport-use-local-irq-nort.patch} | 16 +- ...ert-i7300_idle_lock-to-raw-spinlock.patch} | 18 +- ...rt-aware.patch => ipc-make-rt-aware.patch} | 28 +- ...ritical-section-to-avoid-a-deadlock.patch} | 46 +- ...=> ipc-sem-rework-semaphore-wakeups.patch} | 23 +- ...rq-processing-in-irq-thread-context.patch} | 60 +- ...bel-rt.patch.patch => jump-label-rt.patch} | 13 +- ...=> kconfig-disable-a-few-options-rt.patch} | 31 +- ...ch.patch => kconfig-preempt-rt-full.patch} | 29 +- ...ound.patch => kgb-serial-hackaround.patch} | 42 +- ...cy-hist.patch.patch => latency-hist.patch} | 243 ++--- .../patches/features/all/rt/lglocks-rt.patch | 168 ++++ ...h.patch => list-add-list-last-entry.patch} | 13 +- ... => local-irq-rt-depending-variants.patch} | 22 +- ...-local-var.patch.patch => local-var.patch} | 11 +- ...patch => local-vars-migrate-disable.patch} | 11 +- ...version.patch.patch => localversion.patch} | 15 +- ...lockdep-no-softirq-accounting-on-rt.patch} | 23 +- ...st-convert-spinlock-to-raw-spinlock.patch} | 19 +- ...rdirq-context-test-for-raw-spinlock.patch} | 16 +- ...patch => locking-various-init-fixes.patch} | 61 +- ...> md-raid5-percpu-handling-rt-aware.patch} | 28 +- ...patch => migrate-disable-rt-variant.patch} | 11 +- ...patch => mips-disable-highmem-on-rt.patch} | 13 +- .../rt/mips-enable-interrupts-in-signal.patch | 21 + ...lab-on-RT.patch => mm-allow-slab-rt.patch} | 16 +- ...atch => mm-cgroup-page-bit-spinlock.patch} | 32 +- ...=> mm-convert-swap-to-percpu-locked.patch} | 26 +- ...re.patch => mm-make-vmstat-rt-aware.patch} | 36 +- ...ix.patch.patch => mm-page-alloc-fix.patch} | 13 +- ...> mm-page-alloc-use-list-last-entry.patch} | 13 +- ...e-alloc-use-local-lock-on-target-cpu.patch | 59 ++ ..._alloc-reduce-lock-sections-further.patch} | 54 +- ...age_alloc-rt-friendly-per-cpu-pages.patch} | 99 +- ...> mm-prepare-pf-disable-discoupling.patch} | 42 +- ...ch => mm-protect-activate-switch-mm.patch} | 23 +- ...mm-by-preempt_-disable-7cenable-_rt.patch} | 26 +- ... => mm-remove-preempt-count-from-pf.patch} | 15 +- ...tch => mm-rt-kmap-atomic-scheduling.patch} | 35 +- ...scatterlist-dont-disable-irqs-on-RT.patch} | 17 +- ...mm-shrink-the-page-frame-to-rt-size.patch} | 34 +- .../rt/mm-slab-fix-potential-deadlock.patch | 122 +++ ...c.patch => mm-slab-more-lock-breaks.patch} | 86 +- ...tch.patch => mm-slab-move-debug-out.patch} | 24 +- ...tch.patch => mm-slab-wrap-functions.patch} | 108 +-- ...tch => mm-vmalloc-use-get-cpu-light.patch} | 21 +- ....patch.patch => mutex-no-spin-on-rt.patch} | 11 +- ...al-irq-disable-alloc-atomic-headache.patch | 49 + ...h.patch => net-flip-lock-dep-thingy.patch} | 15 +- ... => net-netif_rx_ni-migrate-disable.patch} | 13 +- ... net-tx-action-avoid-livelock-on-rt.patch} | 18 +- ...pu_relax.patch => net-use-cpu-chill.patch} | 27 +- ...e-cpu-light-in-ip-send-unicast-reply.patch | 32 + ...tch.patch => net-wireless-warn-nort.patch} | 13 +- ...patch => ntp-make-ntp-lock-raw-sigh.patch} | 27 +- ...ch.patch => of-convert-devtree-lock.patch} | 89 +- ...patch => of-fixup-recursive-locking.patch} | 32 +- ...-atomic.patch => oleg-signal-rt-fix.patch} | 58 +- .../all/rt/panic-disable-random-on-rt.patch | 23 + ...e-rcu-bh-qs-where-safe-from-softirq.patch} | 64 +- ...pci-access-use-__wake_up_all_locked.patch} | 16 +- .../perf-make-swevent-hrtimer-irqsafe.patch | 70 ++ ...perf-move-irq-work-to-softirq-in-rt.patch} | 33 +- ...atch => peter_zijlstra-frob-hrtimer.patch} | 17 +- ...ter_zijlstra-frob-migrate_disable-2.patch} | 75 +- ...peter_zijlstra-frob-migrate_disable.patch} | 25 +- ...ter_zijlstra-frob-pagefault_disable.patch} | 339 ++++--- ...st.patch => peter_zijlstra-frob-rcu.patch} | 39 +- ...tch => peterz-raw_pagefault_disable.patch} | 28 +- .../all/rt/peterz-srcu-crypto-chain.patch | 196 ++++ ...tch.patch => pid-h-include-atomic-h.patch} | 11 +- ...ing-sysrq.patch.patch => ping-sysrq.patch} | 48 +- ...d-wakeups-when-no-timers-are-active.patch} | 16 +- ....patch => posix-timers-no-broadcast.patch} | 16 +- ...ix-timers-shorten-cpu-timers-thread.patch} | 15 +- ...imers-thread-posix-cpu-timers-on-rt.patch} | 76 +- ...atch => power-disable-highmem-on-rt.patch} | 15 +- .../rt/power-use-generic-rwsem-on-rt.patch | 25 + ...pc-mark-low-level-handlers-no-thread.patch | 39 + ...s.patch => preempt-nort-rt-variants.patch} | 12 +- ...7-boot-param-to-help-with-debugging.patch} | 20 +- ...ntk-kill.patch.patch => printk-kill.patch} | 45 +- .../features/all/rt/printk-rt-aware.patch | 103 +++ ....patch.patch => radix-tree-rt-aware.patch} | 29 +- .../all/rt/random-make-it-work-on-rt.patch | 124 +++ ...-break.patch => rcu-fix-build-break.patch} | 32 +- ...tch => rcu-force-preempt-rcu-for-rt.patch} | 13 +- ...erge-rcu-bh-into-rcu-preempt-for-rt.patch} | 103 +-- ...ut.patch.patch => rcu-tiny-merge-bh.patch} | 15 +- .../all/rt/rcu-tiny-solve-rt-mistery.patch | 44 + ...te_disable-race-with-cpu-hotplug-3f.patch} | 13 +- ...-arm-coredump-fails-for-cpu-3e-3d-4.patch} | 13 +- ...ss.patch => relay-fix-timer-madness.patch} | 18 +- ...resource-counters-use-localirq-nort.patch} | 32 +- ...all-printk_tick-in-printk_needs_cpu.patch} | 13 +- ...eractive-to-test-rt_spin_lock-state.patch} | 18 +- ...ement-APIs.patch => rt-add-rt-locks.patch} | 124 ++- ...ch => rt-add-rt-spinlock-to-headers.patch} | 31 +- ...patch => rt-add-rt-to-mutex-headers.patch} | 25 +- .../all/rt/rt-disable-rt-group-sched.patch | 29 + ...ill.patch => rt-introduce-cpu-chill.patch} | 15 +- ...ck.patch.patch => rt-local-irq-lock.patch} | 13 +- ...utex-add-sleeping-spinlocks-support.patch} | 71 +- ...tch.patch => rt-preempt-base-config.patch} | 11 +- ...totype.patch => rt-rcutree-warn-fix.patch} | 29 +- .../all/rt/rt-rw-lockdep-annotations.patch | 121 +++ ...-not-compare-cpu-masks-in-scheduler.patch} | 20 +- ...rate_disable-ignore-bounded-threads.patch} | 24 +- ...ctual-migration-disalbe-to-schedule.patch} | 32 +- ...S_LIMIT.patch => rt-serial-warn-fix.patch} | 20 +- ...cing-show-padding-as-unsigned-short.patch} | 15 +- ...patch => rtmutex-avoid-include-hell.patch} | 11 +- ...h.patch => rtmutex-futex-prepare-rt.patch} | 53 +- ...atch.patch => rtmutex-lock-killable.patch} | 25 +- ...patch.patch => rwsem-add-rt-variant.patch} | 37 +- ...-better-debug-output-for-might-sleep.patch | 76 ++ ...lear-pf-thread-bound-on-fallback-rq.patch} | 15 +- ...d.patch.patch => sched-cond-resched.patch} | 15 +- ...patch.patch => sched-delay-put-task.patch} | 35 +- ... sched-disable-rt-group-sched-on-rt.patch} | 13 +- ...h.patch => sched-disable-ttwu-queue.patch} | 11 +- ...tch.patch => sched-limit-nr-migrate.patch} | 13 +- ...ight-sleep-do-not-account-rcu-depth.patch} | 27 +- ...atch.patch => sched-migrate-disable.patch} | 80 +- ...patch.patch => sched-mmdrop-delayed.patch} | 71 +- ... sched-rt-fix-migrate_enable-thinko.patch} | 30 +- ...atch.patch => sched-rt-mutex-wakeup.patch} | 29 +- ...grate_disable-about-atomic-contexts.patch} | 37 +- ...wu-ensure-success-return-is-correct.patch} | 14 +- .../features/all/rt/scsi-fcoe-rt-aware.patch | 117 +++ ...unction-called-from-invalid-context.patch} | 11 +- ...ch => seqlock-prevent-rt-starvation.patch} | 34 +- ... => seqlock-remove-unused-functions.patch} | 15 +- ...count.patch => seqlock-use-seqcount.patch} | 34 +- debian/patches/features/all/rt/series | 856 ++++++++++++------ ...patch => signal-fix-up-rcu-wreckage.patch} | 15 +- ... signal-revert-ptrace-preempt-magic.patch} | 13 +- ...-tasks-to-cache-one-sigqueue-struct.patch} | 78 +- ...f.patch => signals-do-not-wake-self.patch} | 14 +- ...k.patch.patch => skbufhead-raw-lock.patch} | 45 +- ...ftirq-disable-softirq-stacks-for-rt.patch} | 89 +- ...> softirq-export-in-serving-softirq.patch} | 14 +- ...atch => softirq-fix-unplug-deadlock.patch} | 21 +- ...lock-after-per-cpu-section-is-set-up.patch | 135 +++ ...k.patch.patch => softirq-local-lock.patch} | 71 +- ...fo.patch.patch => softirq-make-fifo.patch} | 19 +- ...rq-make-serving-softirqs-a-task-flag.patch | 78 ++ ...s.patch => softirq-preempt-fix-3-re.patch} | 57 +- ...=> softirq-sanitize-softirq-pending.patch} | 42 +- .../rt/softirq-split-handling-function.patch | 70 ++ .../features/all/rt/softirq-split-locks.patch | 443 +++++++++ ...tch.patch => softirq-split-out-code.patch} | 23 +- ....patch => softirq-thread-do-softirq.patch} | 23 +- ...atch => spinlock-types-separate-raw.patch} | 41 +- ...achine-deal-clever-with-stopper-lock.patch | 60 ++ ...> stomp-machine-mark-stomper-thread.patch} | 23 +- ...tch.patch => stomp-machine-raw-lock.patch} | 31 +- ...vert-stop_machine_run-to-PREEMPT_RT.patch} | 16 +- ...suspend-prevernt-might-sleep-splats.patch} | 51 +- ...ch.patch => sysctl-include-atomic-h.patch} | 11 +- ...entry.patch => sysfs-realtime-entry.patch} | 15 +- ...from-going-into-infinite-spin-in-rt.patch} | 53 +- ... tasklist-lock-fix-section-conflict.patch} | 28 +- .../all/rt/timekeeping-split-xtime-lock.patch | 527 +++++++++++ ...waking-softirqs-from-the-jiffy-tick.patch} | 14 +- ...k.patch => timer-fd-avoid-live-lock.patch} | 13 +- ...-idle-trylock-in-get-next-timer-irq.patch} | 51 +- .../timer.c-fix-build-fail-for-RT_FULL.patch | 45 + ...d-the-base-null-otptimization-on-rt.patch} | 16 +- ...s-mov-printk_tick-to-soft-interrupt.patch} | 16 +- .../all/rt/timers-preempt-rt-support.patch | 58 ++ ... timers-prepare-for-full-preemption.patch} | 36 +- ...for-preempt-off-in-preempt_schedule.patch} | 13 +- ...-rt.patch => tty-use-local-irq-nort.patch} | 18 +- ...ve-preemption-disabling-in-netif_rx.patch} | 17 +- ...ix-mouse-problem-copying-large-data.patch} | 15 +- ...patch => usb-hcd-use-local-irq-nort.patch} | 16 +- ...rs.patch => user-use-local-irq-nort.patch} | 16 +- ...atch => workqueue-use-get-cpu-light.patch} | 13 +- ...pto-reduce-preempt-disabled-regions.patch} | 21 +- ...-f.patch => x86-disable-debug-stack.patch} | 30 +- ...y-WARN_ON.patch => x86-highmem-warn.patch} | 14 +- ...x86-hpet-disable-msi-on-lenovo-w510.patch} | 15 +- ...atch => x86-io-apic-migra-no-unmask.patch} | 14 +- ...kprobes-remove-bogus-preempt-enable.patch} | 13 +- ...=> x86-kvm-require-const-tsc-for-rt.patch} | 15 +- ...imer.patch => x86-mce-timer-hrtimer.patch} | 93 +- .../rt/x86-perf-uncore-deal-with-kfree.patch | 76 ++ ...ch => x86-stackprot-no-random-on-rt.patch} | 14 +- ...h => x86-use-gen-rwsem-spinlocks-rt.patch} | 16 +- debian/patches/series-rt | 853 +++++++++++------ 295 files changed, 8534 insertions(+), 8104 deletions(-) delete mode 100644 debian/patches/features/all/rt/0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch delete mode 100644 debian/patches/features/all/rt/0002-slab-lockdep-Annotate-all-slab-caches.patch delete mode 100644 debian/patches/features/all/rt/0004-tick-Add-tick-skew-boot-option.patch delete mode 100644 debian/patches/features/all/rt/0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch delete mode 100644 debian/patches/features/all/rt/0008-mips-enable-interrupts-in-signal.patch.patch delete mode 100644 debian/patches/features/all/rt/0009-arm-enable-interrupts-in-signal-code.patch.patch delete mode 100644 debian/patches/features/all/rt/0012-timekeeping-Split-xtime_lock.patch delete mode 100644 debian/patches/features/all/rt/0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch delete mode 100644 debian/patches/features/all/rt/0080-genirq-Disable-random-call-on-preempt-rt.patch delete mode 100644 debian/patches/features/all/rt/0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch delete mode 100644 debian/patches/features/all/rt/0102-panic-disable-random-on-rt.patch delete mode 100644 debian/patches/features/all/rt/0106-net-ipv4-route-use-locks-on-up-rt.patch.patch delete mode 100644 debian/patches/features/all/rt/0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch delete mode 100644 debian/patches/features/all/rt/0109-timers-preempt-rt-support.patch delete mode 100644 debian/patches/features/all/rt/0110-timers-fix-timer-hotplug-on-rt.patch delete mode 100644 debian/patches/features/all/rt/0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch delete mode 100644 debian/patches/features/all/rt/0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch delete mode 100644 debian/patches/features/all/rt/0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch delete mode 100644 debian/patches/features/all/rt/0191-lglocks-rt.patch.patch delete mode 100644 debian/patches/features/all/rt/0208-workqueue-Fix-cpuhotplug-trainwreck.patch delete mode 100644 debian/patches/features/all/rt/0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch delete mode 100644 debian/patches/features/all/rt/0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch delete mode 100644 debian/patches/features/all/rt/0211-hotplug-stuff.patch.patch delete mode 100644 debian/patches/features/all/rt/0212-debugobjects-rt.patch.patch delete mode 100644 debian/patches/features/all/rt/0216-console-make-rt-friendly.patch.patch delete mode 100644 debian/patches/features/all/rt/0217-fix-printk-flush-of-messages.patch delete mode 100644 debian/patches/features/all/rt/0218-power-use-generic-rwsem-on-rt.patch delete mode 100644 debian/patches/features/all/rt/0230-scsi-fcoe-rt-aware.patch.patch delete mode 100644 debian/patches/features/all/rt/0235-timer-Fix-hotplug-for-rt.patch delete mode 100644 debian/patches/features/all/rt/0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch delete mode 100644 debian/patches/features/all/rt/0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch delete mode 100644 debian/patches/features/all/rt/0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch delete mode 100644 debian/patches/features/all/rt/0248-mips-remove-smp-reserve-lock.patch.patch delete mode 100644 debian/patches/features/all/rt/0254-spinlock-rt-Include-bug.h-in-spinlock_rt.h-to-satisf.patch delete mode 100644 debian/patches/features/all/rt/0255-Subject-powerpc-Mark-low-level-irq-handlers-NO_THREA.patch delete mode 100644 debian/patches/features/all/rt/0256-Linux-3.4.4-rt13-REBASE.patch rename debian/patches/features/all/rt/{0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch => acpi-use-local-irq-nort.patch} (67%) rename debian/patches/features/all/rt/{0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch => arch-use-pagefault-disabled.patch} (51%) rename debian/patches/features/all/rt/{0017-arm-Allow-forced-irq-threading.patch => arm-allow-irq-threading.patch} (59%) rename debian/patches/features/all/rt/{0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch => arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch} (62%) rename debian/patches/features/all/rt/{0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch => arm-at91-tclib-default-to-tclib-timer-for-rt.patch} (69%) rename debian/patches/features/all/rt/{0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch => arm-convert-boot-lock-to-raw.patch} (68%) rename debian/patches/features/all/rt/{0220-arm-disable-highmem-on-rt.patch.patch => arm-disable-highmem-on-rt.patch} (60%) rename debian/patches/features/all/rt/{0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch => arm-mark-pmu-interupt-no-thread.patch} (61%) rename debian/patches/features/all/rt/{0019-arm-omap-make-wakeupgen_lock-raw.patch.patch => arm-omap-make-wakeupgen_lock-raw.patch} (66%) rename debian/patches/features/all/rt/{0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch => ata-disable-interrupts-if-non-rt.patch} (72%) rename debian/patches/features/all/rt/{0006-block-Shorten-interrupt-disabled-regions.patch => block-shorten-interrupt-disabled-regions.patch} (78%) rename debian/patches/features/all/rt/{0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch => bug-rt-dependend-variants.patch} (52%) rename debian/patches/features/all/rt/{0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch => clocksource-tclib-allow-higher-clockrates.patch} (80%) rename debian/patches/features/all/rt/{0131-cond-resched-lock-rt-tweak.patch.patch => cond-resched-lock-rt-tweak.patch} (65%) rename debian/patches/features/all/rt/{0130-cond-resched-softirq-fix.patch.patch => cond-resched-softirq-rt.patch} (63%) rename debian/patches/features/all/rt/{0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch => cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch} (83%) create mode 100644 debian/patches/features/all/rt/cpu-rt-rework-cpu-down.patch rename debian/patches/features/all/rt/{0089-cpu-rt-variants.patch.patch => cpu-rt-variants.patch} (65%) rename debian/patches/features/all/rt/{0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch => cpumask-disable-offstack-on-rt.patch} (66%) create mode 100644 debian/patches/features/all/rt/crypto-make-core-static-and-init-scru-early.patch create mode 100644 debian/patches/features/all/rt/debugobjects-rt.patch rename debian/patches/features/all/rt/{0232-dm-Make-rt-aware.patch => dm-make-rt-aware.patch} (72%) create mode 100644 debian/patches/features/all/rt/drivers-net-8139-disable-irq-nosync.patch rename debian/patches/features/all/rt/{0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch => drivers-net-at91-make-mdio-protection-rt-safe.patch} (67%) rename debian/patches/features/all/rt/{0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch => drivers-net-ehea-mark-rx-irq-no-thread.patch} (81%) rename debian/patches/features/all/rt/{0083-drivers-net-fix-livelock-issues.patch => drivers-net-fix-livelock-issues.patch} (53%) rename debian/patches/features/all/rt/{0085-drivers-net-gianfar-Make-RT-aware.patch => drivers-net-gianfar-make-rt-aware.patch} (67%) rename debian/patches/features/all/rt/{0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch => drivers-net-tulip-add-missing-pci-disable.patch} (51%) rename debian/patches/features/all/rt/{0084-drivers-net-vortex-fix-locking-issues.patch => drivers-net-vortex-fix-locking-issues.patch} (72%) rename debian/patches/features/all/rt/{0025-drivers-random-Reduce-preempt-disabled-region.patch => drivers-random-reduce-preempt-disabled-region.patch} (64%) rename debian/patches/features/all/rt/{0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch => drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch} (57%) rename debian/patches/features/all/rt/{0192-serial-8250-Clean-up-the-locking-for-rt.patch => drivers-serial-cleanup-locking-for-rt.patch} (65%) rename debian/patches/features/all/rt/{0194-drivers-tty-fix-omap-lock-crap.patch.patch => drivers-tty-fix-omap-lock-crap.patch} (64%) rename debian/patches/features/all/rt/{0057-early-printk-consolidate.patch.patch => early-printk-consolidate.patch} (65%) rename debian/patches/features/all/rt/{0206-epoll.patch.patch => epoll-use-get-cpu-light.patch} (59%) rename debian/patches/features/all/rt/{0036-filemap-fix-up.patch.patch => filemap-fix-up.patch} (62%) rename debian/patches/features/all/rt/{0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch => fix-rt-int3-x86_32-3.2-rt.patch} (78%) rename debian/patches/features/all/rt/{0199-fs-block-rt-support.patch.patch => fs-block-rt-support.patch} (63%) rename debian/patches/features/all/rt/{0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch => fs-dcache-use-cpu-chill-in-trylock-loops.patch} (65%) create mode 100644 debian/patches/features/all/rt/fs-jbd-pull-plug-when-waiting-for-space.patch rename debian/patches/features/all/rt/{0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch => fs-jbd-replace-bh_state-lock.patch} (73%) rename debian/patches/features/all/rt/{0196-fs-namespace-preemption-fix.patch => fs-namespace-preemption-fix.patch} (72%) rename debian/patches/features/all/rt/{0200-fs-ntfs-disable-interrupt-only-on-RT.patch => fs-ntfs-disable-interrupt-non-rt.patch} (86%) rename debian/patches/features/all/rt/{0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch => fs-replace-bh_uptodate_lock-for-rt.patch} (74%) rename debian/patches/features/all/rt/{0155-ftrace-crap.patch.patch => ftrace-crap.patch} (65%) rename debian/patches/features/all/rt/{0144-ftrace-migrate-disable-tracing.patch.patch => ftrace-migrate-disable-tracing.patch} (64%) rename debian/patches/features/all/rt/{0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch => futex-requeue-pi-fix.patch} (79%) rename debian/patches/features/all/rt/{0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch => generic-cmpxchg-use-raw-local-irq.patch} (58%) rename debian/patches/features/all/rt/{0251-genirq-Add-default-affinity-mask-command-line-option.patch => genirq-add-default-mask-cmdline-option.patch} (76%) rename debian/patches/features/all/rt/{0081-genirq-disable-irqpoll-on-rt.patch => genirq-disable-irqpoll-on-rt.patch} (72%) rename debian/patches/features/all/rt/{0082-genirq-force-threading.patch.patch => genirq-force-threading.patch} (57%) rename debian/patches/features/all/rt/{0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch => genirq-nodebug-shirq.patch} (59%) rename debian/patches/features/all/rt/{0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch => harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch} (76%) rename debian/patches/features/all/rt/{0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch => hotplug-call-cpu_unplug_begin-a-little-early.patch} (85%) rename debian/patches/features/all/rt/{0138-hotplug-Lightweight-get-online-cpus.patch => hotplug-light-get-online-cpus.patch} (85%) rename debian/patches/features/all/rt/{0139-hotplug-sync_unplug-No.patch => hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch} (68%) rename debian/patches/features/all/rt/{0142-hotplug-use-migrate-disable.patch.patch => hotplug-use-migrate-disable.patch} (66%) create mode 100644 debian/patches/features/all/rt/hrtimer-add-missing-debug_activate-aid.patch rename debian/patches/features/all/rt/{0119-hrtimer-fix-reprogram-madness.patch.patch => hrtimer-fix-reprogram-madness.patch} (62%) rename debian/patches/features/all/rt/{0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch => hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch} (73%) rename debian/patches/features/all/rt/{0115-hrtimers-prepare-full-preemption.patch => hrtimers-prepare-full-preemption.patch} (77%) rename debian/patches/features/all/rt/{0055-hwlatdetect.patch.patch => hwlatdetect.patch} (96%) rename debian/patches/features/all/rt/{0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch => ide-use-nort-local-irq-variants.patch} (59%) rename debian/patches/features/all/rt/{0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch => infiniband-mellanox-ib-use-nort-irq.patch} (65%) rename debian/patches/features/all/rt/{0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch => inpt-gameport-use-local-irq-nort.patch} (65%) rename debian/patches/features/all/rt/{0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch => intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch} (79%) rename debian/patches/features/all/rt/{0103-ipc-Make-the-ipc-code-rt-aware.patch => ipc-make-rt-aware.patch} (72%) rename debian/patches/features/all/rt/{0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch => ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch} (63%) rename debian/patches/features/all/rt/{0228-ipc-sem-Rework-semaphore-wakeups.patch => ipc-sem-rework-semaphore-wakeups.patch} (74%) rename debian/patches/features/all/rt/{0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch => irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch} (73%) rename debian/patches/features/all/rt/{0213-jump-label-rt.patch.patch => jump-label-rt.patch} (62%) rename debian/patches/features/all/rt/{0252-kconfig-disable-a-few-options-rt.patch.patch => kconfig-disable-a-few-options-rt.patch} (60%) rename debian/patches/features/all/rt/{0253-kconfig-preempt-rt-full.patch.patch => kconfig-preempt-rt-full.patch} (68%) rename debian/patches/features/all/rt/{0225-kgdb-serial-Short-term-workaround.patch => kgb-serial-hackaround.patch} (69%) rename debian/patches/features/all/rt/{0054-latency-hist.patch.patch => latency-hist.patch} (90%) create mode 100644 debian/patches/features/all/rt/lglocks-rt.patch rename debian/patches/features/all/rt/{0042-list-add-list-last-entry.patch.patch => list-add-list-last-entry.patch} (68%) rename debian/patches/features/all/rt/{0062-rt-local_irq_-variants-depending-on-RT-RT.patch => local-irq-rt-depending-variants.patch} (74%) rename debian/patches/features/all/rt/{0087-local-var.patch.patch => local-var.patch} (69%) rename debian/patches/features/all/rt/{0169-local-vars-migrate-disable.patch.patch => local-vars-migrate-disable.patch} (81%) rename debian/patches/features/all/rt/{0056-localversion.patch.patch => localversion.patch} (51%) rename debian/patches/features/all/rt/{0159-lockdep-rt.patch.patch => lockdep-no-softirq-accounting-on-rt.patch} (75%) rename debian/patches/features/all/rt/{0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch => lockdep-selftest-convert-spinlock-to-raw-spinlock.patch} (86%) rename debian/patches/features/all/rt/{0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch => lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch} (88%) rename debian/patches/features/all/rt/{0052-locking-various-init-fixes.patch.patch => locking-various-init-fixes.patch} (56%) rename debian/patches/features/all/rt/{0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch => md-raid5-percpu-handling-rt-aware.patch} (68%) rename debian/patches/features/all/rt/{0146-migrate-disable-rt-variant.patch.patch => migrate-disable-rt-variant.patch} (75%) rename debian/patches/features/all/rt/{0222-mips-disable-highmem-on-rt.patch.patch => mips-disable-highmem-on-rt.patch} (60%) create mode 100644 debian/patches/features/all/rt/mips-enable-interrupts-in-signal.patch rename debian/patches/features/all/rt/{0100-mm-Allow-only-slab-on-RT.patch => mm-allow-slab-rt.patch} (69%) rename debian/patches/features/all/rt/{0076-mm-Replace-cgroup_page-bit-spinlock.patch => mm-cgroup-page-bit-spinlock.patch} (66%) rename debian/patches/features/all/rt/{0096-mm-convert-swap-to-percpu-locked.patch => mm-convert-swap-to-percpu-locked.patch} (82%) rename debian/patches/features/all/rt/{0097-mm-make-vmstat-rt-aware.patch => mm-make-vmstat-rt-aware.patch} (62%) rename debian/patches/features/all/rt/{0095-mm-page-alloc-fix.patch.patch => mm-page-alloc-fix.patch} (61%) rename debian/patches/features/all/rt/{0043-mm-page-alloc-use-list-last-entry.patch.patch => mm-page-alloc-use-list-last-entry.patch} (60%) create mode 100644 debian/patches/features/all/rt/mm-page-alloc-use-local-lock-on-target-cpu.patch rename debian/patches/features/all/rt/{0094-mm-page_alloc-reduce-lock-sections-further.patch => mm-page_alloc-reduce-lock-sections-further.patch} (76%) rename debian/patches/features/all/rt/{0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch => mm-page_alloc-rt-friendly-per-cpu-pages.patch} (71%) rename debian/patches/features/all/rt/{0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch => mm-prepare-pf-disable-discoupling.patch} (73%) rename debian/patches/features/all/rt/{0197-mm-protect-activate-switch-mm.patch.patch => mm-protect-activate-switch-mm.patch} (63%) rename debian/patches/features/all/rt/{0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch => mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch} (83%) rename debian/patches/features/all/rt/{0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch => mm-remove-preempt-count-from-pf.patch} (66%) rename debian/patches/features/all/rt/{0227-mm-rt-kmap_atomic-scheduling.patch => mm-rt-kmap-atomic-scheduling.patch} (77%) rename debian/patches/features/all/rt/{0073-mm-scatterlist-dont-disable-irqs-on-RT.patch => mm-scatterlist-dont-disable-irqs-on-RT.patch} (58%) rename debian/patches/features/all/rt/{0098-mm-shrink-the-page-frame-to-rt-size.patch => mm-shrink-the-page-frame-to-rt-size.patch} (82%) create mode 100644 debian/patches/features/all/rt/mm-slab-fix-potential-deadlock.patch rename debian/patches/features/all/rt/{0092-mm-More-lock-breaks-in-slab.c.patch => mm-slab-more-lock-breaks.patch} (73%) rename debian/patches/features/all/rt/{0044-mm-slab-move-debug-out.patch.patch => mm-slab-move-debug-out.patch} (54%) rename debian/patches/features/all/rt/{0090-mm-slab-wrap-functions.patch.patch => mm-slab-wrap-functions.patch} (75%) rename debian/patches/features/all/rt/{0207-mm-vmalloc.patch.patch => mm-vmalloc-use-get-cpu-light.patch} (68%) rename debian/patches/features/all/rt/{0160-mutex-no-spin-on-rt.patch.patch => mutex-no-spin-on-rt.patch} (64%) create mode 100644 debian/patches/features/all/rt/net-another-local-irq-disable-alloc-atomic-headache.patch rename debian/patches/features/all/rt/{0047-net-flip-lock-dep-thingy.patch.patch => net-flip-lock-dep-thingy.patch} (92%) rename debian/patches/features/all/rt/{0157-net-netif_rx_ni-migrate-disable.patch.patch => net-netif_rx_ni-migrate-disable.patch} (57%) rename debian/patches/features/all/rt/{0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch => net-tx-action-avoid-livelock-on-rt.patch} (88%) rename debian/patches/features/all/rt/{0246-net-Use-cpu_chill-instead-of-cpu_relax.patch => net-use-cpu-chill.patch} (65%) create mode 100644 debian/patches/features/all/rt/net-use-cpu-light-in-ip-send-unicast-reply.patch rename debian/patches/features/all/rt/{0075-net-wireless-warn-nort.patch.patch => net-wireless-warn-nort.patch} (59%) rename debian/patches/features/all/rt/{0247-ntp-Make-ntp_lock-raw.patch => ntp-make-ntp-lock-raw-sigh.patch} (78%) rename debian/patches/features/all/rt/{0041-of-convert-devtree-lock.patch.patch => of-convert-devtree-lock.patch} (75%) rename debian/patches/features/all/rt/{0040-OF-Fixup-resursive-locking-code-paths.patch => of-fixup-recursive-locking.patch} (84%) rename debian/patches/features/all/rt/{0023-signal-x86-Delay-calling-signals-in-atomic.patch => oleg-signal-rt-fix.patch} (74%) create mode 100644 debian/patches/features/all/rt/panic-disable-random-on-rt.patch rename debian/patches/features/all/rt/{0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch => patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch} (73%) rename debian/patches/features/all/rt/{0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch => pci-access-use-__wake_up_all_locked.patch} (60%) create mode 100644 debian/patches/features/all/rt/perf-make-swevent-hrtimer-irqsafe.patch rename debian/patches/features/all/rt/{0215-x86-no-perf-irq-work-rt.patch.patch => perf-move-irq-work-to-softirq-in-rt.patch} (59%) rename debian/patches/features/all/rt/{0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch => peter_zijlstra-frob-hrtimer.patch} (87%) rename debian/patches/features/all/rt/{0148-sched-Generic-migrate_disable.patch => peter_zijlstra-frob-migrate_disable-2.patch} (73%) rename debian/patches/features/all/rt/{0147-sched-Optimize-migrate_disable.patch => peter_zijlstra-frob-migrate_disable.patch} (73%) rename debian/patches/features/all/rt/{0034-mm-pagefault_disabled.patch => peter_zijlstra-frob-pagefault_disable.patch} (54%) rename debian/patches/features/all/rt/{0184-rcu-Frob-softirq-test.patch => peter_zijlstra-frob-rcu.patch} (92%) rename debian/patches/features/all/rt/{0035-mm-raw_pagefault_disable.patch => peterz-raw_pagefault_disable.patch} (89%) create mode 100644 debian/patches/features/all/rt/peterz-srcu-crypto-chain.patch rename debian/patches/features/all/rt/{0045-rwsem-inlcude-fix.patch.patch => pid-h-include-atomic-h.patch} (55%) rename debian/patches/features/all/rt/{0224-ping-sysrq.patch.patch => ping-sysrq.patch} (74%) rename debian/patches/features/all/rt/{0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch => posix-timers-avoid-wakeups-when-no-timers-are-active.patch} (74%) rename debian/patches/features/all/rt/{0021-posix-timers-Prevent-broadcast-signals.patch => posix-timers-no-broadcast.patch} (66%) rename debian/patches/features/all/rt/{0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch => posix-timers-shorten-cpu-timers-thread.patch} (63%) rename debian/patches/features/all/rt/{0121-posix-timers-thread-posix-cpu-timers-on-rt.patch => posix-timers-thread-posix-cpu-timers-on-rt.patch} (83%) rename debian/patches/features/all/rt/{0219-power-disable-highmem-on-rt.patch.patch => power-disable-highmem-on-rt.patch} (51%) create mode 100644 debian/patches/features/all/rt/power-use-generic-rwsem-on-rt.patch create mode 100644 debian/patches/features/all/rt/ppc-mark-low-level-handlers-no-thread.patch rename debian/patches/features/all/rt/{0063-preempt-Provide-preempt_-_-no-rt-variants.patch => preempt-nort-rt-variants.patch} (83%) rename debian/patches/features/all/rt/{0059-printk-force_early_printk-boot-param-to-help-with-de.patch => printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch} (58%) rename debian/patches/features/all/rt/{0058-printk-kill.patch.patch => printk-kill.patch} (70%) create mode 100644 debian/patches/features/all/rt/printk-rt-aware.patch rename debian/patches/features/all/rt/{0101-radix-tree-rt-aware.patch.patch => radix-tree-rt-aware.patch} (67%) create mode 100644 debian/patches/features/all/rt/random-make-it-work-on-rt.patch rename debian/patches/features/all/rt/{0189-rcu-Fix-build-break.patch => rcu-fix-build-break.patch} (64%) rename debian/patches/features/all/rt/{0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch => rcu-force-preempt-rcu-for-rt.patch} (70%) rename debian/patches/features/all/rt/{0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch => rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch} (71%) rename debian/patches/features/all/rt/{0187-rcu-more-fallout.patch.patch => rcu-tiny-merge-bh.patch} (51%) create mode 100644 debian/patches/features/all/rt/rcu-tiny-solve-rt-mistery.patch rename debian/patches/features/all/rt/{0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch => re-migrate_disable-race-with-cpu-hotplug-3f.patch} (73%) rename debian/patches/features/all/rt/{0099-ARM-Initialize-ptl-lock-for-vector-page.patch => re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch} (84%) rename debian/patches/features/all/rt/{0105-relay-fix-timer-madness.patch => relay-fix-timer-madness.patch} (72%) rename debian/patches/features/all/rt/{0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch => resource-counters-use-localirq-nort.patch} (81%) rename debian/patches/features/all/rt/{0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch => rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch} (83%) rename debian/patches/features/all/rt/{0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch => rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch} (73%) rename debian/patches/features/all/rt/{0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch => rt-add-rt-locks.patch} (88%) rename debian/patches/features/all/rt/{0177-rt-add-rt-spinlocks.patch.patch => rt-add-rt-spinlock-to-headers.patch} (77%) rename debian/patches/features/all/rt/{0178-rt-add-rt-to-mutex-headers.patch.patch => rt-add-rt-to-mutex-headers.patch} (87%) create mode 100644 debian/patches/features/all/rt/rt-disable-rt-group-sched.patch rename debian/patches/features/all/rt/{0244-rt-Introduce-cpu_chill.patch => rt-introduce-cpu-chill.patch} (63%) rename debian/patches/features/all/rt/{0088-rt-local-irq-lock.patch.patch => rt-local-irq-lock.patch} (94%) rename debian/patches/features/all/rt/{0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch => rt-mutex-add-sleeping-spinlocks-support.patch} (88%) rename debian/patches/features/all/rt/{0060-rt-preempt-base-config.patch.patch => rt-preempt-base-config.patch} (81%) rename debian/patches/features/all/rt/{0190-rt-rcutree-Move-misplaced-prototype.patch => rt-rcutree-warn-fix.patch} (60%) create mode 100644 debian/patches/features/all/rt/rt-rw-lockdep-annotations.patch rename debian/patches/features/all/rt/{0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch => rt-sched-do-not-compare-cpu-masks-in-scheduler.patch} (68%) rename debian/patches/features/all/rt/{0153-sched-Have-migrate_disable-ignore-bounded-threads.patch => rt-sched-have-migrate_disable-ignore-bounded-threads.patch} (77%) rename debian/patches/features/all/rt/{0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch => rt-sched-postpone-actual-migration-disalbe-to-schedule.patch} (90%) rename debian/patches/features/all/rt/{0195-rt-Improve-the-serial-console-PASS_LIMIT.patch => rt-serial-warn-fix.patch} (65%) rename debian/patches/features/all/rt/{0145-tracing-Show-padding-as-unsigned-short.patch => rt-tracing-show-padding-as-unsigned-short.patch} (80%) rename debian/patches/features/all/rt/{0176-rtmutex-avoid-include-hell.patch.patch => rtmutex-avoid-include-hell.patch} (60%) rename debian/patches/features/all/rt/{0172-rtmutex-futex-prepare-rt.patch.patch => rtmutex-futex-prepare-rt.patch} (80%) rename debian/patches/features/all/rt/{0171-rtmutex-lock-killable.patch.patch => rtmutex-lock-killable.patch} (79%) rename debian/patches/features/all/rt/{0179-rwsem-add-rt-variant.patch.patch => rwsem-add-rt-variant.patch} (82%) create mode 100644 debian/patches/features/all/rt/sched-better-debug-output-for-might-sleep.patch rename debian/patches/features/all/rt/{0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch => sched-clear-pf-thread-bound-on-fallback-rq.patch} (52%) rename debian/patches/features/all/rt/{0129-sched-cond-resched.patch.patch => sched-cond-resched.patch} (63%) rename debian/patches/features/all/rt/{0124-sched-delay-put-task.patch.patch => sched-delay-put-task.patch} (66%) rename debian/patches/features/all/rt/{0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch => sched-disable-rt-group-sched-on-rt.patch} (72%) rename debian/patches/features/all/rt/{0132-sched-disable-ttwu-queue.patch.patch => sched-disable-ttwu-queue.patch} (69%) rename debian/patches/features/all/rt/{0125-sched-limit-nr-migrate.patch.patch => sched-limit-nr-migrate.patch} (65%) rename debian/patches/features/all/rt/{0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch => sched-might-sleep-do-not-account-rcu-depth.patch} (61%) rename debian/patches/features/all/rt/{0141-sched-migrate-disable.patch.patch => sched-migrate-disable.patch} (68%) rename debian/patches/features/all/rt/{0126-sched-mmdrop-delayed.patch.patch => sched-mmdrop-delayed.patch} (67%) rename debian/patches/features/all/rt/{0149-sched-rt-Fix-migrate_enable-thinko.patch => sched-rt-fix-migrate_enable-thinko.patch} (66%) rename debian/patches/features/all/rt/{0127-sched-rt-mutex-wakeup.patch.patch => sched-rt-mutex-wakeup.patch} (76%) rename debian/patches/features/all/rt/{0150-sched-teach-migrate_disable-about-atomic-contexts.patch => sched-teach-migrate_disable-about-atomic-contexts.patch} (69%) rename debian/patches/features/all/rt/{0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch => sched-ttwu-ensure-success-return-is-correct.patch} (70%) create mode 100644 debian/patches/features/all/rt/scsi-fcoe-rt-aware.patch rename debian/patches/features/all/rt/{0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch => scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch} (82%) rename debian/patches/features/all/rt/{0234-seqlock-Prevent-rt-starvation.patch => seqlock-prevent-rt-starvation.patch} (81%) rename debian/patches/features/all/rt/{0010-seqlock-Remove-unused-functions.patch => seqlock-remove-unused-functions.patch} (69%) rename debian/patches/features/all/rt/{0011-seqlock-Use-seqcount.patch => seqlock-use-seqcount.patch} (89%) rename debian/patches/features/all/rt/{0074-signal-fix-up-rcu-wreckage.patch.patch => signal-fix-up-rcu-wreckage.patch} (61%) rename debian/patches/features/all/rt/{0015-signal-revert-ptrace-preempt-magic.patch.patch => signal-revert-ptrace-preempt-magic.patch} (62%) rename debian/patches/features/all/rt/{0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch => signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch} (70%) rename debian/patches/features/all/rt/{0020-signals-Do-not-wakeup-self.patch => signals-do-not-wake-self.patch} (62%) rename debian/patches/features/all/rt/{0214-skbufhead-raw-lock.patch.patch => skbufhead-raw-lock.patch} (71%) rename debian/patches/features/all/rt/{0165-softirq-disable-softirq-stacks-for-rt.patch.patch => softirq-disable-softirq-stacks-for-rt.patch} (57%) rename debian/patches/features/all/rt/{0162-softirq-Export-in_serving_softirq.patch => softirq-export-in-serving-softirq.patch} (69%) rename debian/patches/features/all/rt/{0164-softirq-Fix-unplug-deadlock.patch => softirq-fix-unplug-deadlock.patch} (78%) create mode 100644 debian/patches/features/all/rt/softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch rename debian/patches/features/all/rt/{0161-softirq-local-lock.patch.patch => softirq-local-lock.patch} (80%) rename debian/patches/features/all/rt/{0166-softirq-make-fifo.patch.patch => softirq-make-fifo.patch} (74%) create mode 100644 debian/patches/features/all/rt/softirq-make-serving-softirqs-a-task-flag.patch rename debian/patches/features/all/rt/{0241-softirq-Check-preemption-after-reenabling-interrupts.patch => softirq-preempt-fix-3-re.patch} (69%) rename debian/patches/features/all/rt/{0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch => softirq-sanitize-softirq-pending.patch} (74%) create mode 100644 debian/patches/features/all/rt/softirq-split-handling-function.patch create mode 100644 debian/patches/features/all/rt/softirq-split-locks.patch rename debian/patches/features/all/rt/{0049-softirq-split-out-code.patch.patch => softirq-split-out-code.patch} (88%) rename debian/patches/features/all/rt/{0048-softirq-thread-do-softirq.patch.patch => softirq-thread-do-softirq.patch} (57%) rename debian/patches/features/all/rt/{0175-spinlock-types-separate-raw.patch.patch => spinlock-types-separate-raw.patch} (81%) create mode 100644 debian/patches/features/all/rt/stomp-machine-deal-clever-with-stopper-lock.patch rename debian/patches/features/all/rt/{0136-stomp-machine-mark-stomper-thread.patch.patch => stomp-machine-mark-stomper-thread.patch} (58%) rename debian/patches/features/all/rt/{0137-stomp-machine-raw-lock.patch.patch => stomp-machine-raw-lock.patch} (80%) rename debian/patches/features/all/rt/{0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch => stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch} (76%) rename debian/patches/features/all/rt/{0039-suspend-Prevent-might-sleep-splats.patch => suspend-prevernt-might-sleep-splats.patch} (59%) rename debian/patches/features/all/rt/{0046-sysctl-include-fix.patch.patch => sysctl-include-atomic-h.patch} (59%) rename debian/patches/features/all/rt/{0226-add-sys-kernel-realtime-entry.patch => sysfs-realtime-entry.patch} (76%) rename debian/patches/features/all/rt/{0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch => tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch} (90%) rename debian/patches/features/all/rt/{0181-rwlocks-Fix-section-mismatch.patch => tasklist-lock-fix-section-conflict.patch} (71%) create mode 100644 debian/patches/features/all/rt/timekeeping-split-xtime-lock.patch rename debian/patches/features/all/rt/{0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch => timer-delay-waking-softirqs-from-the-jiffy-tick.patch} (89%) rename debian/patches/features/all/rt/{0120-timer-fd-Prevent-live-lock.patch => timer-fd-avoid-live-lock.patch} (69%) rename debian/patches/features/all/rt/{0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch => timer-handle-idle-trylock-in-get-next-timer-irq.patch} (56%) create mode 100644 debian/patches/features/all/rt/timer.c-fix-build-fail-for-RT_FULL.patch rename debian/patches/features/all/rt/{0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch => timers-avoid-the-base-null-otptimization-on-rt.patch} (80%) rename debian/patches/features/all/rt/{0111-timers-mov-printk_tick-to-soft-interrupt.patch => timers-mov-printk_tick-to-soft-interrupt.patch} (60%) create mode 100644 debian/patches/features/all/rt/timers-preempt-rt-support.patch rename debian/patches/features/all/rt/{0108-timers-prepare-for-full-preemption.patch => timers-prepare-for-full-preemption.patch} (75%) rename debian/patches/features/all/rt/{0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch => tracing-account-for-preempt-off-in-preempt_schedule.patch} (81%) rename debian/patches/features/all/rt/{0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch => tty-use-local-irq-nort.patch} (73%) rename debian/patches/features/all/rt/{0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch => upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch} (81%) rename debian/patches/features/all/rt/{0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch => usb-fix-mouse-problem-copying-large-data.patch} (69%) rename debian/patches/features/all/rt/{0071-usb-Use-local_irq_-_nort-variants.patch => usb-hcd-use-local-irq-nort.patch} (64%) rename debian/patches/features/all/rt/{0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch => user-use-local-irq-nort.patch} (59%) rename debian/patches/features/all/rt/{0205-workqueue-use-get-cpu-light.patch.patch => workqueue-use-get-cpu-light.patch} (52%) rename debian/patches/features/all/rt/{0231-x86-crypto-Reduce-preempt-disabled-regions.patch => x86-crypto-reduce-preempt-disabled-regions.patch} (80%) rename debian/patches/features/all/rt/{0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch => x86-disable-debug-stack.patch} (79%) rename debian/patches/features/all/rt/{0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch => x86-highmem-warn.patch} (64%) rename debian/patches/features/all/rt/{0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch => x86-hpet-disable-msi-on-lenovo-w510.patch} (77%) rename debian/patches/features/all/rt/{0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch => x86-io-apic-migra-no-unmask.patch} (65%) rename debian/patches/features/all/rt/{0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch => x86-kprobes-remove-bogus-preempt-enable.patch} (59%) rename debian/patches/features/all/rt/{0229-x86-kvm-require-const-tsc-for-rt.patch.patch => x86-kvm-require-const-tsc-for-rt.patch} (54%) rename debian/patches/features/all/rt/{0201-x86-Convert-mce-timer-to-hrtimer.patch => x86-mce-timer-hrtimer.patch} (51%) create mode 100644 debian/patches/features/all/rt/x86-perf-uncore-deal-with-kfree.patch rename debian/patches/features/all/rt/{0202-x86-stackprotector-Avoid-random-pool-on-rt.patch => x86-stackprot-no-random-on-rt.patch} (78%) rename debian/patches/features/all/rt/{0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch => x86-use-gen-rwsem-spinlocks-rt.patch} (61%) diff --git a/debian/changelog b/debian/changelog index 45785430e..a29241b79 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,9 @@ linux (3.6.3-1~experimental.1) UNRELEASED; urgency=low [ Ben Hutchings ] * aufs: Update to aufs3.x-rcN-20120827 + [ Uwe Kleine-König ] + * reenable the rt featureset using 3.6.3-rt6 + -- Bastian Blank Thu, 04 Oct 2012 17:50:39 +0200 linux (3.5.5-1~experimental.1) experimental; urgency=low diff --git a/debian/config/amd64/defines b/debian/config/amd64/defines index f671a257b..7676d1c3f 100644 --- a/debian/config/amd64/defines +++ b/debian/config/amd64/defines @@ -1,7 +1,7 @@ [base] featuresets: none -# rt + rt kernel-arch: x86 [build] diff --git a/debian/config/defines b/debian/config/defines index 43777879b..4f8202139 100644 --- a/debian/config/defines +++ b/debian/config/defines @@ -24,7 +24,7 @@ arches: compiler: gcc-4.6 featuresets: none -# rt + rt [featureset-rt_base] enabled: true diff --git a/debian/config/i386/defines b/debian/config/i386/defines index 67feae443..806789224 100644 --- a/debian/config/i386/defines +++ b/debian/config/i386/defines @@ -1,7 +1,7 @@ [base] featuresets: none -# rt + rt kernel-arch: x86 [description] diff --git a/debian/patches/features/all/rt/0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch b/debian/patches/features/all/rt/0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch deleted file mode 100644 index 60acc046c..000000000 --- a/debian/patches/features/all/rt/0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch +++ /dev/null @@ -1,35 +0,0 @@ -From c9cf7a34892f415c473689ecd7cb82815481e39c Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Thu, 7 Jun 2012 09:49:40 -0400 -Subject: [001/256] Revert "workqueue: skip nr_running sanity check in - worker_enter_idle() if trustee is active" - -This reverts commit 24312d34c95702e51240f58c073db30630170fbf. - -Reported-by: Ibrahim Umar - -Signed-off-by: Steven Rostedt ---- - kernel/workqueue.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 7da267c..5abf42f 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -1210,13 +1210,8 @@ static void worker_enter_idle(struct worker *worker) - } else - wake_up_all(&gcwq->trustee_wait); - -- /* -- * Sanity check nr_running. Because trustee releases gcwq->lock -- * between setting %WORKER_ROGUE and zapping nr_running, the -- * warning may trigger spuriously. Check iff trustee is idle. -- */ -- WARN_ON_ONCE(gcwq->trustee_state == TRUSTEE_DONE && -- gcwq->nr_workers == gcwq->nr_idle && -+ /* sanity check nr_running */ -+ WARN_ON_ONCE(gcwq->nr_workers == gcwq->nr_idle && - atomic_read(get_gcwq_nr_running(gcwq->cpu))); - } - diff --git a/debian/patches/features/all/rt/0002-slab-lockdep-Annotate-all-slab-caches.patch b/debian/patches/features/all/rt/0002-slab-lockdep-Annotate-all-slab-caches.patch deleted file mode 100644 index e66d372ec..000000000 --- a/debian/patches/features/all/rt/0002-slab-lockdep-Annotate-all-slab-caches.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 82753a6da41f383c6649d5e7de36db554dea7b12 Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Mon, 28 Nov 2011 19:51:51 +0100 -Subject: [002/256] slab, lockdep: Annotate all slab caches - -Currently we only annotate the kmalloc caches, annotate all of them. - -Signed-off-by: Peter Zijlstra -Cc: Hans Schillstrom -Cc: Christoph Lameter -Cc: Pekka Enberg -Cc: Matt Mackall -Cc: Sitsofe Wheeler -Cc: linux-mm@kvack.org -Cc: David Rientjes -Signed-off-by: Thomas Gleixner -Link: http://lkml.kernel.org/n/tip-10bey2cgpcvtbdkgigaoab8w@git.kernel.org ---- - mm/slab.c | 52 ++++++++++++++++++++++++++++------------------------ - 1 file changed, 28 insertions(+), 24 deletions(-) - -diff --git a/mm/slab.c b/mm/slab.c -index e901a36..1fd4b4d 100644 ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -611,6 +611,12 @@ int slab_is_available(void) - return g_cpucache_up >= EARLY; - } - -+/* -+ * Guard access to the cache-chain. -+ */ -+static DEFINE_MUTEX(cache_chain_mutex); -+static struct list_head cache_chain; -+ - #ifdef CONFIG_LOCKDEP - - /* -@@ -672,38 +678,41 @@ static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) - slab_set_debugobj_lock_classes_node(cachep, node); - } - --static void init_node_lock_keys(int q) -+static void init_lock_keys(struct kmem_cache *cachep, int node) - { -- struct cache_sizes *s = malloc_sizes; -+ struct kmem_list3 *l3; - - if (g_cpucache_up < LATE) - return; - -- for (s = malloc_sizes; s->cs_size != ULONG_MAX; s++) { -- struct kmem_list3 *l3; -+ l3 = cachep->nodelists[node]; -+ if (!l3 || OFF_SLAB(cachep)) -+ return; - -- l3 = s->cs_cachep->nodelists[q]; -- if (!l3 || OFF_SLAB(s->cs_cachep)) -- continue; -+ slab_set_lock_classes(cachep, &on_slab_l3_key, &on_slab_alc_key, node); -+} - -- slab_set_lock_classes(s->cs_cachep, &on_slab_l3_key, -- &on_slab_alc_key, q); -- } -+static void init_node_lock_keys(int node) -+{ -+ struct kmem_cache *cachep; -+ -+ list_for_each_entry(cachep, &cache_chain, next) -+ init_lock_keys(cachep, node); - } - --static inline void init_lock_keys(void) -+static inline void init_cachep_lock_keys(struct kmem_cache *cachep) - { - int node; - - for_each_node(node) -- init_node_lock_keys(node); -+ init_lock_keys(cachep, node); - } - #else --static void init_node_lock_keys(int q) -+static void init_node_lock_keys(int node) - { - } - --static inline void init_lock_keys(void) -+static void init_cachep_lock_keys(struct kmem_cache *cachep) - { - } - -@@ -716,12 +725,6 @@ static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) - } - #endif - --/* -- * Guard access to the cache-chain. -- */ --static DEFINE_MUTEX(cache_chain_mutex); --static struct list_head cache_chain; -- - static DEFINE_PER_CPU(struct delayed_work, slab_reap_work); - - static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep) -@@ -1685,14 +1688,13 @@ void __init kmem_cache_init_late(void) - - g_cpucache_up = LATE; - -- /* Annotate slab for lockdep -- annotate the malloc caches */ -- init_lock_keys(); -- - /* 6) resize the head arrays to their final sizes */ - mutex_lock(&cache_chain_mutex); -- list_for_each_entry(cachep, &cache_chain, next) -+ list_for_each_entry(cachep, &cache_chain, next) { -+ init_cachep_lock_keys(cachep); - if (enable_cpucache(cachep, GFP_NOWAIT)) - BUG(); -+ } - mutex_unlock(&cache_chain_mutex); - - /* Done! */ -@@ -2544,6 +2546,8 @@ kmem_cache_create (const char *name, size_t size, size_t align, - slab_set_debugobj_lock_classes(cachep); - } - -+ init_cachep_lock_keys(cachep); -+ - /* cache setup completed, link it into the list */ - list_add(&cachep->next, &cache_chain); - oops: diff --git a/debian/patches/features/all/rt/0004-tick-Add-tick-skew-boot-option.patch b/debian/patches/features/all/rt/0004-tick-Add-tick-skew-boot-option.patch deleted file mode 100644 index 5e0f05aef..000000000 --- a/debian/patches/features/all/rt/0004-tick-Add-tick-skew-boot-option.patch +++ /dev/null @@ -1,103 +0,0 @@ -From fd87afd117d048ba4d78f4b910901074408a799a Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Tue, 8 May 2012 12:20:58 +0200 -Subject: [004/256] tick: Add tick skew boot option - -Let the user decide whether power consumption or jitter is the -more important consideration for their machines. - -Quoting removal commit af5ab277ded04bd9bc6b048c5a2f0e7d70ef0867: - -"Historically, Linux has tried to make the regular timer tick on the - various CPUs not happen at the same time, to avoid contention on - xtime_lock. - - Nowadays, with the tickless kernel, this contention no longer happens - since time keeping and updating are done differently. In addition, - this skew is actually hurting power consumption in a measurable way on - many-core systems." - -Problems: - - - Contrary to the above, systems do encounter contention on both - xtime_lock and RCU structure locks when the tick is synchronized. - - - Moderate sized RT systems suffer intolerable jitter due to the tick - being synchronized. - - - SGI reports the same for their large systems. - - - Fully utilized systems reap no power saving benefit from skew removal, - but do suffer from resulting induced lock contention. - - - 0209f649 rcu: limit rcu_node leaf-level fanout - This patch was born to combat lock contention which testing showed - to have been _induced by_ skew removal. Skew the tick, contention - disappeared virtually completely. - -[ tglx: build fix ] - -Signed-off-by: Mike Galbraith -Link: http://lkml.kernel.org/r/1336472458.21924.78.camel@marge.simpson.net -Signed-off-by: Thomas Gleixner ---- - Documentation/kernel-parameters.txt | 9 +++++++++ - kernel/time/tick-sched.c | 18 ++++++++++++++++++ - 2 files changed, 27 insertions(+) - -diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt -index c1601e5..1e0150e 100644 ---- a/Documentation/kernel-parameters.txt -+++ b/Documentation/kernel-parameters.txt -@@ -2426,6 +2426,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted. - - sched_debug [KNL] Enables verbose scheduler debug messages. - -+ skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate -+ xtime_lock contention on larger systems, and/or RCU lock -+ contention on all systems with CONFIG_MAXSMP set. -+ Format: { "0" | "1" } -+ 0 -- disable. (may be 1 via CONFIG_CMDLINE="skew_tick=1" -+ 1 -- enable. -+ Note: increases power consumption, thus should only be -+ enabled if running jitter sensitive (HPC/RT) workloads. -+ - security= [SECURITY] Choose a security module to enable at boot. - If this boot parameter is not specified, only the first - security module asking for security registration will be -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 6a3a5b9..efd3866 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -814,6 +814,16 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer) - return HRTIMER_RESTART; - } - -+static int sched_skew_tick; -+ -+static int __init skew_tick(char *str) -+{ -+ get_option(&str, &sched_skew_tick); -+ -+ return 0; -+} -+early_param("skew_tick", skew_tick); -+ - /** - * tick_setup_sched_timer - setup the tick emulation timer - */ -@@ -831,6 +841,14 @@ void tick_setup_sched_timer(void) - /* Get the next period (per cpu) */ - hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update()); - -+ /* Offset the tick to avert xtime_lock contention. */ -+ if (sched_skew_tick) { -+ u64 offset = ktime_to_ns(tick_period) >> 1; -+ do_div(offset, num_possible_cpus()); -+ offset *= smp_processor_id(); -+ hrtimer_add_expires_ns(&ts->sched_timer, offset); -+ } -+ - for (;;) { - hrtimer_forward(&ts->sched_timer, now, tick_period); - hrtimer_start_expires(&ts->sched_timer, diff --git a/debian/patches/features/all/rt/0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch b/debian/patches/features/all/rt/0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch deleted file mode 100644 index d8b105323..000000000 --- a/debian/patches/features/all/rt/0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch +++ /dev/null @@ -1,263 +0,0 @@ -From 5d2ed4b009866a4c6fbb6f8cf371e56403ca75de Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 22 Jun 2011 19:47:03 +0200 -Subject: [007/256] sched: Distangle worker accounting from rq-%3Elock - -The worker accounting for cpu bound workers is plugged into the core -scheduler code and the wakeup code. This is not a hard requirement and -can be avoided by keeping track of the state in the workqueue code -itself. - -Keep track of the sleeping state in the worker itself and call the -notifier before entering the core scheduler. There might be false -positives when the task is woken between that call and actually -scheduling, but that's not really different from scheduling and being -woken immediately after switching away. There is also no harm from -updating nr_running when the task returns from scheduling instead of -accounting it in the wakeup code. - -Signed-off-by: Thomas Gleixner -Cc: Peter Zijlstra -Cc: Tejun Heo -Cc: Jens Axboe -Cc: Linus Torvalds -Link: http://lkml.kernel.org/r/20110622174919.135236139@linutronix.de -Signed-off-by: Thomas Gleixner ---- - kernel/sched/core.c | 66 +++++++++++---------------------------------- - kernel/workqueue.c | 67 +++++++++++++++++++++------------------------- - kernel/workqueue_sched.h | 5 ++-- - 3 files changed, 47 insertions(+), 91 deletions(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 2000e06..2db74b7 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1399,10 +1399,6 @@ static void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) - { - activate_task(rq, p, en_flags); - p->on_rq = 1; -- -- /* if a worker is waking up, notify workqueue */ -- if (p->flags & PF_WQ_WORKER) -- wq_worker_waking_up(p, cpu_of(rq)); - } - - /* -@@ -1642,40 +1638,6 @@ out: - } - - /** -- * try_to_wake_up_local - try to wake up a local task with rq lock held -- * @p: the thread to be awakened -- * -- * Put @p on the run-queue if it's not already there. The caller must -- * ensure that this_rq() is locked, @p is bound to this_rq() and not -- * the current task. -- */ --static void try_to_wake_up_local(struct task_struct *p) --{ -- struct rq *rq = task_rq(p); -- -- BUG_ON(rq != this_rq()); -- BUG_ON(p == current); -- lockdep_assert_held(&rq->lock); -- -- if (!raw_spin_trylock(&p->pi_lock)) { -- raw_spin_unlock(&rq->lock); -- raw_spin_lock(&p->pi_lock); -- raw_spin_lock(&rq->lock); -- } -- -- if (!(p->state & TASK_NORMAL)) -- goto out; -- -- if (!p->on_rq) -- ttwu_activate(rq, p, ENQUEUE_WAKEUP); -- -- ttwu_do_wakeup(rq, p, 0); -- ttwu_stat(p, smp_processor_id(), 0); --out: -- raw_spin_unlock(&p->pi_lock); --} -- --/** - * wake_up_process - Wake up a specific process - * @p: The process to be woken up. - * -@@ -3200,19 +3162,6 @@ need_resched: - } else { - deactivate_task(rq, prev, DEQUEUE_SLEEP); - prev->on_rq = 0; -- -- /* -- * If a worker went to sleep, notify and ask workqueue -- * whether it wants to wake up a task to maintain -- * concurrency. -- */ -- if (prev->flags & PF_WQ_WORKER) { -- struct task_struct *to_wakeup; -- -- to_wakeup = wq_worker_sleeping(prev, cpu); -- if (to_wakeup) -- try_to_wake_up_local(to_wakeup); -- } - } - switch_count = &prev->nvcsw; - } -@@ -3255,6 +3204,14 @@ static inline void sched_submit_work(struct task_struct *tsk) - { - if (!tsk->state || tsk_is_pi_blocked(tsk)) - return; -+ -+ /* -+ * If a worker went to sleep, notify and ask workqueue whether -+ * it wants to wake up a task to maintain concurrency. -+ */ -+ if (tsk->flags & PF_WQ_WORKER) -+ wq_worker_sleeping(tsk); -+ - /* - * If we are going to sleep and we have plugged IO queued, - * make sure to submit it to avoid deadlocks. -@@ -3263,12 +3220,19 @@ static inline void sched_submit_work(struct task_struct *tsk) - blk_schedule_flush_plug(tsk); - } - -+static inline void sched_update_worker(struct task_struct *tsk) -+{ -+ if (tsk->flags & PF_WQ_WORKER) -+ wq_worker_running(tsk); -+} -+ - asmlinkage void __sched schedule(void) - { - struct task_struct *tsk = current; - - sched_submit_work(tsk); - __schedule(); -+ sched_update_worker(tsk); - } - EXPORT_SYMBOL(schedule); - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 5abf42f..50e0d00 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -137,6 +137,7 @@ struct worker { - unsigned int flags; /* X: flags */ - int id; /* I: worker id */ - struct work_struct rebind_work; /* L: rebind worker to cpu */ -+ int sleeping; /* None */ - }; - - /* -@@ -655,66 +656,58 @@ static void wake_up_worker(struct global_cwq *gcwq) - } - - /** -- * wq_worker_waking_up - a worker is waking up -- * @task: task waking up -- * @cpu: CPU @task is waking up to -+ * wq_worker_running - a worker is running again -+ * @task: task returning from sleep - * -- * This function is called during try_to_wake_up() when a worker is -- * being awoken. -- * -- * CONTEXT: -- * spin_lock_irq(rq->lock) -+ * This function is called when a worker returns from schedule() - */ --void wq_worker_waking_up(struct task_struct *task, unsigned int cpu) -+void wq_worker_running(struct task_struct *task) - { - struct worker *worker = kthread_data(task); - -+ if (!worker->sleeping) -+ return; - if (!(worker->flags & WORKER_NOT_RUNNING)) -- atomic_inc(get_gcwq_nr_running(cpu)); -+ atomic_inc(get_gcwq_nr_running(smp_processor_id())); -+ worker->sleeping = 0; - } - - /** - * wq_worker_sleeping - a worker is going to sleep - * @task: task going to sleep -- * @cpu: CPU in question, must be the current CPU number -- * -- * This function is called during schedule() when a busy worker is -- * going to sleep. Worker on the same cpu can be woken up by -- * returning pointer to its task. -- * -- * CONTEXT: -- * spin_lock_irq(rq->lock) - * -- * RETURNS: -- * Worker task on @cpu to wake up, %NULL if none. -+ * This function is called from schedule() when a busy worker is -+ * going to sleep. - */ --struct task_struct *wq_worker_sleeping(struct task_struct *task, -- unsigned int cpu) -+void wq_worker_sleeping(struct task_struct *task) - { -- struct worker *worker = kthread_data(task), *to_wakeup = NULL; -- struct global_cwq *gcwq = get_gcwq(cpu); -- atomic_t *nr_running = get_gcwq_nr_running(cpu); -+ struct worker *worker = kthread_data(task); -+ struct global_cwq *gcwq; -+ int cpu; - - if (worker->flags & WORKER_NOT_RUNNING) -- return NULL; -+ return; -+ -+ if (WARN_ON_ONCE(worker->sleeping)) -+ return; - -- /* this can only happen on the local cpu */ -- BUG_ON(cpu != raw_smp_processor_id()); -+ worker->sleeping = 1; - -+ cpu = smp_processor_id(); -+ gcwq = get_gcwq(cpu); -+ spin_lock_irq(&gcwq->lock); - /* - * The counterpart of the following dec_and_test, implied mb, - * worklist not empty test sequence is in insert_work(). - * Please read comment there. -- * -- * NOT_RUNNING is clear. This means that trustee is not in -- * charge and we're running on the local cpu w/ rq lock held -- * and preemption disabled, which in turn means that none else -- * could be manipulating idle_list, so dereferencing idle_list -- * without gcwq lock is safe. - */ -- if (atomic_dec_and_test(nr_running) && !list_empty(&gcwq->worklist)) -- to_wakeup = first_worker(gcwq); -- return to_wakeup ? to_wakeup->task : NULL; -+ if (atomic_dec_and_test(get_gcwq_nr_running(cpu)) && -+ !list_empty(&gcwq->worklist)) { -+ worker = first_worker(gcwq); -+ if (worker) -+ wake_up_process(worker->task); -+ } -+ spin_unlock_irq(&gcwq->lock); - } - - /** -diff --git a/kernel/workqueue_sched.h b/kernel/workqueue_sched.h -index 2d10fc9..3bf73e2 100644 ---- a/kernel/workqueue_sched.h -+++ b/kernel/workqueue_sched.h -@@ -4,6 +4,5 @@ - * Scheduler hooks for concurrency managed workqueue. Only to be - * included from sched.c and workqueue.c. - */ --void wq_worker_waking_up(struct task_struct *task, unsigned int cpu); --struct task_struct *wq_worker_sleeping(struct task_struct *task, -- unsigned int cpu); -+void wq_worker_running(struct task_struct *task); -+void wq_worker_sleeping(struct task_struct *task); diff --git a/debian/patches/features/all/rt/0008-mips-enable-interrupts-in-signal.patch.patch b/debian/patches/features/all/rt/0008-mips-enable-interrupts-in-signal.patch.patch deleted file mode 100644 index 3cab53631..000000000 --- a/debian/patches/features/all/rt/0008-mips-enable-interrupts-in-signal.patch.patch +++ /dev/null @@ -1,24 +0,0 @@ -From c660f897922204ee48e592122be0f02cbca2e045 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 18 Jul 2011 21:32:10 +0200 -Subject: [008/256] mips-enable-interrupts-in-signal.patch - -Signed-off-by: Thomas Gleixner ---- - arch/mips/kernel/signal.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c -index d5a338a..ab4e20a 100644 ---- a/arch/mips/kernel/signal.c -+++ b/arch/mips/kernel/signal.c -@@ -588,6 +588,9 @@ static void do_signal(struct pt_regs *regs) - if (!user_mode(regs)) - return; - -+ local_irq_enable(); -+ preempt_check_resched(); -+ - if (test_thread_flag(TIF_RESTORE_SIGMASK)) - oldset = ¤t->saved_sigmask; - else diff --git a/debian/patches/features/all/rt/0009-arm-enable-interrupts-in-signal-code.patch.patch b/debian/patches/features/all/rt/0009-arm-enable-interrupts-in-signal-code.patch.patch deleted file mode 100644 index 404cbff63..000000000 --- a/debian/patches/features/all/rt/0009-arm-enable-interrupts-in-signal-code.patch.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 903dd2be6f21b3845bbf13d15454347d0a30f0dc Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 16 Jul 2011 16:27:13 +0200 -Subject: [009/256] arm-enable-interrupts-in-signal-code.patch - -Signed-off-by: Thomas Gleixner ---- - arch/arm/kernel/signal.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c -index d68d1b6..13db45b 100644 ---- a/arch/arm/kernel/signal.c -+++ b/arch/arm/kernel/signal.c -@@ -617,6 +617,9 @@ static void do_signal(struct pt_regs *regs, int syscall) - if (!user_mode(regs)) - return; - -+ local_irq_enable(); -+ preempt_check_resched(); -+ - /* - * If we were from a system call, check for system call restarting... - */ diff --git a/debian/patches/features/all/rt/0012-timekeeping-Split-xtime_lock.patch b/debian/patches/features/all/rt/0012-timekeeping-Split-xtime_lock.patch deleted file mode 100644 index 7f47c47f1..000000000 --- a/debian/patches/features/all/rt/0012-timekeeping-Split-xtime_lock.patch +++ /dev/null @@ -1,522 +0,0 @@ -From 2404f6318f3cbc6b9a85c47edb27919cae54c952 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 1 Mar 2012 15:14:06 +0100 -Subject: [012/256] timekeeping: Split xtime_lock - -xtime_lock is going to be split apart in mainline, so we can shorten -the seqcount protected regions and avoid updating seqcount in some -code pathes. This is a straight forward split, so we can avoid the -whole mess with raw seqlocks for RT. - -Signed-off-by: Thomas Gleixner ---- - kernel/time/jiffies.c | 4 +- - kernel/time/tick-common.c | 10 ++-- - kernel/time/tick-internal.h | 3 +- - kernel/time/tick-sched.c | 16 +++--- - kernel/time/timekeeping.c | 114 +++++++++++++++++++++++++------------------ - 5 files changed, 87 insertions(+), 60 deletions(-) - -diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c -index a470154..21940eb 100644 ---- a/kernel/time/jiffies.c -+++ b/kernel/time/jiffies.c -@@ -74,9 +74,9 @@ u64 get_jiffies_64(void) - u64 ret; - - do { -- seq = read_seqbegin(&xtime_lock); -+ seq = read_seqcount_begin(&xtime_seq); - ret = jiffies_64; -- } while (read_seqretry(&xtime_lock, seq)); -+ } while (read_seqcount_retry(&xtime_seq, seq)); - return ret; - } - EXPORT_SYMBOL(get_jiffies_64); -diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c -index da6c9ec..39de540 100644 ---- a/kernel/time/tick-common.c -+++ b/kernel/time/tick-common.c -@@ -63,13 +63,15 @@ int tick_is_oneshot_available(void) - static void tick_periodic(int cpu) - { - if (tick_do_timer_cpu == cpu) { -- write_seqlock(&xtime_lock); -+ raw_spin_lock(&xtime_lock); -+ write_seqcount_begin(&xtime_seq); - - /* Keep track of the next tick event */ - tick_next_period = ktime_add(tick_next_period, tick_period); - - do_timer(1); -- write_sequnlock(&xtime_lock); -+ write_seqcount_end(&xtime_seq); -+ raw_spin_unlock(&xtime_lock); - } - - update_process_times(user_mode(get_irq_regs())); -@@ -130,9 +132,9 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast) - ktime_t next; - - do { -- seq = read_seqbegin(&xtime_lock); -+ seq = read_seqcount_begin(&xtime_seq); - next = tick_next_period; -- } while (read_seqretry(&xtime_lock, seq)); -+ } while (read_seqcount_retry(&xtime_seq, seq)); - - clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); - -diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h -index 4e265b9..c91100d 100644 ---- a/kernel/time/tick-internal.h -+++ b/kernel/time/tick-internal.h -@@ -141,4 +141,5 @@ static inline int tick_device_is_functional(struct clock_event_device *dev) - #endif - - extern void do_timer(unsigned long ticks); --extern seqlock_t xtime_lock; -+extern raw_spinlock_t xtime_lock; -+extern seqcount_t xtime_seq; -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index efd3866..a607a7c 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -56,7 +56,8 @@ static void tick_do_update_jiffies64(ktime_t now) - return; - - /* Reevalute with xtime_lock held */ -- write_seqlock(&xtime_lock); -+ raw_spin_lock(&xtime_lock); -+ write_seqcount_begin(&xtime_seq); - - delta = ktime_sub(now, last_jiffies_update); - if (delta.tv64 >= tick_period.tv64) { -@@ -79,7 +80,8 @@ static void tick_do_update_jiffies64(ktime_t now) - /* Keep the tick_next_period variable up to date */ - tick_next_period = ktime_add(last_jiffies_update, tick_period); - } -- write_sequnlock(&xtime_lock); -+ write_seqcount_end(&xtime_seq); -+ raw_spin_unlock(&xtime_lock); - } - - /* -@@ -89,12 +91,14 @@ static ktime_t tick_init_jiffy_update(void) - { - ktime_t period; - -- write_seqlock(&xtime_lock); -+ raw_spin_lock(&xtime_lock); -+ write_seqcount_begin(&xtime_seq); - /* Did we start the jiffies update yet ? */ - if (last_jiffies_update.tv64 == 0) - last_jiffies_update = tick_next_period; - period = last_jiffies_update; -- write_sequnlock(&xtime_lock); -+ write_seqcount_end(&xtime_seq); -+ raw_spin_unlock(&xtime_lock); - return period; - } - -@@ -316,11 +320,11 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts) - ts->idle_calls++; - /* Read jiffies and the time when jiffies were updated last */ - do { -- seq = read_seqbegin(&xtime_lock); -+ seq = read_seqcount_begin(&xtime_seq); - last_update = last_jiffies_update; - last_jiffies = jiffies; - time_delta = timekeeping_max_deferment(); -- } while (read_seqretry(&xtime_lock, seq)); -+ } while (read_seqcount_retry(&xtime_seq, seq)); - - if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || - arch_needs_cpu(cpu)) { -diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c -index d42574df..e8e95ee 100644 ---- a/kernel/time/timekeeping.c -+++ b/kernel/time/timekeeping.c -@@ -70,8 +70,9 @@ struct timekeeper { - /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ - struct timespec raw_time; - -- /* Seqlock for all timekeeper values */ -- seqlock_t lock; -+ /* Open coded seqlock for all timekeeper values */ -+ seqcount_t seq; -+ raw_spinlock_t lock; - }; - - static struct timekeeper timekeeper; -@@ -80,7 +81,8 @@ static struct timekeeper timekeeper; - * This read-write spinlock protects us from races in SMP while - * playing with xtime. - */ --__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock); -+__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(xtime_lock); -+seqcount_t xtime_seq; - - - /* flag for if timekeeping is suspended */ -@@ -228,7 +230,7 @@ void getnstimeofday(struct timespec *ts) - WARN_ON(timekeeping_suspended); - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - *ts = timekeeper.xtime; - nsecs = timekeeping_get_ns(); -@@ -236,7 +238,7 @@ void getnstimeofday(struct timespec *ts) - /* If arch requires, add in gettimeoffset() */ - nsecs += arch_gettimeoffset(); - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - timespec_add_ns(ts, nsecs); - } -@@ -251,7 +253,7 @@ ktime_t ktime_get(void) - WARN_ON(timekeeping_suspended); - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - secs = timekeeper.xtime.tv_sec + - timekeeper.wall_to_monotonic.tv_sec; - nsecs = timekeeper.xtime.tv_nsec + -@@ -260,7 +262,7 @@ ktime_t ktime_get(void) - /* If arch requires, add in gettimeoffset() */ - nsecs += arch_gettimeoffset(); - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - /* - * Use ktime_set/ktime_add_ns to create a proper ktime on - * 32-bit architectures without CONFIG_KTIME_SCALAR. -@@ -286,14 +288,14 @@ void ktime_get_ts(struct timespec *ts) - WARN_ON(timekeeping_suspended); - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - *ts = timekeeper.xtime; - tomono = timekeeper.wall_to_monotonic; - nsecs = timekeeping_get_ns(); - /* If arch requires, add in gettimeoffset() */ - nsecs += arch_gettimeoffset(); - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, - ts->tv_nsec + tomono.tv_nsec + nsecs); -@@ -321,7 +323,7 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) - do { - u32 arch_offset; - -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - *ts_raw = timekeeper.raw_time; - *ts_real = timekeeper.xtime; -@@ -334,7 +336,7 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) - nsecs_raw += arch_offset; - nsecs_real += arch_offset; - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - timespec_add_ns(ts_raw, nsecs_raw); - timespec_add_ns(ts_real, nsecs_real); -@@ -373,7 +375,8 @@ int do_settimeofday(const struct timespec *tv) - if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) - return -EINVAL; - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - timekeeping_forward_now(); - -@@ -385,7 +388,8 @@ int do_settimeofday(const struct timespec *tv) - timekeeper.xtime = *tv; - timekeeping_update(true); - -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - /* signal hrtimers about time change */ - clock_was_set(); -@@ -409,7 +413,8 @@ int timekeeping_inject_offset(struct timespec *ts) - if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) - return -EINVAL; - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - timekeeping_forward_now(); - -@@ -419,7 +424,8 @@ int timekeeping_inject_offset(struct timespec *ts) - - timekeeping_update(true); - -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - /* signal hrtimers about time change */ - clock_was_set(); -@@ -440,7 +446,8 @@ static int change_clocksource(void *data) - - new = (struct clocksource *) data; - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - timekeeping_forward_now(); - if (!new->enable || new->enable(new) == 0) { -@@ -451,7 +458,8 @@ static int change_clocksource(void *data) - } - timekeeping_update(true); - -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - return 0; - } -@@ -498,11 +506,11 @@ void getrawmonotonic(struct timespec *ts) - s64 nsecs; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - nsecs = timekeeping_get_ns_raw(); - *ts = timekeeper.raw_time; - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - timespec_add_ns(ts, nsecs); - } -@@ -518,11 +526,11 @@ int timekeeping_valid_for_hres(void) - int ret; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - ret = timekeeper.clock->flags & CLOCK_SOURCE_VALID_FOR_HRES; - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - return ret; - } -@@ -535,11 +543,11 @@ u64 timekeeping_max_deferment(void) - unsigned long seq; - u64 ret; - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - ret = timekeeper.clock->max_idle_ns; - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - return ret; - } -@@ -586,11 +594,13 @@ void __init timekeeping_init(void) - read_persistent_clock(&now); - read_boot_clock(&boot); - -- seqlock_init(&timekeeper.lock); -+ raw_spin_lock_init(&timekeeper.lock); -+ seqcount_init(&timekeeper.seq); - - ntp_init(); - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - clock = clocksource_default_clock(); - if (clock->enable) - clock->enable(clock); -@@ -608,7 +618,8 @@ void __init timekeeping_init(void) - -boot.tv_sec, -boot.tv_nsec); - timekeeper.total_sleep_time.tv_sec = 0; - timekeeper.total_sleep_time.tv_nsec = 0; -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - } - - /* time in seconds when suspend began */ -@@ -657,7 +668,8 @@ void timekeeping_inject_sleeptime(struct timespec *delta) - if (!(ts.tv_sec == 0 && ts.tv_nsec == 0)) - return; - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - timekeeping_forward_now(); - -@@ -665,7 +677,8 @@ void timekeeping_inject_sleeptime(struct timespec *delta) - - timekeeping_update(true); - -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - /* signal hrtimers about time change */ - clock_was_set(); -@@ -688,7 +701,8 @@ static void timekeeping_resume(void) - - clocksource_resume(); - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) { - ts = timespec_sub(ts, timekeeping_suspend_time); -@@ -698,7 +712,8 @@ static void timekeeping_resume(void) - timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock); - timekeeper.ntp_error = 0; - timekeeping_suspended = 0; -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - touch_softlockup_watchdog(); - -@@ -716,7 +731,8 @@ static int timekeeping_suspend(void) - - read_persistent_clock(&timekeeping_suspend_time); - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - timekeeping_forward_now(); - timekeeping_suspended = 1; - -@@ -739,7 +755,8 @@ static int timekeeping_suspend(void) - timekeeping_suspend_time = - timespec_add(timekeeping_suspend_time, delta_delta); - } -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - - clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); - clocksource_suspend(); -@@ -998,7 +1015,8 @@ static void update_wall_time(void) - int shift = 0, maxshift; - unsigned long flags; - -- write_seqlock_irqsave(&timekeeper.lock, flags); -+ raw_spin_lock_irqsave(&timekeeper.lock, flags); -+ write_seqcount_begin(&timekeeper.seq); - - /* Make sure we're fully resumed: */ - if (unlikely(timekeeping_suspended)) -@@ -1086,8 +1104,8 @@ static void update_wall_time(void) - timekeeping_update(false); - - out: -- write_sequnlock_irqrestore(&timekeeper.lock, flags); -- -+ write_seqcount_end(&timekeeper.seq); -+ raw_spin_unlock_irqrestore(&timekeeper.lock, flags); - } - - /** -@@ -1133,13 +1151,13 @@ void get_monotonic_boottime(struct timespec *ts) - WARN_ON(timekeeping_suspended); - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - *ts = timekeeper.xtime; - tomono = timekeeper.wall_to_monotonic; - sleep = timekeeper.total_sleep_time; - nsecs = timekeeping_get_ns(); - -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, - ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs); -@@ -1190,10 +1208,10 @@ struct timespec current_kernel_time(void) - unsigned long seq; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - now = timekeeper.xtime; -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - return now; - } -@@ -1205,11 +1223,11 @@ struct timespec get_monotonic_coarse(void) - unsigned long seq; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - - now = timekeeper.xtime; - mono = timekeeper.wall_to_monotonic; -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - set_normalized_timespec(&now, now.tv_sec + mono.tv_sec, - now.tv_nsec + mono.tv_nsec); -@@ -1241,11 +1259,11 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, - unsigned long seq; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - *xtim = timekeeper.xtime; - *wtom = timekeeper.wall_to_monotonic; - *sleep = timekeeper.total_sleep_time; -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - } - - /** -@@ -1257,9 +1275,9 @@ ktime_t ktime_get_monotonic_offset(void) - struct timespec wtom; - - do { -- seq = read_seqbegin(&timekeeper.lock); -+ seq = read_seqcount_begin(&timekeeper.seq); - wtom = timekeeper.wall_to_monotonic; -- } while (read_seqretry(&timekeeper.lock, seq)); -+ } while (read_seqcount_retry(&timekeeper.seq, seq)); - - return timespec_to_ktime(wtom); - } -@@ -1274,7 +1292,9 @@ EXPORT_SYMBOL_GPL(ktime_get_monotonic_offset); - */ - void xtime_update(unsigned long ticks) - { -- write_seqlock(&xtime_lock); -+ raw_spin_lock(&xtime_lock); -+ write_seqcount_begin(&xtime_seq); - do_timer(ticks); -- write_sequnlock(&xtime_lock); -+ write_seqcount_end(&xtime_seq); -+ raw_spin_unlock(&xtime_lock); - } diff --git a/debian/patches/features/all/rt/0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch b/debian/patches/features/all/rt/0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch deleted file mode 100644 index f3a49d896..000000000 --- a/debian/patches/features/all/rt/0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 83f61475fc133df6805eb883f2598c255527acfd Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:29:24 -0500 -Subject: [029/256] drivers/net: Use disable_irq_nosync() in 8139too - -Use disable_irq_nosync() instead of disable_irq() as this might be -called in atomic context with netpoll. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner ---- - drivers/net/ethernet/realtek/8139too.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c -index df7fd8d..7ce74f6 100644 ---- a/drivers/net/ethernet/realtek/8139too.c -+++ b/drivers/net/ethernet/realtek/8139too.c -@@ -2240,7 +2240,7 @@ static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance) - */ - static void rtl8139_poll_controller(struct net_device *dev) - { -- disable_irq(dev->irq); -+ disable_irq_nosync(dev->irq); - rtl8139_interrupt(dev->irq, dev); - enable_irq(dev->irq); - } diff --git a/debian/patches/features/all/rt/0080-genirq-Disable-random-call-on-preempt-rt.patch b/debian/patches/features/all/rt/0080-genirq-Disable-random-call-on-preempt-rt.patch deleted file mode 100644 index c817b5b92..000000000 --- a/debian/patches/features/all/rt/0080-genirq-Disable-random-call-on-preempt-rt.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 6f4dcb0881ab4b7ed02d1a1f4b6936243821c950 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 21 Jul 2009 16:07:37 +0200 -Subject: [080/256] genirq: Disable random call on preempt-rt - -The random call introduces high latencies and is almost -unused. Disable it for -rt. - -Signed-off-by: Thomas Gleixner ---- - kernel/irq/handle.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c -index bdb1803..982793c 100644 ---- a/kernel/irq/handle.c -+++ b/kernel/irq/handle.c -@@ -172,8 +172,11 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action) - action = action->next; - } while (action); - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ /* FIXME: Can we unbreak that ? */ - if (random & IRQF_SAMPLE_RANDOM) - add_interrupt_randomness(irq); -+#endif - - if (!noirqdebug) - note_interrupt(irq, desc, retval); diff --git a/debian/patches/features/all/rt/0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch b/debian/patches/features/all/rt/0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch deleted file mode 100644 index 365453327..000000000 --- a/debian/patches/features/all/rt/0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0cf4a0f832a996e67a51ea51c9ae73ddcf60b76d Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Tue, 11 Oct 2011 23:56:23 -0400 -Subject: [091/256] slab: Fix __do_drain to use the right array cache - -The array cache in __do_drain() was using the cpu_cache_get() function -which uses smp_processor_id() to get the proper array. On mainline, this -is fine as __do_drain() is called by for_each_cpu() which runs -__do_drain() on the CPU it is processing. In RT locks are used instead -and __do_drain() is only called from a single CPU. This can cause the -accounting to be off and trigger the following bug: - -slab error in kmem_cache_destroy(): cache `nfs_write_data': Can't free all objects -Pid: 2905, comm: rmmod Not tainted 3.0.6-test-rt17+ #78 -Call Trace: - [] kmem_cache_destroy+0xa0/0xdf - [] nfs_destroy_writepagecache+0x49/0x4e [nfs] - [] exit_nfs_fs+0xe/0x46 [nfs] - [] sys_delete_module+0x1ba/0x22c - [] ? audit_syscall_entry+0x11c/0x148 - [] system_call_fastpath+0x16/0x1b - -This can be easily triggered by a simple while loop: - -# while :; do modprobe nfs; rmmod nfs; done - -The proper function to use is cpu_cache_get_on_cpu(). It works for both -RT and non-RT as the non-RT passes in smp_processor_id() into -__do_drain(). - -Signed-off-by: Steven Rostedt -Cc: Luis Claudio R. Goncalves -Cc: Clark Williams -Cc: Peter Zijlstra -Link: http://lkml.kernel.org/r/1318391783.13262.11.camel@gandalf.stny.rr.com -Signed-off-by: Thomas Gleixner ---- - mm/slab.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/mm/slab.c b/mm/slab.c -index dc84364..341748b 100644 ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -2638,7 +2638,7 @@ static void __do_drain(void *arg, unsigned int cpu) - struct array_cache *ac; - int node = cpu_to_mem(cpu); - -- ac = cpu_cache_get(cachep); -+ ac = cpu_cache_get_on_cpu(cachep, cpu); - spin_lock(&cachep->nodelists[node]->list_lock); - free_block(cachep, ac->entry, ac->avail, node); - spin_unlock(&cachep->nodelists[node]->list_lock); diff --git a/debian/patches/features/all/rt/0102-panic-disable-random-on-rt.patch b/debian/patches/features/all/rt/0102-panic-disable-random-on-rt.patch deleted file mode 100644 index 578164cdc..000000000 --- a/debian/patches/features/all/rt/0102-panic-disable-random-on-rt.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e6884b5683aea73e316c560ce2c86b58905e25e0 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 7 Jun 2012 07:46:55 -0400 -Subject: [102/256] panic-disable-random-on-rt - ---- - kernel/panic.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/kernel/panic.c b/kernel/panic.c -index 9ed023b..3c3ace0 100644 ---- a/kernel/panic.c -+++ b/kernel/panic.c -@@ -363,9 +363,11 @@ static u64 oops_id; - - static int init_oops_id(void) - { -+#ifndef CONFIG_PREEMPT_RT_FULL - if (!oops_id) - get_random_bytes(&oops_id, sizeof(oops_id)); - else -+#endif - oops_id++; - - return 0; diff --git a/debian/patches/features/all/rt/0106-net-ipv4-route-use-locks-on-up-rt.patch.patch b/debian/patches/features/all/rt/0106-net-ipv4-route-use-locks-on-up-rt.patch.patch deleted file mode 100644 index 22fa0a626..000000000 --- a/debian/patches/features/all/rt/0106-net-ipv4-route-use-locks-on-up-rt.patch.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 23d7a4fb4b0d55e0c90963b2880651d8bb57c6aa Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 15 Jul 2011 16:24:45 +0200 -Subject: [106/256] net-ipv4-route-use-locks-on-up-rt.patch - -Signed-off-by: Thomas Gleixner ---- - net/ipv4/route.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/ipv4/route.c b/net/ipv4/route.c -index 167ea10..eea5d9e 100644 ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -250,7 +250,7 @@ struct rt_hash_bucket { - }; - - #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) || \ -- defined(CONFIG_PROVE_LOCKING) -+ defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_PREEMPT_RT_FULL) - /* - * Instead of using one spinlock for each rt_hash_bucket, we use a table of spinlocks - * The size of this table is a power of two and depends on the number of CPUS. diff --git a/debian/patches/features/all/rt/0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch b/debian/patches/features/all/rt/0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch deleted file mode 100644 index fb7a5848e..000000000 --- a/debian/patches/features/all/rt/0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 2f92092b4be1b601d635ff03c522be83b8458c28 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 24 Jun 2011 20:39:24 +0200 -Subject: [107/256] workqueue-avoid-the-lock-in-cpu-dying.patch - -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 30 ++++++++++++++++++++---------- - 1 file changed, 20 insertions(+), 10 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 50e0d00..3fd5280 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -3505,6 +3505,25 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, - kthread_stop(new_trustee); - return NOTIFY_BAD; - } -+ break; -+ case CPU_POST_DEAD: -+ case CPU_UP_CANCELED: -+ case CPU_DOWN_FAILED: -+ case CPU_ONLINE: -+ break; -+ case CPU_DYING: -+ /* -+ * We access this lockless. We are on the dying CPU -+ * and called from stomp machine. -+ * -+ * Before this, the trustee and all workers except for -+ * the ones which are still executing works from -+ * before the last CPU down must be on the cpu. After -+ * this, they'll all be diasporas. -+ */ -+ gcwq->flags |= GCWQ_DISASSOCIATED; -+ default: -+ goto out; - } - - /* some are called w/ irq disabled, don't disturb irq status */ -@@ -3524,16 +3543,6 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, - gcwq->first_idle = new_worker; - break; - -- case CPU_DYING: -- /* -- * Before this, the trustee and all workers except for -- * the ones which are still executing works from -- * before the last CPU down must be on the cpu. After -- * this, they'll all be diasporas. -- */ -- gcwq->flags |= GCWQ_DISASSOCIATED; -- break; -- - case CPU_POST_DEAD: - gcwq->trustee_state = TRUSTEE_BUTCHER; - /* fall through */ -@@ -3567,6 +3576,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, - - spin_unlock_irqrestore(&gcwq->lock, flags); - -+out: - return notifier_from_errno(0); - } - diff --git a/debian/patches/features/all/rt/0109-timers-preempt-rt-support.patch b/debian/patches/features/all/rt/0109-timers-preempt-rt-support.patch deleted file mode 100644 index e8e946ae4..000000000 --- a/debian/patches/features/all/rt/0109-timers-preempt-rt-support.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 8dfa8ea091ef006a7e1dd855cc37328cb4794c5d Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:30:20 -0500 -Subject: [109/256] timers: preempt-rt support - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner ---- - kernel/timer.c | 18 +++++++++++++++++- - 1 file changed, 17 insertions(+), 1 deletion(-) - -diff --git a/kernel/timer.c b/kernel/timer.c -index d7ad9d0..05cee31 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1344,6 +1344,22 @@ unsigned long get_next_timer_interrupt(unsigned long now) - */ - if (cpu_is_offline(smp_processor_id())) - return now + NEXT_TIMER_MAX_DELTA; -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ /* -+ * On PREEMPT_RT we cannot sleep here. If the trylock does not -+ * succeed then we return the worst-case 'expires in 1 tick' -+ * value: -+ */ -+ if (spin_trylock(&base->lock)) { -+ if (time_before_eq(base->next_timer, base->timer_jiffies)) -+ base->next_timer = __next_timer_interrupt(base); -+ expires = base->next_timer; -+ spin_unlock(&base->lock); -+ } else { -+ expires = now + 1; -+ } -+#else - spin_lock(&base->lock); - if (time_before_eq(base->next_timer, base->timer_jiffies)) - base->next_timer = __next_timer_interrupt(base); -@@ -1352,7 +1368,7 @@ unsigned long get_next_timer_interrupt(unsigned long now) - - if (time_before_eq(expires, now)) - return now; -- -+#endif - return cmp_next_hrtimer_event(now, expires); - } - #endif diff --git a/debian/patches/features/all/rt/0110-timers-fix-timer-hotplug-on-rt.patch b/debian/patches/features/all/rt/0110-timers-fix-timer-hotplug-on-rt.patch deleted file mode 100644 index 516fdd439..000000000 --- a/debian/patches/features/all/rt/0110-timers-fix-timer-hotplug-on-rt.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 8c251d0d40bf371f4f2c7421075c3d6007dc33e2 Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:30:32 -0500 -Subject: [110/256] timers: fix timer hotplug on -rt - -Here we are in the CPU_DEAD notifier, and we must not sleep nor -enable interrupts. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner ---- - kernel/timer.c | 12 +++++++++--- - 1 file changed, 9 insertions(+), 3 deletions(-) - -diff --git a/kernel/timer.c b/kernel/timer.c -index 05cee31..7ba0602 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1764,6 +1764,7 @@ static void __cpuinit migrate_timers(int cpu) - { - struct tvec_base *old_base; - struct tvec_base *new_base; -+ unsigned long flags; - int i; - - BUG_ON(cpu_online(cpu)); -@@ -1773,8 +1774,11 @@ static void __cpuinit migrate_timers(int cpu) - * The caller is globally serialized and nobody else - * takes two locks at once, deadlock is not possible. - */ -- spin_lock_irq(&new_base->lock); -- spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING); -+ local_irq_save(flags); -+ while (!spin_trylock(&new_base->lock)) -+ cpu_relax(); -+ while (!spin_trylock(&old_base->lock)) -+ cpu_relax(); - - BUG_ON(old_base->running_timer); - -@@ -1788,7 +1792,9 @@ static void __cpuinit migrate_timers(int cpu) - } - - spin_unlock(&old_base->lock); -- spin_unlock_irq(&new_base->lock); -+ spin_unlock(&new_base->lock); -+ local_irq_restore(flags); -+ - put_cpu_var(tvec_bases); - } - #endif /* CONFIG_HOTPLUG_CPU */ diff --git a/debian/patches/features/all/rt/0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch b/debian/patches/features/all/rt/0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch deleted file mode 100644 index 039b0660d..000000000 --- a/debian/patches/features/all/rt/0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 440e42303f19c9686c15b9c8321a96d0c09e46b1 Mon Sep 17 00:00:00 2001 -From: Yong Zhang -Date: Thu, 13 Oct 2011 15:52:30 +0800 -Subject: [118/256] hrtimer: Add missing debug_activate() aid [Was: Re: - [ANNOUNCE] 3.0.6-rt17] - -On Fri, Oct 07, 2011 at 10:25:25AM -0700, Fernando Lopez-Lezcano wrote: -> On 10/06/2011 06:15 PM, Thomas Gleixner wrote: -> >Dear RT Folks, -> > -> >I'm pleased to announce the 3.0.6-rt17 release. -> -> Hi and thanks again. So far this one is not hanging which is very -> good news. But I still see the hrtimer_fixup_activate warnings I -> reported for rt16... - -Hi Fernando, - -I think below patch will smooth your concern? - -Thanks, -Yong ---- - kernel/hrtimer.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 358442b..d363df8 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -1042,6 +1042,7 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, - * remove it again and report a failure. This avoids - * stale base->first entries. - */ -+ debug_deactivate(timer); - __remove_hrtimer(timer, new_base, - timer->state & HRTIMER_STATE_CALLBACK, 0); - } diff --git a/debian/patches/features/all/rt/0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch b/debian/patches/features/all/rt/0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch deleted file mode 100644 index e867908c7..000000000 --- a/debian/patches/features/all/rt/0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch +++ /dev/null @@ -1,434 +0,0 @@ -From 2d5eddded739b6a17401f4bdb0d3f09e18f7fa2f Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Tue, 27 Sep 2011 13:56:50 -0400 -Subject: [156/256] ring-buffer: Convert reader_lock from raw_spin_lock into - spin_lock - -The reader_lock is mostly taken in normal context with interrupts enabled. -But because ftrace_dump() can happen anywhere, it is used as a spin lock -and in some cases a check to in_nmi() is performed to determine if the -ftrace_dump() was initiated from an NMI and if it is, the lock is not taken. - -But having the lock as a raw_spin_lock() causes issues with the real-time -kernel as the lock is held during allocation and freeing of the buffer. -As memory locks convert into mutexes, keeping the reader_lock as a spin_lock -causes problems. - -Converting the reader_lock is not straight forward as we must still deal -with the ftrace_dump() happening not only from an NMI but also from -true interrupt context in PREEPMT_RT. - -Two wrapper functions are created to take and release the reader lock: - - int read_buffer_lock(cpu_buffer, unsigned long *flags) - void read_buffer_unlock(cpu_buffer, unsigned long flags, int locked) - -The read_buffer_lock() returns 1 if it actually took the lock, disables -interrupts and updates the flags. The only time it returns 0 is in the -case of a ftrace_dump() happening in an unsafe context. - -The read_buffer_unlock() checks the return of locked and will simply -unlock the spin lock if it was successfully taken. - -Instead of just having this in specific cases that the NMI might call -into, all instances of the reader_lock is converted to the wrapper -functions to make this a bit simpler to read and less error prone. - -Signed-off-by: Steven Rostedt -Cc: Peter Zijlstra -Cc: Clark Williams -Link: http://lkml.kernel.org/r/1317146210.26514.33.camel@gandalf.stny.rr.com -Signed-off-by: Thomas Gleixner ---- - kernel/trace/ring_buffer.c | 151 ++++++++++++++++++++++++-------------------- - 1 file changed, 81 insertions(+), 70 deletions(-) - -diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c -index cf8d11e..24efd16 100644 ---- a/kernel/trace/ring_buffer.c -+++ b/kernel/trace/ring_buffer.c -@@ -446,7 +446,7 @@ struct ring_buffer_per_cpu { - int cpu; - atomic_t record_disabled; - struct ring_buffer *buffer; -- raw_spinlock_t reader_lock; /* serialize readers */ -+ spinlock_t reader_lock; /* serialize readers */ - arch_spinlock_t lock; - struct lock_class_key lock_key; - struct list_head *pages; -@@ -1017,6 +1017,44 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer, - return -ENOMEM; - } - -+static inline int ok_to_lock(void) -+{ -+ if (in_nmi()) -+ return 0; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (in_atomic()) -+ return 0; -+#endif -+ return 1; -+} -+ -+static int -+read_buffer_lock(struct ring_buffer_per_cpu *cpu_buffer, -+ unsigned long *flags) -+{ -+ /* -+ * If an NMI die dumps out the content of the ring buffer -+ * do not grab locks. We also permanently disable the ring -+ * buffer too. A one time deal is all you get from reading -+ * the ring buffer from an NMI. -+ */ -+ if (!ok_to_lock()) { -+ if (spin_trylock_irqsave(&cpu_buffer->reader_lock, *flags)) -+ return 1; -+ tracing_off_permanent(); -+ return 0; -+ } -+ spin_lock_irqsave(&cpu_buffer->reader_lock, *flags); -+ return 1; -+} -+ -+static void -+read_buffer_unlock(struct ring_buffer_per_cpu *cpu_buffer, -+ unsigned long flags, int locked) -+{ -+ if (locked) -+ spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+} - static struct ring_buffer_per_cpu * - rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) - { -@@ -1032,7 +1070,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) - - cpu_buffer->cpu = cpu; - cpu_buffer->buffer = buffer; -- raw_spin_lock_init(&cpu_buffer->reader_lock); -+ spin_lock_init(&cpu_buffer->reader_lock); - lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key); - cpu_buffer->lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; - -@@ -1227,9 +1265,11 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages) - { - struct buffer_page *bpage; - struct list_head *p; -+ unsigned long flags; - unsigned i; -+ int locked; - -- raw_spin_lock_irq(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - rb_head_page_deactivate(cpu_buffer); - - for (i = 0; i < nr_pages; i++) { -@@ -1247,7 +1287,7 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages) - rb_check_pages(cpu_buffer); - - out: -- raw_spin_unlock_irq(&cpu_buffer->reader_lock); -+ read_buffer_unlock(cpu_buffer, flags, locked); - } - - static void -@@ -1256,9 +1296,11 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer, - { - struct buffer_page *bpage; - struct list_head *p; -+ unsigned long flags; - unsigned i; -+ int locked; - -- raw_spin_lock_irq(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - rb_head_page_deactivate(cpu_buffer); - - for (i = 0; i < nr_pages; i++) { -@@ -1273,7 +1315,7 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer, - rb_check_pages(cpu_buffer); - - out: -- raw_spin_unlock_irq(&cpu_buffer->reader_lock); -+ read_buffer_unlock(cpu_buffer, flags, locked); - } - - /** -@@ -2714,7 +2756,7 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) - return 0; - - cpu_buffer = buffer->buffers[cpu]; -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ spin_lock_irqsave(&cpu_buffer->reader_lock, flags); - /* - * if the tail is on reader_page, oldest time stamp is on the reader - * page -@@ -2724,7 +2766,7 @@ unsigned long ring_buffer_oldest_event_ts(struct ring_buffer *buffer, int cpu) - else - bpage = rb_set_head_page(cpu_buffer); - ret = bpage->page->time_stamp; -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); - - return ret; - } -@@ -2888,15 +2930,16 @@ void ring_buffer_iter_reset(struct ring_buffer_iter *iter) - { - struct ring_buffer_per_cpu *cpu_buffer; - unsigned long flags; -+ int locked; - - if (!iter) - return; - - cpu_buffer = iter->cpu_buffer; - -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - rb_iter_reset(iter); -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - } - EXPORT_SYMBOL_GPL(ring_buffer_iter_reset); - -@@ -3314,21 +3357,6 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts) - } - EXPORT_SYMBOL_GPL(ring_buffer_iter_peek); - --static inline int rb_ok_to_lock(void) --{ -- /* -- * If an NMI die dumps out the content of the ring buffer -- * do not grab locks. We also permanently disable the ring -- * buffer too. A one time deal is all you get from reading -- * the ring buffer from an NMI. -- */ -- if (likely(!in_nmi())) -- return 1; -- -- tracing_off_permanent(); -- return 0; --} -- - /** - * ring_buffer_peek - peek at the next event to be read - * @buffer: The ring buffer to read -@@ -3346,22 +3374,17 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts, - struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; - struct ring_buffer_event *event; - unsigned long flags; -- int dolock; -+ int locked; - - if (!cpumask_test_cpu(cpu, buffer->cpumask)) - return NULL; - -- dolock = rb_ok_to_lock(); - again: -- local_irq_save(flags); -- if (dolock) -- raw_spin_lock(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - event = rb_buffer_peek(cpu_buffer, ts, lost_events); - if (event && event->type_len == RINGBUF_TYPE_PADDING) - rb_advance_reader(cpu_buffer); -- if (dolock) -- raw_spin_unlock(&cpu_buffer->reader_lock); -- local_irq_restore(flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - if (event && event->type_len == RINGBUF_TYPE_PADDING) - goto again; -@@ -3383,11 +3406,12 @@ ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts) - struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; - struct ring_buffer_event *event; - unsigned long flags; -+ int locked; - - again: -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - event = rb_iter_peek(iter, ts); -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - if (event && event->type_len == RINGBUF_TYPE_PADDING) - goto again; -@@ -3413,9 +3437,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, - struct ring_buffer_per_cpu *cpu_buffer; - struct ring_buffer_event *event = NULL; - unsigned long flags; -- int dolock; -- -- dolock = rb_ok_to_lock(); -+ int locked; - - again: - /* might be called in atomic */ -@@ -3425,9 +3447,7 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, - goto out; - - cpu_buffer = buffer->buffers[cpu]; -- local_irq_save(flags); -- if (dolock) -- raw_spin_lock(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - - event = rb_buffer_peek(cpu_buffer, ts, lost_events); - if (event) { -@@ -3435,9 +3455,8 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts, - rb_advance_reader(cpu_buffer); - } - -- if (dolock) -- raw_spin_unlock(&cpu_buffer->reader_lock); -- local_irq_restore(flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); -+ - - out: - preempt_enable(); -@@ -3522,17 +3541,18 @@ ring_buffer_read_start(struct ring_buffer_iter *iter) - { - struct ring_buffer_per_cpu *cpu_buffer; - unsigned long flags; -+ int locked; - - if (!iter) - return; - - cpu_buffer = iter->cpu_buffer; - -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - arch_spin_lock(&cpu_buffer->lock); - rb_iter_reset(iter); - arch_spin_unlock(&cpu_buffer->lock); -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - } - EXPORT_SYMBOL_GPL(ring_buffer_read_start); - -@@ -3566,8 +3586,9 @@ ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts) - struct ring_buffer_event *event; - struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; - unsigned long flags; -+ int locked; - -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - again: - event = rb_iter_peek(iter, ts); - if (!event) -@@ -3578,7 +3599,7 @@ ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts) - - rb_advance_iter(iter); - out: -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - return event; - } -@@ -3643,13 +3664,14 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu) - { - struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; - unsigned long flags; -+ int locked; - - if (!cpumask_test_cpu(cpu, buffer->cpumask)) - return; - - atomic_inc(&cpu_buffer->record_disabled); - -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - - if (RB_WARN_ON(cpu_buffer, local_read(&cpu_buffer->committing))) - goto out; -@@ -3661,7 +3683,7 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu) - arch_spin_unlock(&cpu_buffer->lock); - - out: -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - atomic_dec(&cpu_buffer->record_disabled); - } -@@ -3688,22 +3710,16 @@ int ring_buffer_empty(struct ring_buffer *buffer) - { - struct ring_buffer_per_cpu *cpu_buffer; - unsigned long flags; -- int dolock; -+ int locked; - int cpu; - int ret; - -- dolock = rb_ok_to_lock(); -- - /* yes this is racy, but if you don't like the race, lock the buffer */ - for_each_buffer_cpu(buffer, cpu) { - cpu_buffer = buffer->buffers[cpu]; -- local_irq_save(flags); -- if (dolock) -- raw_spin_lock(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - ret = rb_per_cpu_empty(cpu_buffer); -- if (dolock) -- raw_spin_unlock(&cpu_buffer->reader_lock); -- local_irq_restore(flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - if (!ret) - return 0; -@@ -3722,22 +3738,16 @@ int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu) - { - struct ring_buffer_per_cpu *cpu_buffer; - unsigned long flags; -- int dolock; -+ int locked; - int ret; - - if (!cpumask_test_cpu(cpu, buffer->cpumask)) - return 1; - -- dolock = rb_ok_to_lock(); -- - cpu_buffer = buffer->buffers[cpu]; -- local_irq_save(flags); -- if (dolock) -- raw_spin_lock(&cpu_buffer->reader_lock); -+ locked = read_buffer_lock(cpu_buffer, &flags); - ret = rb_per_cpu_empty(cpu_buffer); -- if (dolock) -- raw_spin_unlock(&cpu_buffer->reader_lock); -- local_irq_restore(flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - return ret; - } -@@ -3912,6 +3922,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, - unsigned int commit; - unsigned int read; - u64 save_timestamp; -+ int locked; - int ret = -1; - - if (!cpumask_test_cpu(cpu, buffer->cpumask)) -@@ -3933,7 +3944,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, - if (!bpage) - goto out; - -- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); -+ locked = read_buffer_lock(cpu_buffer, &flags); - - reader = rb_get_reader_page(cpu_buffer); - if (!reader) -@@ -4057,7 +4068,7 @@ int ring_buffer_read_page(struct ring_buffer *buffer, - memset(&bpage->data[commit], 0, BUF_PAGE_SIZE - commit); - - out_unlock: -- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); -+ read_buffer_unlock(cpu_buffer, flags, locked); - - out: - return ret; diff --git a/debian/patches/features/all/rt/0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch b/debian/patches/features/all/rt/0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch deleted file mode 100644 index 0b2499c7f..000000000 --- a/debian/patches/features/all/rt/0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 64a36b17bf05d2ce7d7bca56896b295bcad0756f Mon Sep 17 00:00:00 2001 -From: John Kacur -Date: Mon, 14 Nov 2011 02:44:42 +0100 -Subject: [186/256] rcu: Fix macro substitution for synchronize_rcu_bh() on RT -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -kernel/rcutorture.c:492: error: ‘synchronize_rcu_bh’ undeclared here (not in a function) - -synchronize_rcu_bh() is not just called as a normal function, but can -also be referenced as a function pointer. When CONFIG_PREEMPT_RT_FULL -is enabled, synchronize_rcu_bh() is defined as synchronize_rcu(), but -needs to be defined without the parenthesis because the compiler will -complain when synchronize_rcu_bh is referenced as a function pointer -and not a function. - -Signed-off-by: John Kacur -Cc: Paul McKenney -Cc: stable-rt@vger.kernel.org -Link: http://lkml.kernel.org/r/1321235083-21756-1-git-send-email-jkacur@redhat.com -Signed-off-by: Thomas Gleixner ---- - include/linux/rcutree.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h -index 5b2d03e..ba517b5 100644 ---- a/include/linux/rcutree.h -+++ b/include/linux/rcutree.h -@@ -60,7 +60,7 @@ static inline void exit_rcu(void) - #ifndef CONFIG_PREEMPT_RT_FULL - extern void synchronize_rcu_bh(void); - #else --# define synchronize_rcu_bh() synchronize_rcu() -+# define synchronize_rcu_bh synchronize_rcu - #endif - extern void synchronize_sched_expedited(void); - extern void synchronize_rcu_expedited(void); diff --git a/debian/patches/features/all/rt/0191-lglocks-rt.patch.patch b/debian/patches/features/all/rt/0191-lglocks-rt.patch.patch deleted file mode 100644 index 137b9aa2e..000000000 --- a/debian/patches/features/all/rt/0191-lglocks-rt.patch.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 1ae3c12ddb6ad4e84d6d507e724921d55373a649 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 15 Jun 2011 11:02:21 +0200 -Subject: [191/256] lglocks-rt.patch - -Signed-off-by: Thomas Gleixner ---- - include/linux/lglock.h | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 99 insertions(+) - -diff --git a/include/linux/lglock.h b/include/linux/lglock.h -index 87f402c..52b289f 100644 ---- a/include/linux/lglock.h -+++ b/include/linux/lglock.h -@@ -71,6 +71,8 @@ - extern void name##_global_lock_online(void); \ - extern void name##_global_unlock_online(void); \ - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #define DEFINE_LGLOCK(name) \ - \ - DEFINE_SPINLOCK(name##_cpu_lock); \ -@@ -197,4 +199,101 @@ - preempt_enable(); \ - } \ - EXPORT_SYMBOL(name##_global_unlock); -+ -+#else /* !PREEMPT_RT_FULL */ -+#define DEFINE_LGLOCK(name) \ -+ \ -+ DEFINE_PER_CPU(struct rt_mutex, name##_lock); \ -+ DEFINE_LGLOCK_LOCKDEP(name); \ -+ \ -+ void name##_lock_init(void) { \ -+ int i; \ -+ LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ -+ for_each_possible_cpu(i) { \ -+ struct rt_mutex *lock; \ -+ lock = &per_cpu(name##_lock, i); \ -+ rt_mutex_init(lock); \ -+ } \ -+ } \ -+ EXPORT_SYMBOL(name##_lock_init); \ -+ \ -+ void name##_local_lock(void) { \ -+ struct rt_mutex *lock; \ -+ migrate_disable(); \ -+ rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ -+ lock = &__get_cpu_var(name##_lock); \ -+ __rt_spin_lock(lock); \ -+ } \ -+ EXPORT_SYMBOL(name##_local_lock); \ -+ \ -+ void name##_local_unlock(void) { \ -+ struct rt_mutex *lock; \ -+ rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ -+ lock = &__get_cpu_var(name##_lock); \ -+ __rt_spin_unlock(lock); \ -+ migrate_enable(); \ -+ } \ -+ EXPORT_SYMBOL(name##_local_unlock); \ -+ \ -+ void name##_local_lock_cpu(int cpu) { \ -+ struct rt_mutex *lock; \ -+ rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ -+ lock = &per_cpu(name##_lock, cpu); \ -+ __rt_spin_lock(lock); \ -+ } \ -+ EXPORT_SYMBOL(name##_local_lock_cpu); \ -+ \ -+ void name##_local_unlock_cpu(int cpu) { \ -+ struct rt_mutex *lock; \ -+ rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ -+ lock = &per_cpu(name##_lock, cpu); \ -+ __rt_spin_unlock(lock); \ -+ } \ -+ EXPORT_SYMBOL(name##_local_unlock_cpu); \ -+ \ -+ void name##_global_lock_online(void) { \ -+ int i; \ -+ rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ -+ for_each_online_cpu(i) { \ -+ struct rt_mutex *lock; \ -+ lock = &per_cpu(name##_lock, i); \ -+ __rt_spin_lock(lock); \ -+ } \ -+ } \ -+ EXPORT_SYMBOL(name##_global_lock_online); \ -+ \ -+ void name##_global_unlock_online(void) { \ -+ int i; \ -+ rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ -+ for_each_online_cpu(i) { \ -+ struct rt_mutex *lock; \ -+ lock = &per_cpu(name##_lock, i); \ -+ __rt_spin_unlock(lock); \ -+ } \ -+ } \ -+ EXPORT_SYMBOL(name##_global_unlock_online); \ -+ \ -+ void name##_global_lock(void) { \ -+ int i; \ -+ rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ -+ for_each_possible_cpu(i) { \ -+ struct rt_mutex *lock; \ -+ lock = &per_cpu(name##_lock, i); \ -+ __rt_spin_lock(lock); \ -+ } \ -+ } \ -+ EXPORT_SYMBOL(name##_global_lock); \ -+ \ -+ void name##_global_unlock(void) { \ -+ int i; \ -+ rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ -+ for_each_possible_cpu(i) { \ -+ struct rt_mutex *lock; \ -+ lock = &per_cpu(name##_lock, i); \ -+ __rt_spin_unlock(lock); \ -+ } \ -+ } \ -+ EXPORT_SYMBOL(name##_global_unlock); -+#endif /* PRREMPT_RT_FULL */ -+ - #endif diff --git a/debian/patches/features/all/rt/0208-workqueue-Fix-cpuhotplug-trainwreck.patch b/debian/patches/features/all/rt/0208-workqueue-Fix-cpuhotplug-trainwreck.patch deleted file mode 100644 index 022da238a..000000000 --- a/debian/patches/features/all/rt/0208-workqueue-Fix-cpuhotplug-trainwreck.patch +++ /dev/null @@ -1,807 +0,0 @@ -From 5e6a742920db44d54cbd1826318a2af372c36bf4 Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Fri, 30 Sep 2011 11:57:58 +0200 -Subject: [208/256] workqueue: Fix cpuhotplug trainwreck - -The current workqueue code does crazy stuff on cpu unplug, it relies on -forced affine breakage, thereby violating per-cpu expectations. Worse, -it tries to re-attach to a cpu if the thing comes up again before all -previously queued works are finished. This breaks (admittedly bonkers) -cpu-hotplug use that relies on a down-up cycle to push all usage away. - -Introduce a new WQ_NON_AFFINE flag that indicates a per-cpu workqueue -will not respect cpu affinity and use this to migrate all its pending -works to whatever cpu is doing cpu-down. - -This also adds a warning for queue_on_cpu() users which warns when its -used on WQ_NON_AFFINE workqueues for the API implies you care about -what cpu things are ran on when such workqueues cannot guarantee this. - -For the rest, simply flush all per-cpu works and don't mess about. -This also means that currently all workqueues that are manually -flushing things on cpu-down in order to provide the per-cpu guarantee -no longer need to do so. - -In short, we tell the WQ what we want it to do, provide validation for -this and loose ~250 lines of code. - -Signed-off-by: Peter Zijlstra -Signed-off-by: Thomas Gleixner ---- - include/linux/cpu.h | 6 +- - include/linux/workqueue.h | 5 +- - kernel/workqueue.c | 556 ++++++++++++--------------------------------- - 3 files changed, 152 insertions(+), 415 deletions(-) - -diff --git a/include/linux/cpu.h b/include/linux/cpu.h -index 00d2f6f8..a6bda1b 100644 ---- a/include/linux/cpu.h -+++ b/include/linux/cpu.h -@@ -75,8 +75,10 @@ enum { - /* migration should happen before other stuff but after perf */ - CPU_PRI_PERF = 20, - CPU_PRI_MIGRATION = 10, -- /* prepare workqueues for other notifiers */ -- CPU_PRI_WORKQUEUE = 5, -+ -+ CPU_PRI_WORKQUEUE_ACTIVE = 5, /* prepare workqueues for others */ -+ CPU_PRI_NORMAL = 0, -+ CPU_PRI_WORKQUEUE_INACTIVE = -5, /* flush workqueues after others */ - }; - - #define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */ -diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h -index af15545..9849be1 100644 ---- a/include/linux/workqueue.h -+++ b/include/linux/workqueue.h -@@ -254,9 +254,10 @@ enum { - WQ_MEM_RECLAIM = 1 << 3, /* may be used for memory reclaim */ - WQ_HIGHPRI = 1 << 4, /* high priority */ - WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ -+ WQ_NON_AFFINE = 1 << 6, /* free to move works around cpus */ - -- WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */ -- WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */ -+ WQ_DRAINING = 1 << 7, /* internal: workqueue is draining */ -+ WQ_RESCUER = 1 << 8, /* internal: workqueue has rescuer */ - - WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ - WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */ -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 33d1095..ba977c4 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -41,6 +41,7 @@ - #include - #include - #include -+#include - - #include "workqueue_sched.h" - -@@ -57,20 +58,10 @@ enum { - WORKER_DIE = 1 << 1, /* die die die */ - WORKER_IDLE = 1 << 2, /* is idle */ - WORKER_PREP = 1 << 3, /* preparing to run works */ -- WORKER_ROGUE = 1 << 4, /* not bound to any cpu */ -- WORKER_REBIND = 1 << 5, /* mom is home, come back */ -- WORKER_CPU_INTENSIVE = 1 << 6, /* cpu intensive */ -- WORKER_UNBOUND = 1 << 7, /* worker is unbound */ -+ WORKER_CPU_INTENSIVE = 1 << 4, /* cpu intensive */ -+ WORKER_UNBOUND = 1 << 5, /* worker is unbound */ - -- WORKER_NOT_RUNNING = WORKER_PREP | WORKER_ROGUE | WORKER_REBIND | -- WORKER_CPU_INTENSIVE | WORKER_UNBOUND, -- -- /* gcwq->trustee_state */ -- TRUSTEE_START = 0, /* start */ -- TRUSTEE_IN_CHARGE = 1, /* trustee in charge of gcwq */ -- TRUSTEE_BUTCHER = 2, /* butcher workers */ -- TRUSTEE_RELEASE = 3, /* release workers */ -- TRUSTEE_DONE = 4, /* trustee is done */ -+ WORKER_NOT_RUNNING = WORKER_PREP | WORKER_CPU_INTENSIVE | WORKER_UNBOUND, - - BUSY_WORKER_HASH_ORDER = 6, /* 64 pointers */ - BUSY_WORKER_HASH_SIZE = 1 << BUSY_WORKER_HASH_ORDER, -@@ -84,7 +75,6 @@ enum { - (min two ticks) */ - MAYDAY_INTERVAL = HZ / 10, /* and then every 100ms */ - CREATE_COOLDOWN = HZ, /* time to breath after fail */ -- TRUSTEE_COOLDOWN = HZ / 10, /* for trustee draining */ - - /* - * Rescue workers are used only on emergencies and shared by -@@ -136,7 +126,6 @@ struct worker { - unsigned long last_active; /* L: last active timestamp */ - unsigned int flags; /* X: flags */ - int id; /* I: worker id */ -- struct work_struct rebind_work; /* L: rebind worker to cpu */ - int sleeping; /* None */ - }; - -@@ -164,10 +153,8 @@ struct global_cwq { - - struct ida worker_ida; /* L: for worker IDs */ - -- struct task_struct *trustee; /* L: for gcwq shutdown */ -- unsigned int trustee_state; /* L: trustee state */ -- wait_queue_head_t trustee_wait; /* trustee wait */ - struct worker *first_idle; /* L: first idle worker */ -+ wait_queue_head_t idle_wait; - } ____cacheline_aligned_in_smp; - - /* -@@ -969,13 +956,38 @@ static bool is_chained_work(struct workqueue_struct *wq) - return false; - } - --static void __queue_work(unsigned int cpu, struct workqueue_struct *wq, -- struct work_struct *work) -+static void ___queue_work(struct workqueue_struct *wq, struct global_cwq *gcwq, -+ struct work_struct *work) - { -- struct global_cwq *gcwq; - struct cpu_workqueue_struct *cwq; - struct list_head *worklist; - unsigned int work_flags; -+ -+ /* gcwq determined, get cwq and queue */ -+ cwq = get_cwq(gcwq->cpu, wq); -+ trace_workqueue_queue_work(gcwq->cpu, cwq, work); -+ -+ BUG_ON(!list_empty(&work->entry)); -+ -+ cwq->nr_in_flight[cwq->work_color]++; -+ work_flags = work_color_to_flags(cwq->work_color); -+ -+ if (likely(cwq->nr_active < cwq->max_active)) { -+ trace_workqueue_activate_work(work); -+ cwq->nr_active++; -+ worklist = gcwq_determine_ins_pos(gcwq, cwq); -+ } else { -+ work_flags |= WORK_STRUCT_DELAYED; -+ worklist = &cwq->delayed_works; -+ } -+ -+ insert_work(cwq, work, worklist, work_flags); -+} -+ -+static void __queue_work(unsigned int cpu, struct workqueue_struct *wq, -+ struct work_struct *work) -+{ -+ struct global_cwq *gcwq; - unsigned long flags; - - debug_work_activate(work); -@@ -1021,27 +1033,32 @@ static void __queue_work(unsigned int cpu, struct workqueue_struct *wq, - spin_lock_irqsave(&gcwq->lock, flags); - } - -- /* gcwq determined, get cwq and queue */ -- cwq = get_cwq(gcwq->cpu, wq); -- trace_workqueue_queue_work(cpu, cwq, work); -+ ___queue_work(wq, gcwq, work); - -- BUG_ON(!list_empty(&work->entry)); -+ spin_unlock_irqrestore(&gcwq->lock, flags); -+} - -- cwq->nr_in_flight[cwq->work_color]++; -- work_flags = work_color_to_flags(cwq->work_color); -+/** -+ * queue_work_on - queue work on specific cpu -+ * @cpu: CPU number to execute work on -+ * @wq: workqueue to use -+ * @work: work to queue -+ * -+ * Returns 0 if @work was already on a queue, non-zero otherwise. -+ * -+ * We queue the work to a specific CPU, the caller must ensure it -+ * can't go away. -+ */ -+static int -+__queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) -+{ -+ int ret = 0; - -- if (likely(cwq->nr_active < cwq->max_active)) { -- trace_workqueue_activate_work(work); -- cwq->nr_active++; -- worklist = gcwq_determine_ins_pos(gcwq, cwq); -- } else { -- work_flags |= WORK_STRUCT_DELAYED; -- worklist = &cwq->delayed_works; -+ if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { -+ __queue_work(cpu, wq, work); -+ ret = 1; - } -- -- insert_work(cwq, work, worklist, work_flags); -- -- spin_unlock_irqrestore(&gcwq->lock, flags); -+ return ret; - } - - /** -@@ -1058,34 +1075,19 @@ int queue_work(struct workqueue_struct *wq, struct work_struct *work) - { - int ret; - -- ret = queue_work_on(get_cpu_light(), wq, work); -+ ret = __queue_work_on(get_cpu_light(), wq, work); - put_cpu_light(); - - return ret; - } - EXPORT_SYMBOL_GPL(queue_work); - --/** -- * queue_work_on - queue work on specific cpu -- * @cpu: CPU number to execute work on -- * @wq: workqueue to use -- * @work: work to queue -- * -- * Returns 0 if @work was already on a queue, non-zero otherwise. -- * -- * We queue the work to a specific CPU, the caller must ensure it -- * can't go away. -- */ - int - queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) - { -- int ret = 0; -+ WARN_ON(wq->flags & WQ_NON_AFFINE); - -- if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { -- __queue_work(cpu, wq, work); -- ret = 1; -- } -- return ret; -+ return __queue_work_on(cpu, wq, work); - } - EXPORT_SYMBOL_GPL(queue_work_on); - -@@ -1131,6 +1133,8 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, - struct timer_list *timer = &dwork->timer; - struct work_struct *work = &dwork->work; - -+ WARN_ON((wq->flags & WQ_NON_AFFINE) && cpu != -1); -+ - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { - unsigned int lcpu; - -@@ -1196,12 +1200,13 @@ static void worker_enter_idle(struct worker *worker) - /* idle_list is LIFO */ - list_add(&worker->entry, &gcwq->idle_list); - -- if (likely(!(worker->flags & WORKER_ROGUE))) { -- if (too_many_workers(gcwq) && !timer_pending(&gcwq->idle_timer)) -- mod_timer(&gcwq->idle_timer, -- jiffies + IDLE_WORKER_TIMEOUT); -- } else -- wake_up_all(&gcwq->trustee_wait); -+ if (gcwq->nr_idle == gcwq->nr_workers) -+ wake_up_all(&gcwq->idle_wait); -+ -+ if (too_many_workers(gcwq) && !timer_pending(&gcwq->idle_timer)) { -+ mod_timer(&gcwq->idle_timer, -+ jiffies + IDLE_WORKER_TIMEOUT); -+ } - - /* sanity check nr_running */ - WARN_ON_ONCE(gcwq->nr_workers == gcwq->nr_idle && -@@ -1293,23 +1298,6 @@ __acquires(&gcwq->lock) - } - } - --/* -- * Function for worker->rebind_work used to rebind rogue busy workers -- * to the associated cpu which is coming back online. This is -- * scheduled by cpu up but can race with other cpu hotplug operations -- * and may be executed twice without intervening cpu down. -- */ --static void worker_rebind_fn(struct work_struct *work) --{ -- struct worker *worker = container_of(work, struct worker, rebind_work); -- struct global_cwq *gcwq = worker->gcwq; -- -- if (worker_maybe_bind_and_lock(worker)) -- worker_clr_flags(worker, WORKER_REBIND); -- -- spin_unlock_irq(&gcwq->lock); --} -- - static struct worker *alloc_worker(void) - { - struct worker *worker; -@@ -1318,7 +1306,6 @@ static struct worker *alloc_worker(void) - if (worker) { - INIT_LIST_HEAD(&worker->entry); - INIT_LIST_HEAD(&worker->scheduled); -- INIT_WORK(&worker->rebind_work, worker_rebind_fn); - /* on creation a worker is in !idle && prep state */ - worker->flags = WORKER_PREP; - } -@@ -1658,13 +1645,6 @@ static bool manage_workers(struct worker *worker) - - gcwq->flags &= ~GCWQ_MANAGING_WORKERS; - -- /* -- * The trustee might be waiting to take over the manager -- * position, tell it we're done. -- */ -- if (unlikely(gcwq->trustee)) -- wake_up_all(&gcwq->trustee_wait); -- - return ret; - } - -@@ -3205,171 +3185,71 @@ EXPORT_SYMBOL_GPL(work_busy); - * gcwqs serve mix of short, long and very long running works making - * blocked draining impractical. - * -- * This is solved by allowing a gcwq to be detached from CPU, running -- * it with unbound (rogue) workers and allowing it to be reattached -- * later if the cpu comes back online. A separate thread is created -- * to govern a gcwq in such state and is called the trustee of the -- * gcwq. -- * -- * Trustee states and their descriptions. -- * -- * START Command state used on startup. On CPU_DOWN_PREPARE, a -- * new trustee is started with this state. -- * -- * IN_CHARGE Once started, trustee will enter this state after -- * assuming the manager role and making all existing -- * workers rogue. DOWN_PREPARE waits for trustee to -- * enter this state. After reaching IN_CHARGE, trustee -- * tries to execute the pending worklist until it's empty -- * and the state is set to BUTCHER, or the state is set -- * to RELEASE. -- * -- * BUTCHER Command state which is set by the cpu callback after -- * the cpu has went down. Once this state is set trustee -- * knows that there will be no new works on the worklist -- * and once the worklist is empty it can proceed to -- * killing idle workers. -- * -- * RELEASE Command state which is set by the cpu callback if the -- * cpu down has been canceled or it has come online -- * again. After recognizing this state, trustee stops -- * trying to drain or butcher and clears ROGUE, rebinds -- * all remaining workers back to the cpu and releases -- * manager role. -- * -- * DONE Trustee will enter this state after BUTCHER or RELEASE -- * is complete. -- * -- * trustee CPU draining -- * took over down complete -- * START -----------> IN_CHARGE -----------> BUTCHER -----------> DONE -- * | | ^ -- * | CPU is back online v return workers | -- * ----------------> RELEASE -------------- - */ - --/** -- * trustee_wait_event_timeout - timed event wait for trustee -- * @cond: condition to wait for -- * @timeout: timeout in jiffies -- * -- * wait_event_timeout() for trustee to use. Handles locking and -- * checks for RELEASE request. -- * -- * CONTEXT: -- * spin_lock_irq(gcwq->lock) which may be released and regrabbed -- * multiple times. To be used by trustee. -- * -- * RETURNS: -- * Positive indicating left time if @cond is satisfied, 0 if timed -- * out, -1 if canceled. -- */ --#define trustee_wait_event_timeout(cond, timeout) ({ \ -- long __ret = (timeout); \ -- while (!((cond) || (gcwq->trustee_state == TRUSTEE_RELEASE)) && \ -- __ret) { \ -- spin_unlock_irq(&gcwq->lock); \ -- __wait_event_timeout(gcwq->trustee_wait, (cond) || \ -- (gcwq->trustee_state == TRUSTEE_RELEASE), \ -- __ret); \ -- spin_lock_irq(&gcwq->lock); \ -- } \ -- gcwq->trustee_state == TRUSTEE_RELEASE ? -1 : (__ret); \ --}) -+static int __devinit workqueue_cpu_up_callback(struct notifier_block *nfb, -+ unsigned long action, -+ void *hcpu) -+{ -+ unsigned int cpu = (unsigned long)hcpu; -+ struct global_cwq *gcwq = get_gcwq(cpu); -+ struct worker *uninitialized_var(new_worker); -+ unsigned long flags; - --/** -- * trustee_wait_event - event wait for trustee -- * @cond: condition to wait for -- * -- * wait_event() for trustee to use. Automatically handles locking and -- * checks for CANCEL request. -- * -- * CONTEXT: -- * spin_lock_irq(gcwq->lock) which may be released and regrabbed -- * multiple times. To be used by trustee. -- * -- * RETURNS: -- * 0 if @cond is satisfied, -1 if canceled. -- */ --#define trustee_wait_event(cond) ({ \ -- long __ret1; \ -- __ret1 = trustee_wait_event_timeout(cond, MAX_SCHEDULE_TIMEOUT);\ -- __ret1 < 0 ? -1 : 0; \ --}) -+ action &= ~CPU_TASKS_FROZEN; - --static int __cpuinit trustee_thread(void *__gcwq) --{ -- struct global_cwq *gcwq = __gcwq; -- struct worker *worker; -- struct work_struct *work; -- struct hlist_node *pos; -- long rc; -- int i; -+ switch (action) { -+ case CPU_UP_PREPARE: -+ BUG_ON(gcwq->first_idle); -+ new_worker = create_worker(gcwq, false); -+ if (!new_worker) -+ return NOTIFY_BAD; -+ } - -- BUG_ON(gcwq->cpu != smp_processor_id()); -+ /* some are called w/ irq disabled, don't disturb irq status */ -+ spin_lock_irqsave(&gcwq->lock, flags); - -- spin_lock_irq(&gcwq->lock); -- /* -- * Claim the manager position and make all workers rogue. -- * Trustee must be bound to the target cpu and can't be -- * cancelled. -- */ -- BUG_ON(gcwq->cpu != smp_processor_id()); -- rc = trustee_wait_event(!(gcwq->flags & GCWQ_MANAGING_WORKERS)); -- BUG_ON(rc < 0); -+ switch (action) { -+ case CPU_UP_PREPARE: -+ BUG_ON(gcwq->first_idle); -+ gcwq->first_idle = new_worker; -+ break; - -- gcwq->flags |= GCWQ_MANAGING_WORKERS; -+ case CPU_UP_CANCELED: -+ destroy_worker(gcwq->first_idle); -+ gcwq->first_idle = NULL; -+ break; - -- list_for_each_entry(worker, &gcwq->idle_list, entry) -- worker->flags |= WORKER_ROGUE; -+ case CPU_ONLINE: -+ spin_unlock_irq(&gcwq->lock); -+ kthread_bind(gcwq->first_idle->task, cpu); -+ spin_lock_irq(&gcwq->lock); -+ gcwq->flags |= GCWQ_MANAGE_WORKERS; -+ start_worker(gcwq->first_idle); -+ gcwq->first_idle = NULL; -+ break; -+ } - -- for_each_busy_worker(worker, i, pos, gcwq) -- worker->flags |= WORKER_ROGUE; -+ spin_unlock_irqrestore(&gcwq->lock, flags); - -- /* -- * Call schedule() so that we cross rq->lock and thus can -- * guarantee sched callbacks see the rogue flag. This is -- * necessary as scheduler callbacks may be invoked from other -- * cpus. -- */ -- spin_unlock_irq(&gcwq->lock); -- schedule(); -- spin_lock_irq(&gcwq->lock); -+ return notifier_from_errno(0); -+} - -- /* -- * Sched callbacks are disabled now. Zap nr_running. After -- * this, nr_running stays zero and need_more_worker() and -- * keep_working() are always true as long as the worklist is -- * not empty. -- */ -- atomic_set(get_gcwq_nr_running(gcwq->cpu), 0); -+static void flush_gcwq(struct global_cwq *gcwq) -+{ -+ struct work_struct *work, *nw; -+ struct worker *worker, *n; -+ LIST_HEAD(non_affine_works); - -- spin_unlock_irq(&gcwq->lock); -- del_timer_sync(&gcwq->idle_timer); - spin_lock_irq(&gcwq->lock); -+ list_for_each_entry_safe(work, nw, &gcwq->worklist, entry) { -+ struct workqueue_struct *wq = get_work_cwq(work)->wq; - -- /* -- * We're now in charge. Notify and proceed to drain. We need -- * to keep the gcwq running during the whole CPU down -- * procedure as other cpu hotunplug callbacks may need to -- * flush currently running tasks. -- */ -- gcwq->trustee_state = TRUSTEE_IN_CHARGE; -- wake_up_all(&gcwq->trustee_wait); -+ if (wq->flags & WQ_NON_AFFINE) -+ list_move(&work->entry, &non_affine_works); -+ } - -- /* -- * The original cpu is in the process of dying and may go away -- * anytime now. When that happens, we and all workers would -- * be migrated to other cpus. Try draining any left work. We -- * want to get it over with ASAP - spam rescuers, wake up as -- * many idlers as necessary and create new ones till the -- * worklist is empty. Note that if the gcwq is frozen, there -- * may be frozen works in freezable cwqs. Don't declare -- * completion while frozen. -- */ -- while (gcwq->nr_workers != gcwq->nr_idle || -- gcwq->flags & GCWQ_FREEZING || -- gcwq->trustee_state == TRUSTEE_IN_CHARGE) { -+ while (!list_empty(&gcwq->worklist)) { - int nr_works = 0; - - list_for_each_entry(work, &gcwq->worklist, entry) { -@@ -3383,200 +3263,55 @@ static int __cpuinit trustee_thread(void *__gcwq) - wake_up_process(worker->task); - } - -+ spin_unlock_irq(&gcwq->lock); -+ - if (need_to_create_worker(gcwq)) { -- spin_unlock_irq(&gcwq->lock); -- worker = create_worker(gcwq, false); -- spin_lock_irq(&gcwq->lock); -- if (worker) { -- worker->flags |= WORKER_ROGUE; -+ worker = create_worker(gcwq, true); -+ if (worker) - start_worker(worker); -- } - } - -- /* give a breather */ -- if (trustee_wait_event_timeout(false, TRUSTEE_COOLDOWN) < 0) -- break; -- } -- -- /* -- * Either all works have been scheduled and cpu is down, or -- * cpu down has already been canceled. Wait for and butcher -- * all workers till we're canceled. -- */ -- do { -- rc = trustee_wait_event(!list_empty(&gcwq->idle_list)); -- while (!list_empty(&gcwq->idle_list)) -- destroy_worker(list_first_entry(&gcwq->idle_list, -- struct worker, entry)); -- } while (gcwq->nr_workers && rc >= 0); -- -- /* -- * At this point, either draining has completed and no worker -- * is left, or cpu down has been canceled or the cpu is being -- * brought back up. There shouldn't be any idle one left. -- * Tell the remaining busy ones to rebind once it finishes the -- * currently scheduled works by scheduling the rebind_work. -- */ -- WARN_ON(!list_empty(&gcwq->idle_list)); -+ wait_event_timeout(gcwq->idle_wait, -+ gcwq->nr_idle == gcwq->nr_workers, HZ/10); - -- for_each_busy_worker(worker, i, pos, gcwq) { -- struct work_struct *rebind_work = &worker->rebind_work; -+ spin_lock_irq(&gcwq->lock); -+ } - -- /* -- * Rebind_work may race with future cpu hotplug -- * operations. Use a separate flag to mark that -- * rebinding is scheduled. -- */ -- worker->flags |= WORKER_REBIND; -- worker->flags &= ~WORKER_ROGUE; -+ WARN_ON(gcwq->nr_workers != gcwq->nr_idle); - -- /* queue rebind_work, wq doesn't matter, use the default one */ -- if (test_and_set_bit(WORK_STRUCT_PENDING_BIT, -- work_data_bits(rebind_work))) -- continue; -+ list_for_each_entry_safe(worker, n, &gcwq->idle_list, entry) -+ destroy_worker(worker); - -- debug_work_activate(rebind_work); -- insert_work(get_cwq(gcwq->cpu, system_wq), rebind_work, -- worker->scheduled.next, -- work_color_to_flags(WORK_NO_COLOR)); -- } -+ WARN_ON(gcwq->nr_workers || gcwq->nr_idle); - -- /* relinquish manager role */ -- gcwq->flags &= ~GCWQ_MANAGING_WORKERS; -- -- /* notify completion */ -- gcwq->trustee = NULL; -- gcwq->trustee_state = TRUSTEE_DONE; -- wake_up_all(&gcwq->trustee_wait); - spin_unlock_irq(&gcwq->lock); -- return 0; --} - --/** -- * wait_trustee_state - wait for trustee to enter the specified state -- * @gcwq: gcwq the trustee of interest belongs to -- * @state: target state to wait for -- * -- * Wait for the trustee to reach @state. DONE is already matched. -- * -- * CONTEXT: -- * spin_lock_irq(gcwq->lock) which may be released and regrabbed -- * multiple times. To be used by cpu_callback. -- */ --static void __cpuinit wait_trustee_state(struct global_cwq *gcwq, int state) --__releases(&gcwq->lock) --__acquires(&gcwq->lock) --{ -- if (!(gcwq->trustee_state == state || -- gcwq->trustee_state == TRUSTEE_DONE)) { -- spin_unlock_irq(&gcwq->lock); -- __wait_event(gcwq->trustee_wait, -- gcwq->trustee_state == state || -- gcwq->trustee_state == TRUSTEE_DONE); -- spin_lock_irq(&gcwq->lock); -+ gcwq = get_gcwq(get_cpu()); -+ spin_lock_irq(&gcwq->lock); -+ list_for_each_entry_safe(work, nw, &non_affine_works, entry) { -+ list_del_init(&work->entry); -+ ___queue_work(get_work_cwq(work)->wq, gcwq, work); - } -+ spin_unlock_irq(&gcwq->lock); -+ put_cpu(); - } - --static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, -+static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb, - unsigned long action, - void *hcpu) - { - unsigned int cpu = (unsigned long)hcpu; - struct global_cwq *gcwq = get_gcwq(cpu); -- struct task_struct *new_trustee = NULL; -- struct worker *uninitialized_var(new_worker); -- unsigned long flags; - - action &= ~CPU_TASKS_FROZEN; - -- switch (action) { -- case CPU_DOWN_PREPARE: -- new_trustee = kthread_create(trustee_thread, gcwq, -- "workqueue_trustee/%d\n", cpu); -- if (IS_ERR(new_trustee)) -- return notifier_from_errno(PTR_ERR(new_trustee)); -- kthread_bind(new_trustee, cpu); -- /* fall through */ -- case CPU_UP_PREPARE: -- BUG_ON(gcwq->first_idle); -- new_worker = create_worker(gcwq, false); -- if (!new_worker) { -- if (new_trustee) -- kthread_stop(new_trustee); -- return NOTIFY_BAD; -- } -- break; -- case CPU_POST_DEAD: -- case CPU_UP_CANCELED: -- case CPU_DOWN_FAILED: -- case CPU_ONLINE: -- break; -- case CPU_DYING: -- /* -- * We access this lockless. We are on the dying CPU -- * and called from stomp machine. -- * -- * Before this, the trustee and all workers except for -- * the ones which are still executing works from -- * before the last CPU down must be on the cpu. After -- * this, they'll all be diasporas. -- */ -- gcwq->flags |= GCWQ_DISASSOCIATED; -- default: -- goto out; -- } -- -- /* some are called w/ irq disabled, don't disturb irq status */ -- spin_lock_irqsave(&gcwq->lock, flags); -- -- switch (action) { -- case CPU_DOWN_PREPARE: -- /* initialize trustee and tell it to acquire the gcwq */ -- BUG_ON(gcwq->trustee || gcwq->trustee_state != TRUSTEE_DONE); -- gcwq->trustee = new_trustee; -- gcwq->trustee_state = TRUSTEE_START; -- wake_up_process(gcwq->trustee); -- wait_trustee_state(gcwq, TRUSTEE_IN_CHARGE); -- /* fall through */ -- case CPU_UP_PREPARE: -- BUG_ON(gcwq->first_idle); -- gcwq->first_idle = new_worker; -- break; -+ switch (action) { -+ case CPU_DOWN_PREPARE: -+ flush_gcwq(gcwq); -+ break; -+ } - -- case CPU_POST_DEAD: -- gcwq->trustee_state = TRUSTEE_BUTCHER; -- /* fall through */ -- case CPU_UP_CANCELED: -- destroy_worker(gcwq->first_idle); -- gcwq->first_idle = NULL; -- break; - -- case CPU_DOWN_FAILED: -- case CPU_ONLINE: -- gcwq->flags &= ~GCWQ_DISASSOCIATED; -- if (gcwq->trustee_state != TRUSTEE_DONE) { -- gcwq->trustee_state = TRUSTEE_RELEASE; -- wake_up_process(gcwq->trustee); -- wait_trustee_state(gcwq, TRUSTEE_DONE); -- } -- -- /* -- * Trustee is done and there might be no worker left. -- * Put the first_idle in and request a real manager to -- * take a look. -- */ -- spin_unlock_irq(&gcwq->lock); -- kthread_bind(gcwq->first_idle->task, cpu); -- spin_lock_irq(&gcwq->lock); -- gcwq->flags |= GCWQ_MANAGE_WORKERS; -- start_worker(gcwq->first_idle); -- gcwq->first_idle = NULL; -- break; -- } -- -- spin_unlock_irqrestore(&gcwq->lock, flags); -- --out: - return notifier_from_errno(0); - } - -@@ -3773,7 +3508,8 @@ static int __init init_workqueues(void) - unsigned int cpu; - int i; - -- cpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE); -+ cpu_notifier(workqueue_cpu_up_callback, CPU_PRI_WORKQUEUE_ACTIVE); -+ hotcpu_notifier(workqueue_cpu_down_callback, CPU_PRI_WORKQUEUE_INACTIVE); - - /* initialize gcwqs */ - for_each_gcwq_cpu(cpu) { -@@ -3796,9 +3532,7 @@ static int __init init_workqueues(void) - (unsigned long)gcwq); - - ida_init(&gcwq->worker_ida); -- -- gcwq->trustee_state = TRUSTEE_DONE; -- init_waitqueue_head(&gcwq->trustee_wait); -+ init_waitqueue_head(&gcwq->idle_wait); - } - - /* create the initial worker */ diff --git a/debian/patches/features/all/rt/0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch b/debian/patches/features/all/rt/0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch deleted file mode 100644 index 3a6ad6c1f..000000000 --- a/debian/patches/features/all/rt/0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 6d2f6a81b2bd6fb3f5d53cf855661e6d718ddb88 Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Mon, 3 Oct 2011 12:43:25 +0200 -Subject: [209/256] workqueue: Fix PF_THREAD_BOUND abuse - -PF_THREAD_BOUND is set by kthread_bind() and means the thread is bound -to a particular cpu for correctness. The workqueue code abuses this -flag and blindly sets it for all created threads, including those that -are free to migrate. - -Restore the original semantics now that the worst abuse in the -cpu-hotplug path are gone. The only icky bit is the rescue thread for -per-cpu workqueues, this cannot use kthread_bind() but will use -set_cpus_allowed_ptr() to migrate itself to the desired cpu. - -Set and clear PF_THREAD_BOUND manually here. - -XXX: I think worker_maybe_bind_and_lock()/worker_unbind_and_unlock() -should also do a get_online_cpus(), this would likely allow us to -remove the while loop. - -XXX: should probably repurpose GCWQ_DISASSOCIATED to warn on adding -works after CPU_DOWN_PREPARE -- its dual use to mark unbound gcwqs is -a tad annoying though. - -Signed-off-by: Peter Zijlstra -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 29 ++++++++++++++++++++--------- - 1 file changed, 20 insertions(+), 9 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index ba977c4..dc50d5d 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -1283,8 +1283,14 @@ __acquires(&gcwq->lock) - return false; - if (task_cpu(task) == gcwq->cpu && - cpumask_equal(¤t->cpus_allowed, -- get_cpu_mask(gcwq->cpu))) -+ get_cpu_mask(gcwq->cpu))) { -+ /* -+ * Since we're binding to a particular cpu and need to -+ * stay there for correctness, mark us PF_THREAD_BOUND. -+ */ -+ task->flags |= PF_THREAD_BOUND; - return true; -+ } - spin_unlock_irq(&gcwq->lock); - - /* -@@ -1298,6 +1304,18 @@ __acquires(&gcwq->lock) - } - } - -+static void worker_unbind_and_unlock(struct worker *worker) -+{ -+ struct global_cwq *gcwq = worker->gcwq; -+ struct task_struct *task = worker->task; -+ -+ /* -+ * Its no longer required we're PF_THREAD_BOUND, the work is done. -+ */ -+ task->flags &= ~PF_THREAD_BOUND; -+ spin_unlock_irq(&gcwq->lock); -+} -+ - static struct worker *alloc_worker(void) - { - struct worker *worker; -@@ -1360,15 +1378,9 @@ static struct worker *create_worker(struct global_cwq *gcwq, bool bind) - if (IS_ERR(worker->task)) - goto fail; - -- /* -- * A rogue worker will become a regular one if CPU comes -- * online later on. Make sure every worker has -- * PF_THREAD_BOUND set. -- */ - if (bind && !on_unbound_cpu) - kthread_bind(worker->task, gcwq->cpu); - else { -- worker->task->flags |= PF_THREAD_BOUND; - if (on_unbound_cpu) - worker->flags |= WORKER_UNBOUND; - } -@@ -2045,7 +2057,7 @@ repeat: - if (keep_working(gcwq)) - wake_up_worker(gcwq); - -- spin_unlock_irq(&gcwq->lock); -+ worker_unbind_and_unlock(rescuer); - } - - schedule(); -@@ -2995,7 +3007,6 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, - if (IS_ERR(rescuer->task)) - goto err; - -- rescuer->task->flags |= PF_THREAD_BOUND; - wake_up_process(rescuer->task); - } - diff --git a/debian/patches/features/all/rt/0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch b/debian/patches/features/all/rt/0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch deleted file mode 100644 index 12380435e..000000000 --- a/debian/patches/features/all/rt/0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0e6b40521d705113621a8ef227822305c6f24937 Mon Sep 17 00:00:00 2001 -From: Yong Zhang -Date: Sun, 16 Oct 2011 18:56:46 +0800 -Subject: [210/256] workqueue: Use get_cpu_light() in flush_gcwq() - -BUG: sleeping function called from invalid context at kernel/rtmutex.c:645 -in_atomic(): 1, irqs_disabled(): 0, pid: 1739, name: bash -Pid: 1739, comm: bash Not tainted 3.0.6-rt17-00284-gb76d419 #3 -Call Trace: - [] ? printk+0x1d/0x20 - [] __might_sleep+0xe6/0x110 - [] rt_spin_lock+0x1c/0x30 - [] flush_gcwq+0x236/0x320 - [] ? kfree+0xe1/0x1a0 - [] ? __cpufreq_remove_dev+0xf8/0x260 - [] ? rt_down_write+0xd/0x10 - [] workqueue_cpu_down_callback+0x26/0x2d - [] notifier_call_chain+0x45/0x60 - [] __raw_notifier_call_chain+0x1e/0x30 - [] __cpu_notify+0x24/0x40 - [] _cpu_down+0xdf/0x330 - [] cpu_down+0x30/0x50 - [] store_online+0x50/0xa7 - [] ? acpi_os_map_memory+0xec/0xec - [] sysdev_store+0x2a/0x40 - [] sysfs_write_file+0xa4/0x100 - [] vfs_write+0xa2/0x170 - [] ? sysfs_poll+0x90/0x90 - [] sys_write+0x42/0x70 - [] sysenter_do_call+0x12/0x2d -CPU 1 is now offline -SMP alternatives: switching to UP code -SMP alternatives: switching to SMP code -Booting Node 0 Processor 1 APIC 0x1 -smpboot cpu 1: start_ip = 9b000 -Initializing CPU#1 -BUG: sleeping function called from invalid context at kernel/rtmutex.c:645 -in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: kworker/0:0 -Pid: 0, comm: kworker/0:0 Not tainted 3.0.6-rt17-00284-gb76d419 #3 -Call Trace: - [] ? printk+0x1d/0x20 - [] __might_sleep+0xe6/0x110 - [] rt_spin_lock+0x1c/0x30 - [] workqueue_cpu_up_callback+0x56/0xf3 - [] notifier_call_chain+0x45/0x60 - [] __raw_notifier_call_chain+0x1e/0x30 - [] __cpu_notify+0x24/0x40 - [] cpu_notify+0x1c/0x20 - [] notify_cpu_starting+0x1e/0x20 - [] smp_callin+0xfb/0x10e - [] start_secondary+0x19/0xd7 -NMI watchdog enabled, takes one hw-pmu counter. -Switched to NOHz mode on CPU #1 - -Signed-off-by: Yong Zhang -Link: http://lkml.kernel.org/r/1318762607-2261-5-git-send-email-yong.zhang0@gmail.com -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index dc50d5d..d3da5a8 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -3297,14 +3297,14 @@ static void flush_gcwq(struct global_cwq *gcwq) - - spin_unlock_irq(&gcwq->lock); - -- gcwq = get_gcwq(get_cpu()); -+ gcwq = get_gcwq(get_cpu_light()); - spin_lock_irq(&gcwq->lock); - list_for_each_entry_safe(work, nw, &non_affine_works, entry) { - list_del_init(&work->entry); - ___queue_work(get_work_cwq(work)->wq, gcwq, work); - } - spin_unlock_irq(&gcwq->lock); -- put_cpu(); -+ put_cpu_light(); - } - - static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb, diff --git a/debian/patches/features/all/rt/0211-hotplug-stuff.patch.patch b/debian/patches/features/all/rt/0211-hotplug-stuff.patch.patch deleted file mode 100644 index 0f4497000..000000000 --- a/debian/patches/features/all/rt/0211-hotplug-stuff.patch.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b6236cc57ae8c04321374b19c836dd6cd0311577 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 4 Nov 2011 18:58:24 +0100 -Subject: [211/256] hotplug-stuff.patch - -Do not take lock for non handled cases (might be atomic context) - -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index d3da5a8..bc867e8 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -3215,6 +3215,11 @@ static int __devinit workqueue_cpu_up_callback(struct notifier_block *nfb, - new_worker = create_worker(gcwq, false); - if (!new_worker) - return NOTIFY_BAD; -+ case CPU_UP_CANCELED: -+ case CPU_ONLINE: -+ break; -+ default: -+ return notifier_from_errno(0); - } - - /* some are called w/ irq disabled, don't disturb irq status */ diff --git a/debian/patches/features/all/rt/0212-debugobjects-rt.patch.patch b/debian/patches/features/all/rt/0212-debugobjects-rt.patch.patch deleted file mode 100644 index b349b6c1c..000000000 --- a/debian/patches/features/all/rt/0212-debugobjects-rt.patch.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 2c1ab83538ba04ad97c40e6901264116946bd2e6 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:41:35 +0200 -Subject: [212/256] debugobjects-rt.patch - -Signed-off-by: Thomas Gleixner ---- - lib/debugobjects.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/lib/debugobjects.c b/lib/debugobjects.c -index 0ab9ae8..84c2f50 100644 ---- a/lib/debugobjects.c -+++ b/lib/debugobjects.c -@@ -310,7 +310,10 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack) - struct debug_obj *obj; - unsigned long flags; - -- fill_pool(); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (preempt_count() == 0 && !irqs_disabled()) -+#endif -+ fill_pool(); - - db = get_bucket((unsigned long) addr); - -@@ -1053,9 +1056,9 @@ static int __init debug_objects_replace_static_objects(void) - } - } - -+ local_irq_enable(); - printk(KERN_DEBUG "ODEBUG: %d of %d active objects replaced\n", cnt, - obj_pool_used); -- local_irq_enable(); - return 0; - free: - hlist_for_each_entry_safe(obj, node, tmp, &objects, node) { diff --git a/debian/patches/features/all/rt/0216-console-make-rt-friendly.patch.patch b/debian/patches/features/all/rt/0216-console-make-rt-friendly.patch.patch deleted file mode 100644 index 2de5f9a81..000000000 --- a/debian/patches/features/all/rt/0216-console-make-rt-friendly.patch.patch +++ /dev/null @@ -1,85 +0,0 @@ -From b059c158cfd24162673d862d1d59700da17b74f9 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 22:43:07 +0200 -Subject: [216/256] console-make-rt-friendly.patch - -Signed-off-by: Thomas Gleixner ---- - kernel/printk.c | 26 +++++++++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -diff --git a/kernel/printk.c b/kernel/printk.c -index 9a27a94..28baa36 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -507,6 +507,7 @@ static void __call_console_drivers(unsigned start, unsigned end) - { - struct console *con; - -+ migrate_disable(); - for_each_console(con) { - if (exclusive_console && con != exclusive_console) - continue; -@@ -515,6 +516,7 @@ static void __call_console_drivers(unsigned start, unsigned end) - (con->flags & CON_ANYTIME))) - con->write(con, &LOG_BUF(start), end - start); - } -+ migrate_enable(); - } - - #ifdef CONFIG_EARLY_PRINTK -@@ -839,12 +841,18 @@ static inline int can_use_console(unsigned int cpu) - * interrupts disabled. It should return with 'lockbuf_lock' - * released but interrupts still disabled. - */ --static int console_trylock_for_printk(unsigned int cpu) -+static int console_trylock_for_printk(unsigned int cpu, unsigned long flags) - __releases(&logbuf_lock) - { - int retval = 0, wake = 0; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) && -+ !preempt_count(); -+#else -+ int lock = 1; -+#endif - -- if (console_trylock()) { -+ if (lock && console_trylock()) { - retval = 1; - - /* -@@ -1021,8 +1029,15 @@ asmlinkage int vprintk(const char *fmt, va_list args) - * will release 'logbuf_lock' regardless of whether it - * actually gets the semaphore or not. - */ -- if (console_trylock_for_printk(this_cpu)) -+ if (console_trylock_for_printk(this_cpu, flags)) { -+#ifndef CONFIG_PREEMPT_RT_FULL - console_unlock(); -+#else -+ raw_local_irq_restore(flags); -+ console_unlock(); -+ raw_local_irq_save(flags); -+#endif -+ } - - lockdep_on(); - out_restore_irqs: -@@ -1345,11 +1360,16 @@ again: - _con_start = con_start; - _log_end = log_end; - con_start = log_end; /* Flush */ -+#ifndef CONFIG_PREEMPT_RT_FULL - raw_spin_unlock(&logbuf_lock); - stop_critical_timings(); /* don't trace print latency */ - call_console_drivers(_con_start, _log_end); - start_critical_timings(); - local_irq_restore(flags); -+#else -+ raw_spin_unlock_irqrestore(&logbuf_lock, flags); -+ call_console_drivers(_con_start, _log_end); -+#endif - } - console_locked = 0; - diff --git a/debian/patches/features/all/rt/0217-fix-printk-flush-of-messages.patch b/debian/patches/features/all/rt/0217-fix-printk-flush-of-messages.patch deleted file mode 100644 index 8c76caf43..000000000 --- a/debian/patches/features/all/rt/0217-fix-printk-flush-of-messages.patch +++ /dev/null @@ -1,55 +0,0 @@ -From c701c74b786949d0f2b02212ae0bd18800818a1b Mon Sep 17 00:00:00 2001 -From: Frank Rowand -Date: Wed, 16 May 2012 18:09:36 -0700 -Subject: [217/256] fix printk flush of messages - -Updates console-make-rt-friendly.patch - -#ifdef CONFIG_PREEMPT_RT_FULL, printk() output is never flushed by -printk() because: - - # some liberties taken in this pseudo-code to make it easier to follow - printk() - vprintk() - raw_spin_lock(&logbuf_lock) - # increment preempt_count(): - preempt_disable() - result = console_trylock_for_printk() - retval = 0 - # lock will always be false, because preempt_count() will be >= 1 - lock = ... && !preempt_count() - if (lock) - retval = 1 - return retval - # result will always be false since lock will always be false - if (result) - console_unlock() - # this is where the printk() output would be flushed - -On system boot some printk() output is flushed because register_console() -and tty_open() call console_unlock(). - -This change also fixes the problem that was previously fixed by -preempt-rt-allow-immediate-magic-sysrq-output-for-preempt_rt_full.patch - -Signed-off-by: Frank Rowand -Cc: Frank -Link: http://lkml.kernel.org/r/4FB44FD0.4090800@am.sony.com -Signed-off-by: Thomas Gleixner ---- - kernel/printk.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/printk.c b/kernel/printk.c -index 28baa36..7109711 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -847,7 +847,7 @@ static int console_trylock_for_printk(unsigned int cpu, unsigned long flags) - int retval = 0, wake = 0; - #ifdef CONFIG_PREEMPT_RT_FULL - int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) && -- !preempt_count(); -+ (preempt_count() <= 1); - #else - int lock = 1; - #endif diff --git a/debian/patches/features/all/rt/0218-power-use-generic-rwsem-on-rt.patch b/debian/patches/features/all/rt/0218-power-use-generic-rwsem-on-rt.patch deleted file mode 100644 index 44e70a2b6..000000000 --- a/debian/patches/features/all/rt/0218-power-use-generic-rwsem-on-rt.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 74ab33822266a1afaf9c656a8d5a59355df989d7 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 7 Jun 2012 07:47:08 -0400 -Subject: [218/256] power-use-generic-rwsem-on-rt - ---- - arch/powerpc/Kconfig | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index feab3ba..981d71f 100644 ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -69,10 +69,11 @@ config LOCKDEP_SUPPORT - - config RWSEM_GENERIC_SPINLOCK - bool -+ default y if PREEMPT_RT_FULL - - config RWSEM_XCHGADD_ALGORITHM - bool -- default y -+ default y if !PREEMPT_RT_FULL - - config GENERIC_LOCKBREAK - bool diff --git a/debian/patches/features/all/rt/0230-scsi-fcoe-rt-aware.patch.patch b/debian/patches/features/all/rt/0230-scsi-fcoe-rt-aware.patch.patch deleted file mode 100644 index 859cfbdcc..000000000 --- a/debian/patches/features/all/rt/0230-scsi-fcoe-rt-aware.patch.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 123b09bb43cd35bb64a91c8695a71df65d1e0f78 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 12 Nov 2011 14:00:48 +0100 -Subject: [230/256] scsi-fcoe-rt-aware.patch - -Signed-off-by: Thomas Gleixner ---- - drivers/scsi/fcoe/fcoe.c | 16 ++++++++-------- - drivers/scsi/fcoe/fcoe_ctlr.c | 4 ++-- - drivers/scsi/libfc/fc_exch.c | 4 ++-- - 3 files changed, 12 insertions(+), 12 deletions(-) - -diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c -index 335e851..7f791b9 100644 ---- a/drivers/scsi/fcoe/fcoe.c -+++ b/drivers/scsi/fcoe/fcoe.c -@@ -1222,7 +1222,7 @@ static void fcoe_percpu_thread_destroy(unsigned int cpu) - struct sk_buff *skb; - #ifdef CONFIG_SMP - struct fcoe_percpu_s *p0; -- unsigned targ_cpu = get_cpu(); -+ unsigned targ_cpu = get_cpu_light(); - #endif /* CONFIG_SMP */ - - FCOE_DBG("Destroying receive thread for CPU %d\n", cpu); -@@ -1278,7 +1278,7 @@ static void fcoe_percpu_thread_destroy(unsigned int cpu) - kfree_skb(skb); - spin_unlock_bh(&p->fcoe_rx_list.lock); - } -- put_cpu(); -+ put_cpu_light(); - #else - /* - * This a non-SMP scenario where the singular Rx thread is -@@ -1494,11 +1494,11 @@ err2: - static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) - { - struct fcoe_percpu_s *fps; -- int rc; -+ int rc, cpu = get_cpu_light(); - -- fps = &get_cpu_var(fcoe_percpu); -+ fps = &per_cpu(fcoe_percpu, cpu); - rc = fcoe_get_paged_crc_eof(skb, tlen, fps); -- put_cpu_var(fcoe_percpu); -+ put_cpu_light(); - - return rc; - } -@@ -1738,7 +1738,7 @@ static void fcoe_recv_frame(struct sk_buff *skb) - */ - hp = (struct fcoe_hdr *) skb_network_header(skb); - -- stats = per_cpu_ptr(lport->dev_stats, get_cpu()); -+ stats = per_cpu_ptr(lport->dev_stats, get_cpu_light()); - if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { - if (stats->ErrorFrames < 5) - printk(KERN_WARNING "fcoe: FCoE version " -@@ -1770,13 +1770,13 @@ static void fcoe_recv_frame(struct sk_buff *skb) - goto drop; - - if (!fcoe_filter_frames(lport, fp)) { -- put_cpu(); -+ put_cpu_light(); - fc_exch_recv(lport, fp); - return; - } - drop: - stats->ErrorFrames++; -- put_cpu(); -+ put_cpu_light(); - kfree_skb(skb); - } - -diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c -index 249a106..753fcb9 100644 ---- a/drivers/scsi/fcoe/fcoe_ctlr.c -+++ b/drivers/scsi/fcoe/fcoe_ctlr.c -@@ -719,7 +719,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) - unsigned long sel_time = 0; - struct fcoe_dev_stats *stats; - -- stats = per_cpu_ptr(fip->lp->dev_stats, get_cpu()); -+ stats = per_cpu_ptr(fip->lp->dev_stats, get_cpu_light()); - - list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { - deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; -@@ -752,7 +752,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) - sel_time = fcf->time; - } - } -- put_cpu(); -+ put_cpu_light(); - if (sel_time && !fip->sel_fcf && !fip->sel_time) { - sel_time += msecs_to_jiffies(FCOE_CTLR_START_DELAY); - fip->sel_time = sel_time; -diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c -index aceffad..fb4e6ce 100644 ---- a/drivers/scsi/libfc/fc_exch.c -+++ b/drivers/scsi/libfc/fc_exch.c -@@ -724,10 +724,10 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, - } - memset(ep, 0, sizeof(*ep)); - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - pool = per_cpu_ptr(mp->pool, cpu); - spin_lock_bh(&pool->lock); -- put_cpu(); -+ put_cpu_light(); - - /* peek cache of free slot */ - if (pool->left != FC_XID_UNKNOWN) { diff --git a/debian/patches/features/all/rt/0235-timer-Fix-hotplug-for-rt.patch b/debian/patches/features/all/rt/0235-timer-Fix-hotplug-for-rt.patch deleted file mode 100644 index 91b7ca454..000000000 --- a/debian/patches/features/all/rt/0235-timer-Fix-hotplug-for-rt.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 818f63a2fd1445b9723502079135aa8101486de1 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Thu, 1 Mar 2012 13:55:28 -0500 -Subject: [235/256] timer: Fix hotplug for -rt - -Revert the RT patch: - Author: Ingo Molnar - Date: Fri Jul 3 08:30:32 2009 -0500 - timers: fix timer hotplug on -rt - - Here we are in the CPU_DEAD notifier, and we must not sleep nor - enable interrupts. - -There's no problem with sleeping in this notifier. - -But the get_cpu_var() had to be converted to a get_local_var(). - -Replace the previous fix with the get_local_var() convert. - -Signed-off-by: Steven Rostedt -Cc: Carsten Emde -Cc: John Kacur -Cc: Peter Zijlstra -Cc: Clark Williams -Cc: stable-rt@vger.kernel.org -Link: http://lkml.kernel.org/r/20120301190344.948157137@goodmis.org -Signed-off-by: Thomas Gleixner ---- - kernel/timer.c | 16 +++++----------- - 1 file changed, 5 insertions(+), 11 deletions(-) - -diff --git a/kernel/timer.c b/kernel/timer.c -index 935f46d..5413ff6 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1793,21 +1793,17 @@ static void __cpuinit migrate_timers(int cpu) - { - struct tvec_base *old_base; - struct tvec_base *new_base; -- unsigned long flags; - int i; - - BUG_ON(cpu_online(cpu)); - old_base = per_cpu(tvec_bases, cpu); -- new_base = get_cpu_var(tvec_bases); -+ new_base = get_local_var(tvec_bases); - /* - * The caller is globally serialized and nobody else - * takes two locks at once, deadlock is not possible. - */ -- local_irq_save(flags); -- while (!spin_trylock(&new_base->lock)) -- cpu_relax(); -- while (!spin_trylock(&old_base->lock)) -- cpu_relax(); -+ spin_lock_irq(&new_base->lock); -+ spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING); - - BUG_ON(old_base->running_timer); - -@@ -1821,10 +1817,8 @@ static void __cpuinit migrate_timers(int cpu) - } - - spin_unlock(&old_base->lock); -- spin_unlock(&new_base->lock); -- local_irq_restore(flags); -- -- put_cpu_var(tvec_bases); -+ spin_unlock_irq(&new_base->lock); -+ put_local_var(tvec_bases); - } - #endif /* CONFIG_HOTPLUG_CPU */ - diff --git a/debian/patches/features/all/rt/0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch b/debian/patches/features/all/rt/0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch deleted file mode 100644 index 9075d2ad2..000000000 --- a/debian/patches/features/all/rt/0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 5f34c2fecd000fa56735d08a735a1ae2e4d41f9c Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Thu, 1 Mar 2012 13:55:29 -0500 -Subject: [236/256] futex/rt: Fix possible lockup when taking pi_lock in proxy - handler - -When taking the pi_lock, we must disable interrupts because the -pi_lock can also be taken in an interrupt handler. - -Use raw_spin_lock_irq() instead of raw_spin_lock(). - -Signed-off-by: Steven Rostedt -Cc: Carsten Emde -Cc: John Kacur -Cc: Peter Zijlstra -Cc: Clark Williams -Cc: stable-rt@vger.kernel.org -Link: http://lkml.kernel.org/r/20120301190345.165160680@goodmis.org -Signed-off-by: Thomas Gleixner ---- - kernel/rtmutex.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index 921c90b..3bff726 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c -@@ -1365,14 +1365,14 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, - * PI_REQUEUE_INPROGRESS, so that if the task is waking up - * it will know that we are in the process of requeuing it. - */ -- raw_spin_lock(&task->pi_lock); -+ raw_spin_lock_irq(&task->pi_lock); - if (task->pi_blocked_on) { -- raw_spin_unlock(&task->pi_lock); -+ raw_spin_unlock_irq(&task->pi_lock); - raw_spin_unlock(&lock->wait_lock); - return -EAGAIN; - } - task->pi_blocked_on = PI_REQUEUE_INPROGRESS; -- raw_spin_unlock(&task->pi_lock); -+ raw_spin_unlock_irq(&task->pi_lock); - #endif - - ret = task_blocks_on_rt_mutex(lock, waiter, task, detect_deadlock); diff --git a/debian/patches/features/all/rt/0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch b/debian/patches/features/all/rt/0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch deleted file mode 100644 index 66b800438..000000000 --- a/debian/patches/features/all/rt/0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch +++ /dev/null @@ -1,35 +0,0 @@ -From d1cd4f9d663188da0abaca7e35186955434030c5 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Thu, 1 Mar 2012 13:55:32 -0500 -Subject: [237/256] ring-buffer/rt: Check for irqs disabled before grabbing - reader lock - -In RT the reader lock is a mutex and we can not grab it when preemption is -disabled. The in_atomic() check that is there does not check if irqs are -disabled. Add that check as well. - -Signed-off-by: Steven Rostedt -Cc: Carsten Emde -Cc: John Kacur -Cc: Peter Zijlstra -Cc: Clark Williams -Cc: stable-rt@vger.kernel.org -Link: http://lkml.kernel.org/r/20120301190345.786365803@goodmis.org -Signed-off-by: Thomas Gleixner ---- - kernel/trace/ring_buffer.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c -index 24efd16..e59be41 100644 ---- a/kernel/trace/ring_buffer.c -+++ b/kernel/trace/ring_buffer.c -@@ -1022,7 +1022,7 @@ static inline int ok_to_lock(void) - if (in_nmi()) - return 0; - #ifdef CONFIG_PREEMPT_RT_FULL -- if (in_atomic()) -+ if (in_atomic() || irqs_disabled()) - return 0; - #endif - return 1; diff --git a/debian/patches/features/all/rt/0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch b/debian/patches/features/all/rt/0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch deleted file mode 100644 index 73d431666..000000000 --- a/debian/patches/features/all/rt/0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 3a56741dc30e11b2df958377c2bc9a6f603ef990 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Thu, 1 Mar 2012 13:55:30 -0500 -Subject: [239/256] lglock/rt: Use non-rt for_each_cpu() in -rt code - -Currently the RT version of the lglocks() does a for_each_online_cpu() -in the name##_global_lock_online() functions. Non-rt uses its own -mask for this, and for good reason. - -A task may grab a *_global_lock_online(), and in the mean time, one -of the CPUs goes offline. Now when that task does a *_global_unlock_online() -it releases all the locks *except* the one that went offline. - -Now if that CPU were to come back on line, its lock is now owned by a -task that never released it when it should have. - -This causes all sorts of fun errors. Like owners of a lock no longer -existing, or sleeping on IO, waiting to be woken up by a task that -happens to be blocked on the lock it never released. - -Convert the RT versions to use the lglock specific cpumasks. As once -a CPU comes on line, the mask is set, and never cleared even when the -CPU goes offline. The locks for that CPU will still be taken and released. - -Signed-off-by: Steven Rostedt -Cc: Carsten Emde -Cc: John Kacur -Cc: Peter Zijlstra -Cc: Clark Williams -Cc: stable-rt@vger.kernel.org -Link: http://lkml.kernel.org/r/20120301190345.374756214@goodmis.org -Signed-off-by: Thomas Gleixner ---- - include/linux/lglock.h | 35 ++++++++++++++++++++++++++++++++--- - 1 file changed, 32 insertions(+), 3 deletions(-) - -diff --git a/include/linux/lglock.h b/include/linux/lglock.h -index 52b289f..cdfcef3 100644 ---- a/include/linux/lglock.h -+++ b/include/linux/lglock.h -@@ -203,9 +203,31 @@ - #else /* !PREEMPT_RT_FULL */ - #define DEFINE_LGLOCK(name) \ - \ -- DEFINE_PER_CPU(struct rt_mutex, name##_lock); \ -+ DEFINE_PER_CPU(struct rt_mutex, name##_lock); \ -+ DEFINE_SPINLOCK(name##_cpu_lock); \ -+ cpumask_t name##_cpus __read_mostly; \ - DEFINE_LGLOCK_LOCKDEP(name); \ - \ -+ static int \ -+ name##_lg_cpu_callback(struct notifier_block *nb, \ -+ unsigned long action, void *hcpu) \ -+ { \ -+ switch (action & ~CPU_TASKS_FROZEN) { \ -+ case CPU_UP_PREPARE: \ -+ spin_lock(&name##_cpu_lock); \ -+ cpu_set((unsigned long)hcpu, name##_cpus); \ -+ spin_unlock(&name##_cpu_lock); \ -+ break; \ -+ case CPU_UP_CANCELED: case CPU_DEAD: \ -+ spin_lock(&name##_cpu_lock); \ -+ cpu_clear((unsigned long)hcpu, name##_cpus); \ -+ spin_unlock(&name##_cpu_lock); \ -+ } \ -+ return NOTIFY_OK; \ -+ } \ -+ static struct notifier_block name##_lg_cpu_notifier = { \ -+ .notifier_call = name##_lg_cpu_callback, \ -+ }; \ - void name##_lock_init(void) { \ - int i; \ - LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ -@@ -214,6 +236,11 @@ - lock = &per_cpu(name##_lock, i); \ - rt_mutex_init(lock); \ - } \ -+ register_hotcpu_notifier(&name##_lg_cpu_notifier); \ -+ get_online_cpus(); \ -+ for_each_online_cpu(i) \ -+ cpu_set(i, name##_cpus); \ -+ put_online_cpus(); \ - } \ - EXPORT_SYMBOL(name##_lock_init); \ - \ -@@ -254,7 +281,8 @@ - void name##_global_lock_online(void) { \ - int i; \ - rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ -- for_each_online_cpu(i) { \ -+ spin_lock(&name##_cpu_lock); \ -+ for_each_cpu(i, &name##_cpus) { \ - struct rt_mutex *lock; \ - lock = &per_cpu(name##_lock, i); \ - __rt_spin_lock(lock); \ -@@ -265,11 +293,12 @@ - void name##_global_unlock_online(void) { \ - int i; \ - rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ -- for_each_online_cpu(i) { \ -+ for_each_cpu(i, &name##_cpus) { \ - struct rt_mutex *lock; \ - lock = &per_cpu(name##_lock, i); \ - __rt_spin_unlock(lock); \ - } \ -+ spin_unlock(&name##_cpu_lock); \ - } \ - EXPORT_SYMBOL(name##_global_unlock_online); \ - \ diff --git a/debian/patches/features/all/rt/0248-mips-remove-smp-reserve-lock.patch.patch b/debian/patches/features/all/rt/0248-mips-remove-smp-reserve-lock.patch.patch deleted file mode 100644 index 72765a438..000000000 --- a/debian/patches/features/all/rt/0248-mips-remove-smp-reserve-lock.patch.patch +++ /dev/null @@ -1,44 +0,0 @@ -From efceff18a2779d9e65f0bc83629e9f5ac3988a15 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 22 May 2012 21:15:10 +0200 -Subject: [248/256] mips-remove-smp-reserve-lock.patch - -Instead of making the lock raw, remove it as it protects nothing. - -Signed-off-by: Thomas Gleixner -Cc: stable-rt@vger.kernel.org ---- - arch/mips/cavium-octeon/smp.c | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c -index 97e7ce9..4b93048 100644 ---- a/arch/mips/cavium-octeon/smp.c -+++ b/arch/mips/cavium-octeon/smp.c -@@ -257,8 +257,6 @@ DEFINE_PER_CPU(int, cpu_state); - - extern void fixup_irqs(void); - --static DEFINE_SPINLOCK(smp_reserve_lock); -- - static int octeon_cpu_disable(void) - { - unsigned int cpu = smp_processor_id(); -@@ -266,8 +264,6 @@ static int octeon_cpu_disable(void) - if (cpu == 0) - return -EBUSY; - -- spin_lock(&smp_reserve_lock); -- - set_cpu_online(cpu, false); - cpu_clear(cpu, cpu_callin_map); - local_irq_disable(); -@@ -277,8 +273,6 @@ static int octeon_cpu_disable(void) - flush_cache_all(); - local_flush_tlb_all(); - -- spin_unlock(&smp_reserve_lock); -- - return 0; - } - diff --git a/debian/patches/features/all/rt/0254-spinlock-rt-Include-bug.h-in-spinlock_rt.h-to-satisf.patch b/debian/patches/features/all/rt/0254-spinlock-rt-Include-bug.h-in-spinlock_rt.h-to-satisf.patch deleted file mode 100644 index 7d8788c71..000000000 --- a/debian/patches/features/all/rt/0254-spinlock-rt-Include-bug.h-in-spinlock_rt.h-to-satisf.patch +++ /dev/null @@ -1,29 +0,0 @@ -From c5cdefa21e0ebd1e86aace4e07ea1114b840ff00 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Fri, 22 Jun 2012 07:25:14 -0400 -Subject: [254/256] spinlock/rt: Include bug.h in spinlock_rt.h to satisfy - BUG() usage - -Some archs (powerpc) failed to compile because of the reference to -BUG() in spinlock_rt.h. Although bug.h is included in many headers, -if spinlock.h is included in a C file before that, it will fail to -compile. - -Signed-off-by: Steven Rostedt ---- - include/linux/spinlock_rt.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h -index 3b555b4..0618387 100644 ---- a/include/linux/spinlock_rt.h -+++ b/include/linux/spinlock_rt.h -@@ -5,6 +5,8 @@ - #error Do not include directly. Use spinlock.h - #endif - -+#include -+ - extern void - __rt_spin_lock_init(spinlock_t *lock, char *name, struct lock_class_key *key); - diff --git a/debian/patches/features/all/rt/0255-Subject-powerpc-Mark-low-level-irq-handlers-NO_THREA.patch b/debian/patches/features/all/rt/0255-Subject-powerpc-Mark-low-level-irq-handlers-NO_THREA.patch deleted file mode 100644 index b4c045403..000000000 --- a/debian/patches/features/all/rt/0255-Subject-powerpc-Mark-low-level-irq-handlers-NO_THREA.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c5d1b28f48fea29be4499539a40a3259398bc4d1 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 18 Jun 2012 19:53:17 +0200 -Subject: [255/256] Subject: powerpc: Mark low level irq handlers NO_THREAD - -These low level handlers cannot be threaded. Mark them NO_THREAD - -Reported-by: leroy christophe -Tested-by: leroy christophe -Signed-off-by: Thomas Gleixner -Signed-off-by: Steven Rostedt ---- - arch/powerpc/platforms/8xx/m8xx_setup.c | 1 + - arch/powerpc/sysdev/cpm1.c | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/arch/powerpc/platforms/8xx/m8xx_setup.c b/arch/powerpc/platforms/8xx/m8xx_setup.c -index 1e12108..806cbbd 100644 ---- a/arch/powerpc/platforms/8xx/m8xx_setup.c -+++ b/arch/powerpc/platforms/8xx/m8xx_setup.c -@@ -43,6 +43,7 @@ static irqreturn_t timebase_interrupt(int irq, void *dev) - - static struct irqaction tbint_irqaction = { - .handler = timebase_interrupt, -+ .flags = IRQF_NO_THREAD, - .name = "tbint", - }; - -diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c -index d4fa03f..5e6ff38 100644 ---- a/arch/powerpc/sysdev/cpm1.c -+++ b/arch/powerpc/sysdev/cpm1.c -@@ -120,6 +120,7 @@ static irqreturn_t cpm_error_interrupt(int irq, void *dev) - - static struct irqaction cpm_error_irqaction = { - .handler = cpm_error_interrupt, -+ .flags = IRQF_NO_THREAD, - .name = "error", - }; - diff --git a/debian/patches/features/all/rt/0256-Linux-3.4.4-rt13-REBASE.patch b/debian/patches/features/all/rt/0256-Linux-3.4.4-rt13-REBASE.patch deleted file mode 100644 index 9cae20118..000000000 --- a/debian/patches/features/all/rt/0256-Linux-3.4.4-rt13-REBASE.patch +++ /dev/null @@ -1,16 +0,0 @@ -From e74823c5171f3a6d4eb4d957105a85ae4848054b Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Fri, 22 Jun 2012 19:44:35 -0400 -Subject: [256/256] Linux 3.4.4-rt13 REBASE - ---- - localversion-rt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/localversion-rt b/localversion-rt -index 700c857..9f7d0bd 100644 ---- a/localversion-rt -+++ b/localversion-rt -@@ -1 +1 @@ ---rt8 -+-rt13 diff --git a/debian/patches/features/all/rt/0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch b/debian/patches/features/all/rt/acpi-use-local-irq-nort.patch similarity index 67% rename from debian/patches/features/all/rt/0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch rename to debian/patches/features/all/rt/acpi-use-local-irq-nort.patch index a49f4bbc7..45818366b 100644 --- a/debian/patches/features/all/rt/0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch +++ b/debian/patches/features/all/rt/acpi-use-local-irq-nort.patch @@ -1,19 +1,19 @@ -From 8f93e949d590fddc2be4a3cb7c55ed382d6a55a3 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 21 Jul 2009 22:54:51 +0200 -Subject: [068/256] acpi: Do not disable interrupts on PREEMPT_RT +Subject: acpi: Do not disable interrupts on PREEMPT_RT Use the local_irq_*_nort() variants. Signed-off-by: Thomas Gleixner + --- arch/x86/include/asm/acpi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h -index 610001d..c1c23d2 100644 ---- a/arch/x86/include/asm/acpi.h -+++ b/arch/x86/include/asm/acpi.h +Index: linux-stable/arch/x86/include/asm/acpi.h +=================================================================== +--- linux-stable.orig/arch/x86/include/asm/acpi.h ++++ linux-stable/arch/x86/include/asm/acpi.h @@ -51,8 +51,8 @@ #define ACPI_ASM_MACROS diff --git a/debian/patches/features/all/rt/0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch b/debian/patches/features/all/rt/arch-use-pagefault-disabled.patch similarity index 51% rename from debian/patches/features/all/rt/0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch rename to debian/patches/features/all/rt/arch-use-pagefault-disabled.patch index ff375cd4a..537c4acf5 100644 --- a/debian/patches/features/all/rt/0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch +++ b/debian/patches/features/all/rt/arch-use-pagefault-disabled.patch @@ -1,8 +1,6 @@ -From 778005b19875f30c628c68ebc54229ca06619fcd Mon Sep 17 00:00:00 2001 +Subject: mm: Fixup all fault handlers to check current->pagefault_disable From: Thomas Gleixner Date: Thu, 17 Mar 2011 11:32:28 +0100 -Subject: [033/256] mm: Fixup all fault handlers to check - current->pagefault_disable Necessary for decoupling pagefault disable from preempt count. @@ -23,20 +21,20 @@ Signed-off-by: Thomas Gleixner arch/powerpc/mm/fault.c | 2 +- arch/s390/mm/fault.c | 6 ++++-- arch/score/mm/fault.c | 2 +- - arch/sh/mm/fault_32.c | 2 +- - arch/sparc/mm/fault_32.c | 4 ++-- + arch/sh/mm/fault.c | 2 +- + arch/sparc/mm/fault_32.c | 2 +- arch/sparc/mm/fault_64.c | 2 +- arch/tile/mm/fault.c | 2 +- arch/um/kernel/trap.c | 2 +- arch/x86/mm/fault.c | 2 +- arch/xtensa/mm/fault.c | 2 +- - 22 files changed, 27 insertions(+), 24 deletions(-) + 22 files changed, 26 insertions(+), 23 deletions(-) -diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c -index 5eecab1..0ddf6c0 100644 ---- a/arch/alpha/mm/fault.c -+++ b/arch/alpha/mm/fault.c -@@ -106,7 +106,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, +Index: linux-stable/arch/alpha/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/alpha/mm/fault.c ++++ linux-stable/arch/alpha/mm/fault.c +@@ -108,7 +108,7 @@ do_page_fault(unsigned long address, uns /* If we're in an interrupt context, or have no user context, we must not take the fault. */ @@ -45,11 +43,11 @@ index 5eecab1..0ddf6c0 100644 goto no_context; #ifdef CONFIG_ALPHA_LARGE_VMALLOC -diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c -index 5bb4835..40bd40f 100644 ---- a/arch/arm/mm/fault.c -+++ b/arch/arm/mm/fault.c -@@ -279,7 +279,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) +Index: linux-stable/arch/arm/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/arm/mm/fault.c ++++ linux-stable/arch/arm/mm/fault.c +@@ -279,7 +279,7 @@ do_page_fault(unsigned long addr, unsign * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -58,11 +56,11 @@ index 5bb4835..40bd40f 100644 goto no_context; /* -diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c -index f7040a1..623a027 100644 ---- a/arch/avr32/mm/fault.c -+++ b/arch/avr32/mm/fault.c -@@ -81,7 +81,8 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs) +Index: linux-stable/arch/avr32/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/avr32/mm/fault.c ++++ linux-stable/arch/avr32/mm/fault.c +@@ -81,7 +81,8 @@ asmlinkage void do_page_fault(unsigned l * If we're in an interrupt or have no user context, we must * not take the fault... */ @@ -72,11 +70,11 @@ index f7040a1..623a027 100644 goto no_context; local_irq_enable(); -diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c -index b4760d8..1c1630e 100644 ---- a/arch/cris/mm/fault.c -+++ b/arch/cris/mm/fault.c -@@ -112,7 +112,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs, +Index: linux-stable/arch/cris/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/cris/mm/fault.c ++++ linux-stable/arch/cris/mm/fault.c +@@ -114,7 +114,7 @@ do_page_fault(unsigned long address, str * user context, we must not take the fault. */ @@ -84,12 +82,12 @@ index b4760d8..1c1630e 100644 + if (in_atomic() || !mm || current->pagefault_disabled) goto no_context; - down_read(&mm->mmap_sem); -diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c -index 331c1e2..6372088 100644 ---- a/arch/frv/mm/fault.c -+++ b/arch/frv/mm/fault.c -@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear + retry: +Index: linux-stable/arch/frv/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/frv/mm/fault.c ++++ linux-stable/arch/frv/mm/fault.c +@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(int datamm * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -98,11 +96,11 @@ index 331c1e2..6372088 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c -index 02d29c2..721dbb9 100644 ---- a/arch/ia64/mm/fault.c -+++ b/arch/ia64/mm/fault.c -@@ -88,7 +88,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re +Index: linux-stable/arch/ia64/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/ia64/mm/fault.c ++++ linux-stable/arch/ia64/mm/fault.c +@@ -98,7 +98,7 @@ ia64_do_page_fault (unsigned long addres /* * If we're in an interrupt or have no user context, we must not take the fault.. */ @@ -111,11 +109,11 @@ index 02d29c2..721dbb9 100644 goto no_context; #ifdef CONFIG_VIRTUAL_MEM_MAP -diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c -index 3cdfa9c..1eec8af 100644 ---- a/arch/m32r/mm/fault.c -+++ b/arch/m32r/mm/fault.c -@@ -114,7 +114,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, +Index: linux-stable/arch/m32r/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/m32r/mm/fault.c ++++ linux-stable/arch/m32r/mm/fault.c +@@ -114,7 +114,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user context or are running in an * atomic region then we must not take the fault.. */ @@ -124,11 +122,11 @@ index 3cdfa9c..1eec8af 100644 goto bad_area_nosemaphore; /* When running in the kernel we expect faults to occur only to -diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c -index 6b020a8..7a4cc68 100644 ---- a/arch/m68k/mm/fault.c -+++ b/arch/m68k/mm/fault.c -@@ -84,7 +84,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, +Index: linux-stable/arch/m68k/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/m68k/mm/fault.c ++++ linux-stable/arch/m68k/mm/fault.c +@@ -85,7 +85,7 @@ int do_page_fault(struct pt_regs *regs, * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -136,12 +134,12 @@ index 6b020a8..7a4cc68 100644 + if (in_atomic() || !mm || current->pagefault_disabled) goto no_context; - down_read(&mm->mmap_sem); -diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c -index c38a265..621ad49 100644 ---- a/arch/microblaze/mm/fault.c -+++ b/arch/microblaze/mm/fault.c -@@ -106,7 +106,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, + retry: +Index: linux-stable/arch/microblaze/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/microblaze/mm/fault.c ++++ linux-stable/arch/microblaze/mm/fault.c +@@ -108,7 +108,7 @@ void do_page_fault(struct pt_regs *regs, if ((error_code & 0x13) == 0x13 || (error_code & 0x11) == 0x11) is_write = 0; @@ -150,11 +148,11 @@ index c38a265..621ad49 100644 if (kernel_mode(regs)) goto bad_area_nosemaphore; -diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c -index c14f6df..3468e69 100644 ---- a/arch/mips/mm/fault.c -+++ b/arch/mips/mm/fault.c -@@ -89,7 +89,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ +Index: linux-stable/arch/mips/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/mips/mm/fault.c ++++ linux-stable/arch/mips/mm/fault.c +@@ -89,7 +89,7 @@ asmlinkage void __kprobes do_page_fault( * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -163,11 +161,11 @@ index c14f6df..3468e69 100644 goto bad_area_nosemaphore; retry: -diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c -index 90f346f..ff5acf5 100644 ---- a/arch/mn10300/mm/fault.c -+++ b/arch/mn10300/mm/fault.c -@@ -167,7 +167,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code, +Index: linux-stable/arch/mn10300/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/mn10300/mm/fault.c ++++ linux-stable/arch/mn10300/mm/fault.c +@@ -167,7 +167,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -176,11 +174,11 @@ index 90f346f..ff5acf5 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c -index 18162ce..09ecc8a 100644 ---- a/arch/parisc/mm/fault.c -+++ b/arch/parisc/mm/fault.c -@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code, +Index: linux-stable/arch/parisc/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/parisc/mm/fault.c ++++ linux-stable/arch/parisc/mm/fault.c +@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long acc_type; int fault; @@ -189,11 +187,11 @@ index 18162ce..09ecc8a 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c -index 08ffcf5..6642dff 100644 ---- a/arch/powerpc/mm/fault.c -+++ b/arch/powerpc/mm/fault.c -@@ -261,7 +261,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, +Index: linux-stable/arch/powerpc/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/powerpc/mm/fault.c ++++ linux-stable/arch/powerpc/mm/fault.c +@@ -261,7 +261,7 @@ int __kprobes do_page_fault(struct pt_re if (!arch_irq_disabled_regs(regs)) local_irq_enable(); @@ -202,11 +200,11 @@ index 08ffcf5..6642dff 100644 if (!user_mode(regs)) return SIGSEGV; /* in_atomic() in user mode is really bad, -diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c -index 4e66860..f7d796f 100644 ---- a/arch/s390/mm/fault.c -+++ b/arch/s390/mm/fault.c -@@ -283,7 +283,8 @@ static inline int do_exception(struct pt_regs *regs, int access) +Index: linux-stable/arch/s390/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/s390/mm/fault.c ++++ linux-stable/arch/s390/mm/fault.c +@@ -286,7 +286,8 @@ static inline int do_exception(struct pt * user context. */ fault = VM_FAULT_BADCONTEXT; @@ -216,7 +214,7 @@ index 4e66860..f7d796f 100644 goto out; address = trans_exc_code & __FAIL_ADDR_MASK; -@@ -415,7 +416,8 @@ void __kprobes do_asce_exception(struct pt_regs *regs) +@@ -423,7 +424,8 @@ void __kprobes do_asce_exception(struct unsigned long trans_exc_code; trans_exc_code = regs->int_parm_long; @@ -226,11 +224,11 @@ index 4e66860..f7d796f 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c -index 47b600e..4c12824 100644 ---- a/arch/score/mm/fault.c -+++ b/arch/score/mm/fault.c -@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, +Index: linux-stable/arch/score/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/score/mm/fault.c ++++ linux-stable/arch/score/mm/fault.c +@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -239,78 +237,11 @@ index 47b600e..4c12824 100644 goto bad_area_nosemaphore; down_read(&mm->mmap_sem); -diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c -index e99b104..8c3ae42 100644 ---- a/arch/sh/mm/fault_32.c -+++ b/arch/sh/mm/fault_32.c -@@ -166,7 +166,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, - * If we're in an interrupt, have no user context or are running - * in an atomic region then we must not take the fault: - */ -- if (in_atomic() || !mm) -+ if (in_atomic() || !mm || current->pagefault_disabled) - goto no_context; - - down_read(&mm->mmap_sem); -diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c -index df3155a..ffaa99e 100644 ---- a/arch/sparc/mm/fault_32.c -+++ b/arch/sparc/mm/fault_32.c -@@ -248,8 +248,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write, - * If we're in an interrupt or have no user - * context, we must not take the fault.. - */ -- if (in_atomic() || !mm) -- goto no_context; -+ if (in_atomic() || !mm || current->pagefault_disabled) -+ goto no_context; - - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); - -diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c -index 1fe0429..fbd5e11 100644 ---- a/arch/sparc/mm/fault_64.c -+++ b/arch/sparc/mm/fault_64.c -@@ -323,7 +323,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) - * If we're in an interrupt or have no user - * context, we must not take the fault.. - */ -- if (in_atomic() || !mm) -+ if (in_atomic() || !mm || current->pagefault_enabled) - goto intr_or_no_mm; - - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); -diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c -index 22e58f5..f683aad 100644 ---- a/arch/tile/mm/fault.c -+++ b/arch/tile/mm/fault.c -@@ -355,7 +355,7 @@ static int handle_page_fault(struct pt_regs *regs, - * If we're in an interrupt, have no user context or are running in an - * atomic region then we must not take the fault. - */ -- if (in_atomic() || !mm) { -+ if (in_atomic() || !mm || current->pagefault_disabled) { - vma = NULL; /* happy compiler */ - goto bad_area_nosemaphore; - } -diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c -index dafc947..a283400 100644 ---- a/arch/um/kernel/trap.c -+++ b/arch/um/kernel/trap.c -@@ -37,7 +37,7 @@ int handle_page_fault(unsigned long address, unsigned long ip, - * If the fault was during atomic operation, don't take the fault, just - * fail. - */ -- if (in_atomic()) -+ if (in_atomic() || !mm || current->pagefault_disabled) - goto out_nosemaphore; - - down_read(&mm->mmap_sem); -diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c -index 3ecfd1a..bb891f2 100644 ---- a/arch/x86/mm/fault.c -+++ b/arch/x86/mm/fault.c -@@ -1094,7 +1094,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) +Index: linux-stable/arch/sh/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/sh/mm/fault.c ++++ linux-stable/arch/sh/mm/fault.c +@@ -445,7 +445,7 @@ asmlinkage void __kprobes do_page_fault( * If we're in an interrupt, have no user context or are running * in an atomic region then we must not take the fault: */ @@ -319,11 +250,76 @@ index 3ecfd1a..bb891f2 100644 bad_area_nosemaphore(regs, error_code, address); return; } -diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c -index b17885a..cc58b7c 100644 ---- a/arch/xtensa/mm/fault.c -+++ b/arch/xtensa/mm/fault.c -@@ -56,7 +56,7 @@ void do_page_fault(struct pt_regs *regs) +Index: linux-stable/arch/sparc/mm/fault_32.c +=================================================================== +--- linux-stable.orig/arch/sparc/mm/fault_32.c ++++ linux-stable/arch/sparc/mm/fault_32.c +@@ -200,7 +200,7 @@ asmlinkage void do_sparc_fault(struct pt + * If we're in an interrupt or have no user + * context, we must not take the fault.. + */ +- if (in_atomic() || !mm) ++ if (in_atomic() || !mm || current->pagefault_disabled) + goto no_context; + + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); +Index: linux-stable/arch/sparc/mm/fault_64.c +=================================================================== +--- linux-stable.orig/arch/sparc/mm/fault_64.c ++++ linux-stable/arch/sparc/mm/fault_64.c +@@ -323,7 +323,7 @@ asmlinkage void __kprobes do_sparc64_fau + * If we're in an interrupt or have no user + * context, we must not take the fault.. + */ +- if (in_atomic() || !mm) ++ if (in_atomic() || !mm || current->pagefault_enabled) + goto intr_or_no_mm; + + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); +Index: linux-stable/arch/tile/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/tile/mm/fault.c ++++ linux-stable/arch/tile/mm/fault.c +@@ -359,7 +359,7 @@ static int handle_page_fault(struct pt_r + * If we're in an interrupt, have no user context or are running in an + * atomic region then we must not take the fault. + */ +- if (in_atomic() || !mm) { ++ if (in_atomic() || !mm || current->pagefault_disabled) { + vma = NULL; /* happy compiler */ + goto bad_area_nosemaphore; + } +Index: linux-stable/arch/um/kernel/trap.c +=================================================================== +--- linux-stable.orig/arch/um/kernel/trap.c ++++ linux-stable/arch/um/kernel/trap.c +@@ -39,7 +39,7 @@ int handle_page_fault(unsigned long addr + * If the fault was during atomic operation, don't take the fault, just + * fail. + */ +- if (in_atomic()) ++ if (in_atomic() || current->pagefault_disabled) + goto out_nosemaphore; + + retry: +Index: linux-stable/arch/x86/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/x86/mm/fault.c ++++ linux-stable/arch/x86/mm/fault.c +@@ -1094,7 +1094,7 @@ do_page_fault(struct pt_regs *regs, unsi + * If we're in an interrupt, have no user context or are running + * in an atomic region then we must not take the fault: + */ +- if (unlikely(in_atomic() || !mm)) { ++ if (unlikely(in_atomic() || !mm || current->pagefault_disabled)) { + bad_area_nosemaphore(regs, error_code, address); + return; + } +Index: linux-stable/arch/xtensa/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/xtensa/mm/fault.c ++++ linux-stable/arch/xtensa/mm/fault.c +@@ -57,7 +57,7 @@ void do_page_fault(struct pt_regs *regs) /* If we're in an interrupt or have no user * context, we must not take the fault.. */ diff --git a/debian/patches/features/all/rt/0017-arm-Allow-forced-irq-threading.patch b/debian/patches/features/all/rt/arm-allow-irq-threading.patch similarity index 59% rename from debian/patches/features/all/rt/0017-arm-Allow-forced-irq-threading.patch rename to debian/patches/features/all/rt/arm-allow-irq-threading.patch index 6a8e6ee58..57573a0bc 100644 --- a/debian/patches/features/all/rt/0017-arm-Allow-forced-irq-threading.patch +++ b/debian/patches/features/all/rt/arm-allow-irq-threading.patch @@ -1,7 +1,6 @@ -From 4e48dbb83d55f79960fe418e48e37ba72ce33b9a Mon Sep 17 00:00:00 2001 +Subject: arm: Allow forced irq threading From: Thomas Gleixner Date: Sat, 16 Jul 2011 13:15:20 +0200 -Subject: [017/256] arm: Allow forced irq threading All timer interrupts and the perf interrupt are marked NO_THREAD, so its safe to allow forced interrupt threading. @@ -11,12 +10,14 @@ Signed-off-by: Thomas Gleixner arch/arm/Kconfig | 1 + 1 file changed, 1 insertion(+) ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -31,6 +31,7 @@ - select HAVE_C_RECORDMCOUNT - select HAVE_GENERIC_HARDIRQS +Index: linux-stable/arch/arm/Kconfig +=================================================================== +--- linux-stable.orig/arch/arm/Kconfig ++++ linux-stable/arch/arm/Kconfig +@@ -40,6 +40,7 @@ config ARM select GENERIC_IRQ_SHOW + select ARCH_WANT_IPC_PARSE_VERSION + select HARDIRQS_SW_RESEND + select IRQ_FORCED_THREADING select CPU_PM if (SUSPEND || CPU_IDLE) select GENERIC_PCI_IOMAP diff --git a/debian/patches/features/all/rt/0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch b/debian/patches/features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch similarity index 62% rename from debian/patches/features/all/rt/0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch rename to debian/patches/features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch index 75ff73fa0..ac3700b4c 100644 --- a/debian/patches/features/all/rt/0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch +++ b/debian/patches/features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch @@ -1,8 +1,6 @@ -From 58f015923d7d9267139ff8bce42f2f6215db1540 Mon Sep 17 00:00:00 2001 From: Benedikt Spranger Date: Sat, 6 Mar 2010 17:47:10 +0100 -Subject: [026/256] ARM: AT91: PIT: Remove irq handler when clock event is - unused +Subject: ARM: AT91: PIT: Remove irq handler when clock event is unused Setup and remove the interrupt handler in clock event mode selection. This avoids calling the (shared) interrupt handler when the device is @@ -10,16 +8,17 @@ not used. Signed-off-by: Benedikt Spranger Signed-off-by: Thomas Gleixner + --- arch/arm/mach-at91/at91rm9200_time.c | 1 + arch/arm/mach-at91/at91sam926x_time.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) -diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c -index 104ca40..49aea48 100644 ---- a/arch/arm/mach-at91/at91rm9200_time.c -+++ b/arch/arm/mach-at91/at91rm9200_time.c -@@ -130,6 +130,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev) +Index: linux-stable/arch/arm/mach-at91/at91rm9200_time.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-at91/at91rm9200_time.c ++++ linux-stable/arch/arm/mach-at91/at91rm9200_time.c +@@ -130,6 +130,7 @@ clkevt32k_mode(enum clock_event_mode mod break; case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: @@ -27,10 +26,10 @@ index 104ca40..49aea48 100644 case CLOCK_EVT_MODE_RESUME: irqmask = 0; break; -diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c -index a94758b..dd300f3 100644 ---- a/arch/arm/mach-at91/at91sam926x_time.c -+++ b/arch/arm/mach-at91/at91sam926x_time.c +Index: linux-stable/arch/arm/mach-at91/at91sam926x_time.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-at91/at91sam926x_time.c ++++ linux-stable/arch/arm/mach-at91/at91sam926x_time.c @@ -67,7 +67,7 @@ static struct clocksource pit_clk = { .flags = CLOCK_SOURCE_IS_CONTINUOUS, }; @@ -40,7 +39,7 @@ index a94758b..dd300f3 100644 /* * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) */ -@@ -76,6 +76,8 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) +@@ -76,6 +76,8 @@ pit_clkevt_mode(enum clock_event_mode mo { switch (mode) { case CLOCK_EVT_MODE_PERIODIC: @@ -49,7 +48,7 @@ index a94758b..dd300f3 100644 /* update clocksource counter */ pit_cnt += pit_cycle * PIT_PICNT(pit_read(AT91_PIT_PIVR)); pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN -@@ -88,6 +90,7 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) +@@ -88,6 +90,7 @@ pit_clkevt_mode(enum clock_event_mode mo case CLOCK_EVT_MODE_UNUSED: /* disable irq, leaving the clocksource active */ pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); diff --git a/debian/patches/features/all/rt/0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch b/debian/patches/features/all/rt/arm-at91-tclib-default-to-tclib-timer-for-rt.patch similarity index 69% rename from debian/patches/features/all/rt/0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch rename to debian/patches/features/all/rt/arm-at91-tclib-default-to-tclib-timer-for-rt.patch index 0b4271a8f..2b7a40909 100644 --- a/debian/patches/features/all/rt/0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch +++ b/debian/patches/features/all/rt/arm-at91-tclib-default-to-tclib-timer-for-rt.patch @@ -1,21 +1,21 @@ -From e1833c8a323d39284e16ea1d483a43ea3e210291 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sat, 1 May 2010 18:29:35 +0200 -Subject: [221/256] ARM: at91: tclib: Default to tclib timer for RT +Subject: ARM: at91: tclib: Default to tclib timer for RT RT is not too happy about the shared timer interrupt in AT91 devices. Default to tclib timer for RT. Signed-off-by: Thomas Gleixner + --- drivers/misc/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index eead6ce..ecda1c4 100644 ---- a/drivers/misc/Kconfig -+++ b/drivers/misc/Kconfig -@@ -72,6 +72,7 @@ config AB8500_PWM +Index: linux-stable/drivers/misc/Kconfig +=================================================================== +--- linux-stable.orig/drivers/misc/Kconfig ++++ linux-stable/drivers/misc/Kconfig +@@ -73,6 +73,7 @@ config AB8500_PWM config ATMEL_TCLIB bool "Atmel AT32/AT91 Timer/Counter Library" depends on (AVR32 || ARCH_AT91) @@ -23,7 +23,7 @@ index eead6ce..ecda1c4 100644 help Select this if you want a library to allocate the Timer/Counter blocks found on many Atmel processors. This facilitates using -@@ -104,7 +105,7 @@ config ATMEL_TCB_CLKSRC_BLOCK +@@ -105,7 +106,7 @@ config ATMEL_TCB_CLKSRC_BLOCK config ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK bool "TC Block use 32 KiHz clock" depends on ATMEL_TCB_CLKSRC diff --git a/debian/patches/features/all/rt/0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch b/debian/patches/features/all/rt/arm-convert-boot-lock-to-raw.patch similarity index 68% rename from debian/patches/features/all/rt/0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch rename to debian/patches/features/all/rt/arm-convert-boot-lock-to-raw.patch index 51d28f254..53109428e 100644 --- a/debian/patches/features/all/rt/0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch +++ b/debian/patches/features/all/rt/arm-convert-boot-lock-to-raw.patch @@ -1,7 +1,7 @@ -From 98d149e1f5d94d6314e5bbc07dd4bd0b1c2f8684 Mon Sep 17 00:00:00 2001 +Subject: preempt-rt: Convert arm boot_lock to raw From: Frank Rowand Date: Mon, 19 Sep 2011 14:51:14 -0700 -Subject: [018/256] preempt-rt: Convert arm boot_lock to raw + The arm boot_lock is used by the secondary processor startup code. The locking task is the idle thread, which has idle->sched_class == &idle_sched_class. @@ -27,10 +27,10 @@ Signed-off-by: Thomas Gleixner arch/arm/plat-versatile/platsmp.c | 10 +++++----- 5 files changed, 26 insertions(+), 26 deletions(-) -diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c -index 36c3984..77499ea 100644 ---- a/arch/arm/mach-exynos/platsmp.c -+++ b/arch/arm/mach-exynos/platsmp.c +Index: linux-stable/arch/arm/mach-exynos/platsmp.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-exynos/platsmp.c ++++ linux-stable/arch/arm/mach-exynos/platsmp.c @@ -62,7 +62,7 @@ static void __iomem *scu_base_addr(void) return (void __iomem *)(S5P_VA_SCU); } @@ -40,7 +40,7 @@ index 36c3984..77499ea 100644 void __cpuinit platform_secondary_init(unsigned int cpu) { -@@ -82,8 +82,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) +@@ -82,8 +82,8 @@ void __cpuinit platform_secondary_init(u /* * Synchronise with the boot thread. */ @@ -51,7 +51,7 @@ index 36c3984..77499ea 100644 } int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) -@@ -94,7 +94,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -94,7 +94,7 @@ int __cpuinit boot_secondary(unsigned in * Set synchronisation state between this boot processor * and the secondary one */ @@ -60,7 +60,7 @@ index 36c3984..77499ea 100644 /* * The secondary processor is waiting to be released from -@@ -123,7 +123,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -123,7 +123,7 @@ int __cpuinit boot_secondary(unsigned in if (timeout == 0) { printk(KERN_ERR "cpu1 power enable failed"); @@ -69,7 +69,7 @@ index 36c3984..77499ea 100644 return -ETIMEDOUT; } } -@@ -151,7 +151,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -151,7 +151,7 @@ int __cpuinit boot_secondary(unsigned in * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ @@ -78,10 +78,10 @@ index 36c3984..77499ea 100644 return pen_release != -1 ? -ENOSYS : 0; } -diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c -index db0117e..87daf5f 100644 ---- a/arch/arm/mach-msm/platsmp.c -+++ b/arch/arm/mach-msm/platsmp.c +Index: linux-stable/arch/arm/mach-msm/platsmp.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-msm/platsmp.c ++++ linux-stable/arch/arm/mach-msm/platsmp.c @@ -40,7 +40,7 @@ extern void msm_secondary_startup(void); */ volatile int pen_release = -1; @@ -91,7 +91,7 @@ index db0117e..87daf5f 100644 static inline int get_core_count(void) { -@@ -70,8 +70,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) +@@ -70,8 +70,8 @@ void __cpuinit platform_secondary_init(u /* * Synchronise with the boot thread. */ @@ -102,7 +102,7 @@ index db0117e..87daf5f 100644 } static __cpuinit void prepare_cold_cpu(unsigned int cpu) -@@ -108,7 +108,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -108,7 +108,7 @@ int __cpuinit boot_secondary(unsigned in * set synchronisation state between this boot processor * and the secondary one */ @@ -111,7 +111,7 @@ index db0117e..87daf5f 100644 /* * The secondary processor is waiting to be released from -@@ -142,7 +142,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -142,7 +142,7 @@ int __cpuinit boot_secondary(unsigned in * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ @@ -120,11 +120,11 @@ index db0117e..87daf5f 100644 return pen_release != -1 ? -ENOSYS : 0; } -diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c -index deffbf1..81ca676 100644 ---- a/arch/arm/mach-omap2/omap-smp.c -+++ b/arch/arm/mach-omap2/omap-smp.c -@@ -34,7 +34,7 @@ +Index: linux-stable/arch/arm/mach-omap2/omap-smp.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-omap2/omap-smp.c ++++ linux-stable/arch/arm/mach-omap2/omap-smp.c +@@ -42,7 +42,7 @@ /* SCU base address */ static void __iomem *scu_base; @@ -133,7 +133,7 @@ index deffbf1..81ca676 100644 void __iomem *omap4_get_scu_base(void) { -@@ -65,8 +65,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) +@@ -73,8 +73,8 @@ void __cpuinit platform_secondary_init(u /* * Synchronise with the boot thread. */ @@ -144,7 +144,7 @@ index deffbf1..81ca676 100644 } int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) -@@ -77,7 +77,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -87,7 +87,7 @@ int __cpuinit boot_secondary(unsigned in * Set synchronisation state between this boot processor * and the secondary one */ @@ -153,7 +153,7 @@ index deffbf1..81ca676 100644 /* * Update the AuxCoreBoot0 with boot state for secondary core. -@@ -117,7 +117,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -131,7 +131,7 @@ int __cpuinit boot_secondary(unsigned in * Now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ @@ -162,11 +162,11 @@ index deffbf1..81ca676 100644 return 0; } -diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c -index eff5842..acc9da2 100644 ---- a/arch/arm/mach-ux500/platsmp.c -+++ b/arch/arm/mach-ux500/platsmp.c -@@ -58,7 +58,7 @@ static void __iomem *scu_base_addr(void) +Index: linux-stable/arch/arm/mach-ux500/platsmp.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-ux500/platsmp.c ++++ linux-stable/arch/arm/mach-ux500/platsmp.c +@@ -56,7 +56,7 @@ static void __iomem *scu_base_addr(void) return NULL; } @@ -175,7 +175,7 @@ index eff5842..acc9da2 100644 void __cpuinit platform_secondary_init(unsigned int cpu) { -@@ -78,8 +78,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) +@@ -76,8 +76,8 @@ void __cpuinit platform_secondary_init(u /* * Synchronise with the boot thread. */ @@ -186,7 +186,7 @@ index eff5842..acc9da2 100644 } int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) -@@ -90,7 +90,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -88,7 +88,7 @@ int __cpuinit boot_secondary(unsigned in * set synchronisation state between this boot processor * and the secondary one */ @@ -195,7 +195,7 @@ index eff5842..acc9da2 100644 /* * The secondary processor is waiting to be released from -@@ -111,7 +111,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -109,7 +109,7 @@ int __cpuinit boot_secondary(unsigned in * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ @@ -204,11 +204,11 @@ index eff5842..acc9da2 100644 return pen_release != -1 ? -ENOSYS : 0; } -diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c -index 49c7db4..1f7a3d2 100644 ---- a/arch/arm/plat-versatile/platsmp.c -+++ b/arch/arm/plat-versatile/platsmp.c -@@ -38,7 +38,7 @@ static void __cpuinit write_pen_release(int val) +Index: linux-stable/arch/arm/plat-versatile/platsmp.c +=================================================================== +--- linux-stable.orig/arch/arm/plat-versatile/platsmp.c ++++ linux-stable/arch/arm/plat-versatile/platsmp.c +@@ -38,7 +38,7 @@ static void __cpuinit write_pen_release( outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1)); } @@ -217,7 +217,7 @@ index 49c7db4..1f7a3d2 100644 void __cpuinit platform_secondary_init(unsigned int cpu) { -@@ -58,8 +58,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu) +@@ -58,8 +58,8 @@ void __cpuinit platform_secondary_init(u /* * Synchronise with the boot thread. */ @@ -228,7 +228,7 @@ index 49c7db4..1f7a3d2 100644 } int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) -@@ -70,7 +70,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -70,7 +70,7 @@ int __cpuinit boot_secondary(unsigned in * Set synchronisation state between this boot processor * and the secondary one */ @@ -237,7 +237,7 @@ index 49c7db4..1f7a3d2 100644 /* * This is really belt and braces; we hold unintended secondary -@@ -100,7 +100,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +@@ -100,7 +100,7 @@ int __cpuinit boot_secondary(unsigned in * now the secondary core is starting up let it run its * calibrations, then wait for it to finish */ diff --git a/debian/patches/features/all/rt/0220-arm-disable-highmem-on-rt.patch.patch b/debian/patches/features/all/rt/arm-disable-highmem-on-rt.patch similarity index 60% rename from debian/patches/features/all/rt/0220-arm-disable-highmem-on-rt.patch.patch rename to debian/patches/features/all/rt/arm-disable-highmem-on-rt.patch index 2447130bd..2c88ad0d1 100644 --- a/debian/patches/features/all/rt/0220-arm-disable-highmem-on-rt.patch.patch +++ b/debian/patches/features/all/rt/arm-disable-highmem-on-rt.patch @@ -1,18 +1,17 @@ -From 258667122b870cded6481bb169c1cc4fc28d6913 Mon Sep 17 00:00:00 2001 +Subject: arm-disable-highmem-on-rt.patch From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:09:28 +0200 -Subject: [220/256] arm-disable-highmem-on-rt.patch Signed-off-by: Thomas Gleixner --- arch/arm/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index f6fa4db..be61c6e 100644 ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -1725,7 +1725,7 @@ config HAVE_ARCH_PFN_VALID +Index: linux-stable/arch/arm/Kconfig +=================================================================== +--- linux-stable.orig/arch/arm/Kconfig ++++ linux-stable/arch/arm/Kconfig +@@ -1737,7 +1737,7 @@ config HAVE_ARCH_PFN_VALID config HIGHMEM bool "High Memory Support" diff --git a/debian/patches/features/all/rt/0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch b/debian/patches/features/all/rt/arm-mark-pmu-interupt-no-thread.patch similarity index 61% rename from debian/patches/features/all/rt/0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch rename to debian/patches/features/all/rt/arm-mark-pmu-interupt-no-thread.patch index 9469f3473..65a9900f0 100644 --- a/debian/patches/features/all/rt/0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch +++ b/debian/patches/features/all/rt/arm-mark-pmu-interupt-no-thread.patch @@ -1,7 +1,6 @@ -From a3c959e3bc9ff28e2ed8468d32b36137a7cfcd05 Mon Sep 17 00:00:00 2001 +Subject: arm: Mark pmu interupt IRQF_NO_THREAD From: Thomas Gleixner Date: Wed, 16 Mar 2011 14:45:31 +0100 -Subject: [016/256] arm: Mark pmu interupt IRQF_NO_THREAD PMU interrupt must not be threaded. Remove IRQF_DISABLED while at it as we run all handlers with interrupts disabled anyway. @@ -11,11 +10,11 @@ Signed-off-by: Thomas Gleixner arch/arm/kernel/perf_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c -index 186c8cb..b2216b7 100644 ---- a/arch/arm/kernel/perf_event.c -+++ b/arch/arm/kernel/perf_event.c -@@ -433,7 +433,7 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) +Index: linux-stable/arch/arm/kernel/perf_event.c +=================================================================== +--- linux-stable.orig/arch/arm/kernel/perf_event.c ++++ linux-stable/arch/arm/kernel/perf_event.c +@@ -430,7 +430,7 @@ armpmu_reserve_hardware(struct arm_pmu * } err = request_irq(irq, handle_irq, diff --git a/debian/patches/features/all/rt/0019-arm-omap-make-wakeupgen_lock-raw.patch.patch b/debian/patches/features/all/rt/arm-omap-make-wakeupgen_lock-raw.patch similarity index 66% rename from debian/patches/features/all/rt/0019-arm-omap-make-wakeupgen_lock-raw.patch.patch rename to debian/patches/features/all/rt/arm-omap-make-wakeupgen_lock-raw.patch index f92b153f9..7faf47b22 100644 --- a/debian/patches/features/all/rt/0019-arm-omap-make-wakeupgen_lock-raw.patch.patch +++ b/debian/patches/features/all/rt/arm-omap-make-wakeupgen_lock-raw.patch @@ -1,27 +1,26 @@ -From b681b3c0f275d25de13484b9235c11b2bd2cac7f Mon Sep 17 00:00:00 2001 +Subject: arm-omap-make-wakeupgen_lock-raw.patch From: Thomas Gleixner Date: Wed, 11 Apr 2012 11:26:38 +0200 -Subject: [019/256] arm-omap-make-wakeupgen_lock-raw.patch Signed-off-by: Thomas Gleixner --- arch/arm/mach-omap2/omap-wakeupgen.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) -diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c -index 42cd7fb..dbc2914 100644 ---- a/arch/arm/mach-omap2/omap-wakeupgen.c -+++ b/arch/arm/mach-omap2/omap-wakeupgen.c -@@ -43,7 +43,7 @@ +Index: linux-stable/arch/arm/mach-omap2/omap-wakeupgen.c +=================================================================== +--- linux-stable.orig/arch/arm/mach-omap2/omap-wakeupgen.c ++++ linux-stable/arch/arm/mach-omap2/omap-wakeupgen.c +@@ -45,7 +45,7 @@ static void __iomem *wakeupgen_base; static void __iomem *sar_base; -static DEFINE_SPINLOCK(wakeupgen_lock); +static DEFINE_RAW_SPINLOCK(wakeupgen_lock); - static unsigned int irq_target_cpu[NR_IRQS]; - - /* -@@ -128,9 +128,9 @@ static void wakeupgen_mask(struct irq_data *d) + static unsigned int irq_target_cpu[MAX_IRQS]; + static unsigned int irq_banks = MAX_NR_REG_BANKS; + static unsigned int max_irqs = MAX_IRQS; +@@ -133,9 +133,9 @@ static void wakeupgen_mask(struct irq_da { unsigned long flags; @@ -33,7 +32,7 @@ index 42cd7fb..dbc2914 100644 } /* -@@ -140,9 +140,9 @@ static void wakeupgen_unmask(struct irq_data *d) +@@ -145,9 +145,9 @@ static void wakeupgen_unmask(struct irq_ { unsigned long flags; @@ -45,7 +44,7 @@ index 42cd7fb..dbc2914 100644 } #ifdef CONFIG_HOTPLUG_CPU -@@ -183,7 +183,7 @@ static void wakeupgen_irqmask_all(unsigned int cpu, unsigned int set) +@@ -188,7 +188,7 @@ static void wakeupgen_irqmask_all(unsign { unsigned long flags; @@ -54,7 +53,7 @@ index 42cd7fb..dbc2914 100644 if (set) { _wakeupgen_save_masks(cpu); _wakeupgen_set_all(cpu, WKG_MASK_ALL); -@@ -191,7 +191,7 @@ static void wakeupgen_irqmask_all(unsigned int cpu, unsigned int set) +@@ -196,7 +196,7 @@ static void wakeupgen_irqmask_all(unsign _wakeupgen_set_all(cpu, WKG_UNMASK_ALL); _wakeupgen_restore_masks(cpu); } diff --git a/debian/patches/features/all/rt/0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch b/debian/patches/features/all/rt/ata-disable-interrupts-if-non-rt.patch similarity index 72% rename from debian/patches/features/all/rt/0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch rename to debian/patches/features/all/rt/ata-disable-interrupts-if-non-rt.patch index 46151cdab..6436e2c39 100644 --- a/debian/patches/features/all/rt/0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch +++ b/debian/patches/features/all/rt/ata-disable-interrupts-if-non-rt.patch @@ -1,22 +1,22 @@ -From 8924ef79ece1396ff4aef7027ac8fdf279349515 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Fri, 3 Jul 2009 08:44:29 -0500 -Subject: [064/256] ata: Do not disable interrupts in ide code for preempt-rt +Subject: ata: Do not disable interrupts in ide code for preempt-rt Use the local_irq_*_nort variants. Signed-off-by: Steven Rostedt Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/ata/libata-sff.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) -diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c -index d8af325..ad3130d 100644 ---- a/drivers/ata/libata-sff.c -+++ b/drivers/ata/libata-sff.c -@@ -678,9 +678,9 @@ unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, unsigned char *buf, +Index: linux-stable/drivers/ata/libata-sff.c +=================================================================== +--- linux-stable.orig/drivers/ata/libata-sff.c ++++ linux-stable/drivers/ata/libata-sff.c +@@ -678,9 +678,9 @@ unsigned int ata_sff_data_xfer_noirq(str unsigned long flags; unsigned int consumed; @@ -28,7 +28,7 @@ index d8af325..ad3130d 100644 return consumed; } -@@ -719,7 +719,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) +@@ -719,7 +719,7 @@ static void ata_pio_sector(struct ata_qu unsigned long flags; /* FIXME: use a bounce buffer */ @@ -37,7 +37,7 @@ index d8af325..ad3130d 100644 buf = kmap_atomic(page); /* do the actual data transfer */ -@@ -727,7 +727,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) +@@ -727,7 +727,7 @@ static void ata_pio_sector(struct ata_qu do_write); kunmap_atomic(buf); diff --git a/debian/patches/features/all/rt/0006-block-Shorten-interrupt-disabled-regions.patch b/debian/patches/features/all/rt/block-shorten-interrupt-disabled-regions.patch similarity index 78% rename from debian/patches/features/all/rt/0006-block-Shorten-interrupt-disabled-regions.patch rename to debian/patches/features/all/rt/block-shorten-interrupt-disabled-regions.patch index 0ecfc8daa..082a86de2 100644 --- a/debian/patches/features/all/rt/0006-block-Shorten-interrupt-disabled-regions.patch +++ b/debian/patches/features/all/rt/block-shorten-interrupt-disabled-regions.patch @@ -1,7 +1,6 @@ -From 907830916646eccd2a8170dbfbc8f1f9482c1bf3 Mon Sep 17 00:00:00 2001 +Subject: block: Shorten interrupt disabled regions From: Thomas Gleixner Date: Wed, 22 Jun 2011 19:47:02 +0200 -Subject: [006/256] block: Shorten interrupt disabled regions Moving the blk_sched_flush_plug() call out of the interrupt/preempt disabled region in the scheduler allows us to replace @@ -47,11 +46,11 @@ Signed-off-by: Thomas Gleixner block/blk-core.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) -diff --git a/block/blk-core.c b/block/blk-core.c -index 1f61b74..0d947d0 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -302,7 +302,11 @@ void __blk_run_queue(struct request_queue *q) +Index: linux-stable/block/blk-core.c +=================================================================== +--- linux-stable.orig/block/blk-core.c ++++ linux-stable/block/blk-core.c +@@ -304,7 +304,11 @@ void __blk_run_queue(struct request_queu { if (unlikely(blk_queue_stopped(q))) return; @@ -64,7 +63,7 @@ index 1f61b74..0d947d0 100644 q->request_fn(q); } EXPORT_SYMBOL(__blk_run_queue); -@@ -2779,11 +2783,11 @@ static void queue_unplugged(struct request_queue *q, unsigned int depth, +@@ -2902,11 +2906,11 @@ static void queue_unplugged(struct reque * this lock). */ if (from_schedule) { @@ -78,7 +77,7 @@ index 1f61b74..0d947d0 100644 } } -@@ -2809,7 +2813,6 @@ static void flush_plug_callbacks(struct blk_plug *plug) +@@ -2956,7 +2960,6 @@ EXPORT_SYMBOL(blk_check_plugged); void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) { struct request_queue *q; @@ -86,7 +85,7 @@ index 1f61b74..0d947d0 100644 struct request *rq; LIST_HEAD(list); unsigned int depth; -@@ -2830,11 +2833,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) +@@ -2977,11 +2980,6 @@ void blk_flush_plug_list(struct blk_plug q = NULL; depth = 0; @@ -98,7 +97,7 @@ index 1f61b74..0d947d0 100644 while (!list_empty(&list)) { rq = list_entry_rq(list.next); list_del_init(&rq->queuelist); -@@ -2847,7 +2845,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) +@@ -2994,7 +2992,7 @@ void blk_flush_plug_list(struct blk_plug queue_unplugged(q, depth, from_schedule); q = rq->q; depth = 0; @@ -107,7 +106,7 @@ index 1f61b74..0d947d0 100644 } /* -@@ -2874,8 +2872,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) +@@ -3021,8 +3019,6 @@ void blk_flush_plug_list(struct blk_plug */ if (q) queue_unplugged(q, depth, from_schedule); diff --git a/debian/patches/features/all/rt/0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch b/debian/patches/features/all/rt/bug-rt-dependend-variants.patch similarity index 52% rename from debian/patches/features/all/rt/0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch rename to debian/patches/features/all/rt/bug-rt-dependend-variants.patch index 019281ff0..35a80e1ce 100644 --- a/debian/patches/features/all/rt/0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch +++ b/debian/patches/features/all/rt/bug-rt-dependend-variants.patch @@ -1,30 +1,19 @@ -From e3f58ac8f56b9d85886a6feadf63b46e91200290 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:58 -0500 -Subject: [061/256] bug: BUG_ON/WARN_ON variants dependend on RT/!RT +Subject: bug: BUG_ON/WARN_ON variants dependend on RT/!RT Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner ---- - include/asm-generic/bug.h | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) -diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h -index 2520a6e..0e41ade 100644 ---- a/include/asm-generic/bug.h -+++ b/include/asm-generic/bug.h -@@ -3,6 +3,10 @@ - - #include - -+#ifndef __ASSEMBLY__ -+extern void __WARN_ON(const char *func, const char *file, const int line); -+#endif /* __ASSEMBLY__ */ -+ - #ifdef CONFIG_BUG - - #ifdef CONFIG_GENERIC_BUG -@@ -202,4 +206,18 @@ extern void warn_slowpath_null(const char *file, const int line); +--- + include/asm-generic/bug.h | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +Index: linux-stable/include/asm-generic/bug.h +=================================================================== +--- linux-stable.orig/include/asm-generic/bug.h ++++ linux-stable/include/asm-generic/bug.h +@@ -202,6 +202,20 @@ extern void warn_slowpath_null(const cha # define WARN_ON_SMP(x) ({0;}) #endif @@ -42,4 +31,6 @@ index 2520a6e..0e41ade 100644 +# define WARN_ON_ONCE_NONRT(condition) WARN_ON_ONCE(condition) +#endif + + #endif /* __ASSEMBLY__ */ + #endif diff --git a/debian/patches/features/all/rt/0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch b/debian/patches/features/all/rt/clocksource-tclib-allow-higher-clockrates.patch similarity index 80% rename from debian/patches/features/all/rt/0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch rename to debian/patches/features/all/rt/clocksource-tclib-allow-higher-clockrates.patch index c6e1753f2..98561a41b 100644 --- a/debian/patches/features/all/rt/0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch +++ b/debian/patches/features/all/rt/clocksource-tclib-allow-higher-clockrates.patch @@ -1,23 +1,22 @@ -From 961f5156b0d24dcda2e19f2469f85cff6bd8f220 Mon Sep 17 00:00:00 2001 From: Benedikt Spranger Date: Mon, 8 Mar 2010 18:57:04 +0100 -Subject: [027/256] clocksource: TCLIB: Allow higher clock rates for clock - events +Subject: clocksource: TCLIB: Allow higher clock rates for clock events As default the TCLIB uses the 32KiHz base clock rate for clock events. Add a compile time selection to allow higher clock resulution. Signed-off-by: Benedikt Spranger Signed-off-by: Thomas Gleixner + --- - drivers/clocksource/tcb_clksrc.c | 44 ++++++++++++++++++++++---------------- - drivers/misc/Kconfig | 11 ++++++++-- + drivers/clocksource/tcb_clksrc.c | 44 +++++++++++++++++++++++---------------- + drivers/misc/Kconfig | 11 +++++++-- 2 files changed, 35 insertions(+), 20 deletions(-) -diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c -index 32cb929..ac0bb2e 100644 ---- a/drivers/clocksource/tcb_clksrc.c -+++ b/drivers/clocksource/tcb_clksrc.c +Index: linux-stable/drivers/clocksource/tcb_clksrc.c +=================================================================== +--- linux-stable.orig/drivers/clocksource/tcb_clksrc.c ++++ linux-stable/drivers/clocksource/tcb_clksrc.c @@ -23,8 +23,7 @@ * this 32 bit free-running counter. the second channel is not used. * @@ -36,7 +35,7 @@ index 32cb929..ac0bb2e 100644 void __iomem *regs; }; -@@ -82,13 +82,6 @@ static struct tc_clkevt_device *to_tc_clkevt(struct clock_event_device *clkevt) +@@ -82,13 +82,6 @@ static struct tc_clkevt_device *to_tc_cl return container_of(clkevt, struct tc_clkevt_device, clkevt); } @@ -50,7 +49,7 @@ index 32cb929..ac0bb2e 100644 static u32 timer_clock; static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) -@@ -111,11 +104,12 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) +@@ -111,11 +104,12 @@ static void tc_mode(enum clock_event_mod case CLOCK_EVT_MODE_PERIODIC: clk_enable(tcd->clk); @@ -65,7 +64,7 @@ index 32cb929..ac0bb2e 100644 /* Enable clock and interrupts on RC compare */ __raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER)); -@@ -128,7 +122,7 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) +@@ -128,7 +122,7 @@ static void tc_mode(enum clock_event_mod case CLOCK_EVT_MODE_ONESHOT: clk_enable(tcd->clk); @@ -74,7 +73,7 @@ index 32cb929..ac0bb2e 100644 __raw_writel(timer_clock | ATMEL_TC_CPCSTOP | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO, regs + ATMEL_TC_REG(2, CMR)); -@@ -158,8 +152,12 @@ static struct tc_clkevt_device clkevt = { +@@ -158,8 +152,12 @@ static struct tc_clkevt_device clkevt = .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .shift = 32, @@ -98,7 +97,7 @@ index 32cb929..ac0bb2e 100644 struct clk *t2_clk = tc->clk[2]; int irq = tc->irq[2]; -@@ -194,11 +193,17 @@ static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) +@@ -194,11 +193,17 @@ static void __init setup_clkevents(struc clkevt.clk = t2_clk; tc_irqaction.dev_id = &clkevt; @@ -133,11 +132,11 @@ index 32cb929..ac0bb2e 100644 return 0; } arch_initcall(tcb_clksrc_init); -diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index c779509..504daa3 100644 ---- a/drivers/misc/Kconfig -+++ b/drivers/misc/Kconfig -@@ -87,8 +87,7 @@ config ATMEL_TCB_CLKSRC +Index: linux-stable/drivers/misc/Kconfig +=================================================================== +--- linux-stable.orig/drivers/misc/Kconfig ++++ linux-stable/drivers/misc/Kconfig +@@ -88,8 +88,7 @@ config ATMEL_TCB_CLKSRC are combined to make a single 32-bit timer. When GENERIC_CLOCKEVENTS is defined, the third timer channel @@ -147,7 +146,7 @@ index c779509..504daa3 100644 config ATMEL_TCB_CLKSRC_BLOCK int -@@ -102,6 +101,14 @@ config ATMEL_TCB_CLKSRC_BLOCK +@@ -103,6 +102,14 @@ config ATMEL_TCB_CLKSRC_BLOCK TC can be used for other purposes, such as PWM generation and interval timing. diff --git a/debian/patches/features/all/rt/0131-cond-resched-lock-rt-tweak.patch.patch b/debian/patches/features/all/rt/cond-resched-lock-rt-tweak.patch similarity index 65% rename from debian/patches/features/all/rt/0131-cond-resched-lock-rt-tweak.patch.patch rename to debian/patches/features/all/rt/cond-resched-lock-rt-tweak.patch index 56a995da7..e99b6bad1 100644 --- a/debian/patches/features/all/rt/0131-cond-resched-lock-rt-tweak.patch.patch +++ b/debian/patches/features/all/rt/cond-resched-lock-rt-tweak.patch @@ -1,17 +1,16 @@ -From 7fa364c6068b2175556853dc3b7e6194030758a3 Mon Sep 17 00:00:00 2001 +Subject: cond-resched-lock-rt-tweak.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 22:51:33 +0200 -Subject: [131/256] cond-resched-lock-rt-tweak.patch Signed-off-by: Thomas Gleixner --- include/linux/sched.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index b76e0c8..a6b9a6d 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h @@ -2689,7 +2689,7 @@ extern int _cond_resched(void); extern int __cond_resched_lock(spinlock_t *lock); diff --git a/debian/patches/features/all/rt/0130-cond-resched-softirq-fix.patch.patch b/debian/patches/features/all/rt/cond-resched-softirq-rt.patch similarity index 63% rename from debian/patches/features/all/rt/0130-cond-resched-softirq-fix.patch.patch rename to debian/patches/features/all/rt/cond-resched-softirq-rt.patch index 028b3010a..f3905a2dd 100644 --- a/debian/patches/features/all/rt/0130-cond-resched-softirq-fix.patch.patch +++ b/debian/patches/features/all/rt/cond-resched-softirq-rt.patch @@ -1,7 +1,6 @@ -From b45ecdef4d57b4179dca4c3360543c1d65f16fbb Mon Sep 17 00:00:00 2001 +Subject: cond-resched-softirq-fix.patch From: Thomas Gleixner Date: Thu, 14 Jul 2011 09:56:44 +0200 -Subject: [130/256] cond-resched-softirq-fix.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/sched/core.c | 2 ++ 2 files changed, 6 insertions(+) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index d177da5..b76e0c8 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -2700,12 +2700,16 @@ extern int __cond_resched_lock(spinlock_t *lock); +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -2700,12 +2700,16 @@ extern int __cond_resched_lock(spinlock_ __cond_resched_lock(lock); \ }) @@ -30,11 +29,11 @@ index d177da5..b76e0c8 100644 /* * Does a critical section need to be broken due to another -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index dbe9a7d..e88cccc 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4605,6 +4605,7 @@ int __cond_resched_lock(spinlock_t *lock) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -4832,6 +4832,7 @@ int __cond_resched_lock(spinlock_t *lock } EXPORT_SYMBOL(__cond_resched_lock); @@ -42,7 +41,7 @@ index dbe9a7d..e88cccc 100644 int __sched __cond_resched_softirq(void) { BUG_ON(!in_softirq()); -@@ -4618,6 +4619,7 @@ int __sched __cond_resched_softirq(void) +@@ -4845,6 +4846,7 @@ int __sched __cond_resched_softirq(void) return 0; } EXPORT_SYMBOL(__cond_resched_softirq); diff --git a/debian/patches/features/all/rt/0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch b/debian/patches/features/all/rt/cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch similarity index 83% rename from debian/patches/features/all/rt/0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch rename to debian/patches/features/all/rt/cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch index 6536f638e..297791e6f 100644 --- a/debian/patches/features/all/rt/0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch +++ b/debian/patches/features/all/rt/cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch @@ -1,7 +1,6 @@ -From c6bd5675cda088dacd4f09bf7a6ebbaafa581589 Mon Sep 17 00:00:00 2001 +Subject: cpu: Make hotplug.lock a "sleeping" spinlock on RT From: Steven Rostedt -Date: Fri, 2 Mar 2012 10:36:57 -0500 -Subject: [240/256] cpu: Make hotplug.lock a "sleeping" spinlock on RT +Date: Fri, 02 Mar 2012 10:36:57 -0500 Tasks can block on hotplug.lock in pin_current_cpu(), but their state might be != RUNNING. So the mutex wakeup will set the state @@ -23,11 +22,11 @@ Signed-off-by: Thomas Gleixner kernel/cpu.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index 37b2212..d79d33a 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -46,7 +46,12 @@ static int cpu_hotplug_disabled; +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -51,7 +51,12 @@ static int cpu_hotplug_disabled; static struct { struct task_struct *active_writer; @@ -40,7 +39,7 @@ index 37b2212..d79d33a 100644 /* * Also blocks the new readers during * an ongoing cpu hotplug operation. -@@ -54,10 +59,22 @@ static struct { +@@ -59,10 +64,22 @@ static struct { int refcount; } cpu_hotplug = { .active_writer = NULL, @@ -63,7 +62,7 @@ index 37b2212..d79d33a 100644 struct hotplug_pcp { struct task_struct *unplug; int refcount; -@@ -87,8 +104,8 @@ retry: +@@ -92,8 +109,8 @@ retry: return; } preempt_enable(); @@ -74,7 +73,7 @@ index 37b2212..d79d33a 100644 preempt_disable(); goto retry; } -@@ -161,9 +178,9 @@ void get_online_cpus(void) +@@ -166,9 +183,9 @@ void get_online_cpus(void) might_sleep(); if (cpu_hotplug.active_writer == current) return; @@ -86,7 +85,7 @@ index 37b2212..d79d33a 100644 } EXPORT_SYMBOL_GPL(get_online_cpus); -@@ -172,10 +189,10 @@ void put_online_cpus(void) +@@ -177,10 +194,10 @@ void put_online_cpus(void) { if (cpu_hotplug.active_writer == current) return; @@ -99,7 +98,7 @@ index 37b2212..d79d33a 100644 } EXPORT_SYMBOL_GPL(put_online_cpus); -@@ -207,11 +224,11 @@ static void cpu_hotplug_begin(void) +@@ -212,11 +229,11 @@ static void cpu_hotplug_begin(void) cpu_hotplug.active_writer = current; for (;;) { @@ -113,7 +112,7 @@ index 37b2212..d79d33a 100644 schedule(); } } -@@ -219,7 +236,7 @@ static void cpu_hotplug_begin(void) +@@ -224,7 +241,7 @@ static void cpu_hotplug_begin(void) static void cpu_hotplug_done(void) { cpu_hotplug.active_writer = NULL; diff --git a/debian/patches/features/all/rt/cpu-rt-rework-cpu-down.patch b/debian/patches/features/all/rt/cpu-rt-rework-cpu-down.patch new file mode 100644 index 000000000..de4f8a516 --- /dev/null +++ b/debian/patches/features/all/rt/cpu-rt-rework-cpu-down.patch @@ -0,0 +1,550 @@ +From: Steven Rostedt +Date: Mon, 16 Jul 2012 08:07:43 +0000 +Subject: cpu/rt: Rework cpu down for PREEMPT_RT + +Bringing a CPU down is a pain with the PREEMPT_RT kernel because +tasks can be preempted in many more places than in non-RT. In +order to handle per_cpu variables, tasks may be pinned to a CPU +for a while, and even sleep. But these tasks need to be off the CPU +if that CPU is going down. + +Several synchronization methods have been tried, but when stressed +they failed. This is a new approach. + +A sync_tsk thread is still created and tasks may still block on a +lock when the CPU is going down, but how that works is a bit different. +When cpu_down() starts, it will create the sync_tsk and wait on it +to inform that current tasks that are pinned on the CPU are no longer +pinned. But new tasks that are about to be pinned will still be allowed +to do so at this time. + +Then the notifiers are called. Several notifiers will bring down tasks +that will enter these locations. Some of these tasks will take locks +of other tasks that are on the CPU. If we don't let those other tasks +continue, but make them block until CPU down is done, the tasks that +the notifiers are waiting on will never complete as they are waiting +for the locks held by the tasks that are blocked. + +Thus we still let the task pin the CPU until the notifiers are done. +After the notifiers run, we then make new tasks entering the pinned +CPU sections grab a mutex and wait. This mutex is now a per CPU mutex +in the hotplug_pcp descriptor. + +To help things along, a new function in the scheduler code is created +called migrate_me(). This function will try to migrate the current task +off the CPU this is going down if possible. When the sync_tsk is created, +all tasks will then try to migrate off the CPU going down. There are +several cases that this wont work, but it helps in most cases. + +After the notifiers are called and if a task can't migrate off but enters +the pin CPU sections, it will be forced to wait on the hotplug_pcp mutex +until the CPU down is complete. Then the scheduler will force the migration +anyway. + +Also, I found that THREAD_BOUND need to also be accounted for in the +pinned CPU, and the migrate_disable no longer treats them special. +This helps fix issues with ksoftirqd and workqueue that unbind on CPU down. + +Signed-off-by: Steven Rostedt +Signed-off-by: Thomas Gleixner + +--- + include/linux/sched.h | 7 + + kernel/cpu.c | 240 +++++++++++++++++++++++++++++++++++++++++--------- + kernel/sched/core.c | 82 ++++++++++++++++- + 3 files changed, 285 insertions(+), 44 deletions(-) + +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1952,6 +1952,10 @@ extern void do_set_cpus_allowed(struct t + + extern int set_cpus_allowed_ptr(struct task_struct *p, + const struct cpumask *new_mask); ++int migrate_me(void); ++void tell_sched_cpu_down_begin(int cpu); ++void tell_sched_cpu_down_done(int cpu); ++ + #else + static inline void do_set_cpus_allowed(struct task_struct *p, + const struct cpumask *new_mask) +@@ -1964,6 +1968,9 @@ static inline int set_cpus_allowed_ptr(s + return -EINVAL; + return 0; + } ++static inline int migrate_me(void) { return 0; } ++static inline void tell_sched_cpu_down_begin(int cpu) { } ++static inline void tell_sched_cpu_down_done(int cpu) { } + #endif + + #ifdef CONFIG_NO_HZ +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -51,12 +51,7 @@ static int cpu_hotplug_disabled; + + static struct { + struct task_struct *active_writer; +-#ifdef CONFIG_PREEMPT_RT_FULL +- /* Makes the lock keep the task's state */ +- spinlock_t lock; +-#else + struct mutex lock; /* Synchronizes accesses to refcount, */ +-#endif + /* + * Also blocks the new readers during + * an ongoing cpu hotplug operation. +@@ -64,28 +59,46 @@ static struct { + int refcount; + } cpu_hotplug = { + .active_writer = NULL, +-#ifdef CONFIG_PREEMPT_RT_FULL +- .lock = __SPIN_LOCK_UNLOCKED(cpu_hotplug.lock), +-#else + .lock = __MUTEX_INITIALIZER(cpu_hotplug.lock), +-#endif + .refcount = 0, + }; + +-#ifdef CONFIG_PREEMPT_RT_FULL +-# define hotplug_lock() rt_spin_lock(&cpu_hotplug.lock) +-# define hotplug_unlock() rt_spin_unlock(&cpu_hotplug.lock) +-#else +-# define hotplug_lock() mutex_lock(&cpu_hotplug.lock) +-# define hotplug_unlock() mutex_unlock(&cpu_hotplug.lock) +-#endif +- ++/** ++ * hotplug_pcp - per cpu hotplug descriptor ++ * @unplug: set when pin_current_cpu() needs to sync tasks ++ * @sync_tsk: the task that waits for tasks to finish pinned sections ++ * @refcount: counter of tasks in pinned sections ++ * @grab_lock: set when the tasks entering pinned sections should wait ++ * @synced: notifier for @sync_tsk to tell cpu_down it's finished ++ * @mutex: the mutex to make tasks wait (used when @grab_lock is true) ++ * @mutex_init: zero if the mutex hasn't been initialized yet. ++ * ++ * Although @unplug and @sync_tsk may point to the same task, the @unplug ++ * is used as a flag and still exists after @sync_tsk has exited and ++ * @sync_tsk set to NULL. ++ */ + struct hotplug_pcp { + struct task_struct *unplug; ++ struct task_struct *sync_tsk; + int refcount; ++ int grab_lock; + struct completion synced; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ spinlock_t lock; ++#else ++ struct mutex mutex; ++#endif ++ int mutex_init; + }; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++# define hotplug_lock(hp) rt_spin_lock(&(hp)->lock) ++# define hotplug_unlock(hp) rt_spin_unlock(&(hp)->lock) ++#else ++# define hotplug_lock(hp) mutex_lock(&(hp)->mutex) ++# define hotplug_unlock(hp) mutex_unlock(&(hp)->mutex) ++#endif ++ + static DEFINE_PER_CPU(struct hotplug_pcp, hotplug_pcp); + + /** +@@ -99,18 +112,40 @@ static DEFINE_PER_CPU(struct hotplug_pcp + void pin_current_cpu(void) + { + struct hotplug_pcp *hp; ++ int force = 0; + + retry: + hp = &__get_cpu_var(hotplug_pcp); + +- if (!hp->unplug || hp->refcount || preempt_count() > 1 || ++ if (!hp->unplug || hp->refcount || force || preempt_count() > 1 || + hp->unplug == current || (current->flags & PF_STOMPER)) { + hp->refcount++; + return; + } +- preempt_enable(); +- hotplug_lock(); +- hotplug_unlock(); ++ ++ if (hp->grab_lock) { ++ preempt_enable(); ++ hotplug_lock(hp); ++ hotplug_unlock(hp); ++ } else { ++ preempt_enable(); ++ /* ++ * Try to push this task off of this CPU. ++ */ ++ if (!migrate_me()) { ++ preempt_disable(); ++ hp = &__get_cpu_var(hotplug_pcp); ++ if (!hp->grab_lock) { ++ /* ++ * Just let it continue it's already pinned ++ * or about to sleep. ++ */ ++ force = 1; ++ goto retry; ++ } ++ preempt_enable(); ++ } ++ } + preempt_disable(); + goto retry; + } +@@ -132,26 +167,84 @@ void unpin_current_cpu(void) + wake_up_process(hp->unplug); + } + +-/* +- * FIXME: Is this really correct under all circumstances ? +- */ ++static void wait_for_pinned_cpus(struct hotplug_pcp *hp) ++{ ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ while (hp->refcount) { ++ schedule_preempt_disabled(); ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ } ++} ++ + static int sync_unplug_thread(void *data) + { + struct hotplug_pcp *hp = data; + + preempt_disable(); + hp->unplug = current; ++ wait_for_pinned_cpus(hp); ++ ++ /* ++ * This thread will synchronize the cpu_down() with threads ++ * that have pinned the CPU. When the pinned CPU count reaches ++ * zero, we inform the cpu_down code to continue to the next step. ++ */ + set_current_state(TASK_UNINTERRUPTIBLE); +- while (hp->refcount) { +- schedule_preempt_disabled(); ++ preempt_enable(); ++ complete(&hp->synced); ++ ++ /* ++ * If all succeeds, the next step will need tasks to wait till ++ * the CPU is offline before continuing. To do this, the grab_lock ++ * is set and tasks going into pin_current_cpu() will block on the ++ * mutex. But we still need to wait for those that are already in ++ * pinned CPU sections. If the cpu_down() failed, the kthread_should_stop() ++ * will kick this thread out. ++ */ ++ while (!hp->grab_lock && !kthread_should_stop()) { ++ schedule(); ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ } ++ ++ /* Make sure grab_lock is seen before we see a stale completion */ ++ smp_mb(); ++ ++ /* ++ * Now just before cpu_down() enters stop machine, we need to make ++ * sure all tasks that are in pinned CPU sections are out, and new ++ * tasks will now grab the lock, keeping them from entering pinned ++ * CPU sections. ++ */ ++ if (!kthread_should_stop()) { ++ preempt_disable(); ++ wait_for_pinned_cpus(hp); ++ preempt_enable(); ++ complete(&hp->synced); ++ } ++ ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ while (!kthread_should_stop()) { ++ schedule(); + set_current_state(TASK_UNINTERRUPTIBLE); + } + set_current_state(TASK_RUNNING); +- preempt_enable(); +- complete(&hp->synced); ++ ++ /* ++ * Force this thread off this CPU as it's going down and ++ * we don't want any more work on this CPU. ++ */ ++ current->flags &= ~PF_THREAD_BOUND; ++ do_set_cpus_allowed(current, cpu_present_mask); ++ migrate_me(); + return 0; + } + ++static void __cpu_unplug_sync(struct hotplug_pcp *hp) ++{ ++ wake_up_process(hp->sync_tsk); ++ wait_for_completion(&hp->synced); ++} ++ + /* + * Start the sync_unplug_thread on the target cpu and wait for it to + * complete. +@@ -159,23 +252,83 @@ static int sync_unplug_thread(void *data + static int cpu_unplug_begin(unsigned int cpu) + { + struct hotplug_pcp *hp = &per_cpu(hotplug_pcp, cpu); +- struct task_struct *tsk; ++ int err; ++ ++ /* Protected by cpu_hotplug.lock */ ++ if (!hp->mutex_init) { ++#ifdef CONFIG_PREEMPT_RT_FULL ++ spin_lock_init(&hp->lock); ++#else ++ mutex_init(&hp->mutex); ++#endif ++ hp->mutex_init = 1; ++ } ++ ++ /* Inform the scheduler to migrate tasks off this CPU */ ++ tell_sched_cpu_down_begin(cpu); + + init_completion(&hp->synced); +- tsk = kthread_create(sync_unplug_thread, hp, "sync_unplug/%d", cpu); +- if (IS_ERR(tsk)) +- return (PTR_ERR(tsk)); +- kthread_bind(tsk, cpu); +- wake_up_process(tsk); +- wait_for_completion(&hp->synced); ++ ++ hp->sync_tsk = kthread_create(sync_unplug_thread, hp, "sync_unplug/%d", cpu); ++ if (IS_ERR(hp->sync_tsk)) { ++ err = PTR_ERR(hp->sync_tsk); ++ hp->sync_tsk = NULL; ++ return err; ++ } ++ kthread_bind(hp->sync_tsk, cpu); ++ ++ /* ++ * Wait for tasks to get out of the pinned sections, ++ * it's still OK if new tasks enter. Some CPU notifiers will ++ * wait for tasks that are going to enter these sections and ++ * we must not have them block. ++ */ ++ __cpu_unplug_sync(hp); ++ + return 0; + } + ++static void cpu_unplug_sync(unsigned int cpu) ++{ ++ struct hotplug_pcp *hp = &per_cpu(hotplug_pcp, cpu); ++ ++ init_completion(&hp->synced); ++ /* The completion needs to be initialzied before setting grab_lock */ ++ smp_wmb(); ++ ++ /* Grab the mutex before setting grab_lock */ ++ hotplug_lock(hp); ++ hp->grab_lock = 1; ++ ++ /* ++ * The CPU notifiers have been completed. ++ * Wait for tasks to get out of pinned CPU sections and have new ++ * tasks block until the CPU is completely down. ++ */ ++ __cpu_unplug_sync(hp); ++ ++ /* All done with the sync thread */ ++ kthread_stop(hp->sync_tsk); ++ hp->sync_tsk = NULL; ++} ++ + static void cpu_unplug_done(unsigned int cpu) + { + struct hotplug_pcp *hp = &per_cpu(hotplug_pcp, cpu); + + hp->unplug = NULL; ++ /* Let all tasks know cpu unplug is finished before cleaning up */ ++ smp_wmb(); ++ ++ if (hp->sync_tsk) ++ kthread_stop(hp->sync_tsk); ++ ++ if (hp->grab_lock) { ++ hotplug_unlock(hp); ++ /* protected by cpu_hotplug.lock */ ++ hp->grab_lock = 0; ++ } ++ tell_sched_cpu_down_done(cpu); + } + + void get_online_cpus(void) +@@ -183,9 +336,9 @@ void get_online_cpus(void) + might_sleep(); + if (cpu_hotplug.active_writer == current) + return; +- hotplug_lock(); ++ mutex_lock(&cpu_hotplug.lock); + cpu_hotplug.refcount++; +- hotplug_unlock(); ++ mutex_unlock(&cpu_hotplug.lock); + + } + EXPORT_SYMBOL_GPL(get_online_cpus); +@@ -194,10 +347,10 @@ void put_online_cpus(void) + { + if (cpu_hotplug.active_writer == current) + return; +- hotplug_lock(); ++ mutex_lock(&cpu_hotplug.lock); + if (!--cpu_hotplug.refcount && unlikely(cpu_hotplug.active_writer)) + wake_up_process(cpu_hotplug.active_writer); +- hotplug_unlock(); ++ mutex_unlock(&cpu_hotplug.lock); + + } + EXPORT_SYMBOL_GPL(put_online_cpus); +@@ -229,11 +382,11 @@ static void cpu_hotplug_begin(void) + cpu_hotplug.active_writer = current; + + for (;;) { +- hotplug_lock(); ++ mutex_lock(&cpu_hotplug.lock); + if (likely(!cpu_hotplug.refcount)) + break; + __set_current_state(TASK_UNINTERRUPTIBLE); +- hotplug_unlock(); ++ mutex_unlock(&cpu_hotplug.lock); + schedule(); + } + } +@@ -241,7 +394,7 @@ static void cpu_hotplug_begin(void) + static void cpu_hotplug_done(void) + { + cpu_hotplug.active_writer = NULL; +- hotplug_unlock(); ++ mutex_unlock(&cpu_hotplug.lock); + } + + #else /* #if CONFIG_HOTPLUG_CPU */ +@@ -416,6 +569,9 @@ static int __ref _cpu_down(unsigned int + goto out_release; + } + ++ /* Notifiers are done. Don't let any more tasks pin this CPU. */ ++ cpu_unplug_sync(cpu); ++ + err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu)); + if (err) { + /* CPU didn't die: tell everyone. Can't complain. */ +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3418,7 +3418,7 @@ void migrate_disable(void) + { + struct task_struct *p = current; + +- if (in_atomic() || p->flags & PF_THREAD_BOUND) { ++ if (in_atomic()) { + #ifdef CONFIG_SCHED_DEBUG + p->migrate_disable_atomic++; + #endif +@@ -3449,7 +3449,7 @@ void migrate_enable(void) + unsigned long flags; + struct rq *rq; + +- if (in_atomic() || p->flags & PF_THREAD_BOUND) { ++ if (in_atomic()) { + #ifdef CONFIG_SCHED_DEBUG + p->migrate_disable_atomic--; + #endif +@@ -5341,6 +5341,84 @@ void do_set_cpus_allowed(struct task_str + cpumask_copy(&p->cpus_allowed, new_mask); + } + ++static DEFINE_PER_CPU(struct cpumask, sched_cpumasks); ++static DEFINE_MUTEX(sched_down_mutex); ++static cpumask_t sched_down_cpumask; ++ ++void tell_sched_cpu_down_begin(int cpu) ++{ ++ mutex_lock(&sched_down_mutex); ++ cpumask_set_cpu(cpu, &sched_down_cpumask); ++ mutex_unlock(&sched_down_mutex); ++} ++ ++void tell_sched_cpu_down_done(int cpu) ++{ ++ mutex_lock(&sched_down_mutex); ++ cpumask_clear_cpu(cpu, &sched_down_cpumask); ++ mutex_unlock(&sched_down_mutex); ++} ++ ++/** ++ * migrate_me - try to move the current task off this cpu ++ * ++ * Used by the pin_current_cpu() code to try to get tasks ++ * to move off the current CPU as it is going down. ++ * It will only move the task if the task isn't pinned to ++ * the CPU (with migrate_disable, affinity or THREAD_BOUND) ++ * and the task has to be in a RUNNING state. Otherwise the ++ * movement of the task will wake it up (change its state ++ * to running) when the task did not expect it. ++ * ++ * Returns 1 if it succeeded in moving the current task ++ * 0 otherwise. ++ */ ++int migrate_me(void) ++{ ++ struct task_struct *p = current; ++ struct migration_arg arg; ++ struct cpumask *cpumask; ++ struct cpumask *mask; ++ unsigned long flags; ++ unsigned int dest_cpu; ++ struct rq *rq; ++ ++ /* ++ * We can not migrate tasks bounded to a CPU or tasks not ++ * running. The movement of the task will wake it up. ++ */ ++ if (p->flags & PF_THREAD_BOUND || p->state) ++ return 0; ++ ++ mutex_lock(&sched_down_mutex); ++ rq = task_rq_lock(p, &flags); ++ ++ cpumask = &__get_cpu_var(sched_cpumasks); ++ mask = &p->cpus_allowed; ++ ++ cpumask_andnot(cpumask, mask, &sched_down_cpumask); ++ ++ if (!cpumask_weight(cpumask)) { ++ /* It's only on this CPU? */ ++ task_rq_unlock(rq, p, &flags); ++ mutex_unlock(&sched_down_mutex); ++ return 0; ++ } ++ ++ dest_cpu = cpumask_any_and(cpu_active_mask, cpumask); ++ ++ arg.task = p; ++ arg.dest_cpu = dest_cpu; ++ ++ task_rq_unlock(rq, p, &flags); ++ ++ stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg); ++ tlb_migrate_finish(p->mm); ++ mutex_unlock(&sched_down_mutex); ++ ++ return 1; ++} ++ + /* + * This is how migration works: + * diff --git a/debian/patches/features/all/rt/0089-cpu-rt-variants.patch.patch b/debian/patches/features/all/rt/cpu-rt-variants.patch similarity index 65% rename from debian/patches/features/all/rt/0089-cpu-rt-variants.patch.patch rename to debian/patches/features/all/rt/cpu-rt-variants.patch index fcc0c6694..e6eb3b888 100644 --- a/debian/patches/features/all/rt/0089-cpu-rt-variants.patch.patch +++ b/debian/patches/features/all/rt/cpu-rt-variants.patch @@ -1,18 +1,17 @@ -From 8ef3bc01ced54510e190912494f202018fe31643 Mon Sep 17 00:00:00 2001 +Subject: cpu-rt-variants.patch From: Thomas Gleixner Date: Fri, 17 Jun 2011 15:42:38 +0200 -Subject: [089/256] cpu-rt-variants.patch Signed-off-by: Thomas Gleixner --- include/linux/smp.h | 8 ++++++++ 1 file changed, 8 insertions(+) -diff --git a/include/linux/smp.h b/include/linux/smp.h -index 10530d9..04e7ed9 100644 ---- a/include/linux/smp.h -+++ b/include/linux/smp.h -@@ -219,6 +219,14 @@ smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, +Index: linux-stable/include/linux/smp.h +=================================================================== +--- linux-stable.orig/include/linux/smp.h ++++ linux-stable/include/linux/smp.h +@@ -218,6 +218,14 @@ static inline void kick_all_cpus_sync(vo #define get_cpu() ({ preempt_disable(); smp_processor_id(); }) #define put_cpu() preempt_enable() diff --git a/debian/patches/features/all/rt/0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch b/debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch similarity index 66% rename from debian/patches/features/all/rt/0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch rename to debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch index 0ff84fef6..9c819c533 100644 --- a/debian/patches/features/all/rt/0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch +++ b/debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch @@ -1,7 +1,6 @@ -From ce185e640e2da8f73059ddd561a8b1ffac0fc91f Mon Sep 17 00:00:00 2001 +Subject: cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT From: Thomas Gleixner Date: Wed, 14 Dec 2011 01:03:49 +0100 -Subject: [233/256] cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT We can't deal with the cpumask allocations which happen in atomic context (see arch/x86/kernel/apic/io_apic.c) on RT right now. @@ -12,11 +11,11 @@ Signed-off-by: Thomas Gleixner lib/Kconfig | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) -diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index f556832..98c1a17 100644 ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -750,7 +750,7 @@ config IOMMU_HELPER +Index: linux-stable/arch/x86/Kconfig +=================================================================== +--- linux-stable.orig/arch/x86/Kconfig ++++ linux-stable/arch/x86/Kconfig +@@ -757,7 +757,7 @@ config IOMMU_HELPER config MAXSMP bool "Enable Maximum number of SMP Processors and NUMA Nodes" depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL @@ -25,11 +24,11 @@ index f556832..98c1a17 100644 ---help--- Enable maximum number of CPUS and NUMA Nodes for this architecture. If unsure, say N. -diff --git a/lib/Kconfig b/lib/Kconfig -index 4a8aba2..4c03fe3 100644 ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -303,6 +303,7 @@ config CHECK_SIGNATURE +Index: linux-stable/lib/Kconfig +=================================================================== +--- linux-stable.orig/lib/Kconfig ++++ linux-stable/lib/Kconfig +@@ -312,6 +312,7 @@ config CHECK_SIGNATURE config CPUMASK_OFFSTACK bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS diff --git a/debian/patches/features/all/rt/crypto-make-core-static-and-init-scru-early.patch b/debian/patches/features/all/rt/crypto-make-core-static-and-init-scru-early.patch new file mode 100644 index 000000000..d54a4a11b --- /dev/null +++ b/debian/patches/features/all/rt/crypto-make-core-static-and-init-scru-early.patch @@ -0,0 +1,51 @@ +Subject: crypto: Make core builtin and init srcu early +From: Thomas Gleixner +Date: Fri, 12 Oct 2012 11:09:19 +0100 + +When the scru notifier is not initialized before the first user we +crash. + +[ 0.281119] BUG: unable to handle kernel NULL pointer dereference at (null) +[ 0.281124] IP: [] __srcu_read_lock+0x2f/0x79 + +Make the core code built-in for now and enfore early init. + +FIXME: Create a static initializer for this. + +Signed-off-by: Thomas Gleixner +--- + crypto/Kconfig | 2 +- + crypto/api.c | 7 +++++++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +Index: linux-stable/crypto/Kconfig +=================================================================== +--- linux-stable.orig/crypto/Kconfig ++++ linux-stable/crypto/Kconfig +@@ -13,7 +13,7 @@ source "crypto/async_tx/Kconfig" + # Cryptographic API Configuration + # + menuconfig CRYPTO +- tristate "Cryptographic API" ++ bool "Cryptographic API" + help + This option provides the core Cryptographic API. + +Index: linux-stable/crypto/api.c +=================================================================== +--- linux-stable.orig/crypto/api.c ++++ linux-stable/crypto/api.c +@@ -34,6 +34,13 @@ EXPORT_SYMBOL_GPL(crypto_alg_sem); + struct srcu_notifier_head crypto_chain; + EXPORT_SYMBOL_GPL(crypto_chain); + ++static int __init crypto_api_init(void) ++{ ++ srcu_init_notifier_head(&crypto_chain); ++ return 0; ++} ++core_initcall(crypto_api_init); ++ + static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg) + { + atomic_inc(&alg->cra_refcnt); diff --git a/debian/patches/features/all/rt/debugobjects-rt.patch b/debian/patches/features/all/rt/debugobjects-rt.patch new file mode 100644 index 000000000..bc3cba66c --- /dev/null +++ b/debian/patches/features/all/rt/debugobjects-rt.patch @@ -0,0 +1,25 @@ +Subject: debugobjects-rt.patch +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 21:41:35 +0200 + +Signed-off-by: Thomas Gleixner +--- + lib/debugobjects.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +Index: linux-stable/lib/debugobjects.c +=================================================================== +--- linux-stable.orig/lib/debugobjects.c ++++ linux-stable/lib/debugobjects.c +@@ -309,7 +309,10 @@ __debug_object_init(void *addr, struct d + struct debug_obj *obj; + unsigned long flags; + +- fill_pool(); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (preempt_count() == 0 && !irqs_disabled()) ++#endif ++ fill_pool(); + + db = get_bucket((unsigned long) addr); + diff --git a/debian/patches/features/all/rt/0232-dm-Make-rt-aware.patch b/debian/patches/features/all/rt/dm-make-rt-aware.patch similarity index 72% rename from debian/patches/features/all/rt/0232-dm-Make-rt-aware.patch rename to debian/patches/features/all/rt/dm-make-rt-aware.patch index 92cc4ed64..2e11eb5e9 100644 --- a/debian/patches/features/all/rt/0232-dm-Make-rt-aware.patch +++ b/debian/patches/features/all/rt/dm-make-rt-aware.patch @@ -1,7 +1,6 @@ -From fade21f9f82ea6e0b42364a6e3d49f0450722afb Mon Sep 17 00:00:00 2001 +Subject: dm: Make rt aware From: Thomas Gleixner Date: Mon, 14 Nov 2011 23:06:09 +0100 -Subject: [232/256] dm: Make rt aware Use the BUG_ON_NORT variant for the irq_disabled() checks. RT has interrupts legitimately enabled here as we cant deadlock against the @@ -14,11 +13,11 @@ Signed-off-by: Thomas Gleixner drivers/md/dm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/drivers/md/dm.c b/drivers/md/dm.c -index e24143c..ad7d7e3 100644 ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -1648,14 +1648,14 @@ static void dm_request_fn(struct request_queue *q) +Index: linux-stable/drivers/md/dm.c +=================================================================== +--- linux-stable.orig/drivers/md/dm.c ++++ linux-stable/drivers/md/dm.c +@@ -1692,14 +1692,14 @@ static void dm_request_fn(struct request if (map_request(ti, clone, md)) goto requeued; diff --git a/debian/patches/features/all/rt/drivers-net-8139-disable-irq-nosync.patch b/debian/patches/features/all/rt/drivers-net-8139-disable-irq-nosync.patch new file mode 100644 index 000000000..e17452f98 --- /dev/null +++ b/debian/patches/features/all/rt/drivers-net-8139-disable-irq-nosync.patch @@ -0,0 +1,27 @@ +From: Ingo Molnar +Date: Fri, 3 Jul 2009 08:29:24 -0500 +Subject: drivers/net: Use disable_irq_nosync() in 8139too + +Use disable_irq_nosync() instead of disable_irq() as this might be +called in atomic context with netpoll. + +Signed-off-by: Ingo Molnar +Signed-off-by: Thomas Gleixner + +--- + drivers/net/ethernet/realtek/8139too.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux-stable/drivers/net/ethernet/realtek/8139too.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/realtek/8139too.c ++++ linux-stable/drivers/net/ethernet/realtek/8139too.c +@@ -2216,7 +2216,7 @@ static void rtl8139_poll_controller(stru + struct rtl8139_private *tp = netdev_priv(dev); + const int irq = tp->pci_dev->irq; + +- disable_irq(irq); ++ disable_irq_nosync(irq); + rtl8139_interrupt(irq, dev); + enable_irq(irq); + } diff --git a/debian/patches/features/all/rt/0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch b/debian/patches/features/all/rt/drivers-net-at91-make-mdio-protection-rt-safe.patch similarity index 67% rename from debian/patches/features/all/rt/0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch rename to debian/patches/features/all/rt/drivers-net-at91-make-mdio-protection-rt-safe.patch index ae206680e..33e850efd 100644 --- a/debian/patches/features/all/rt/0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch +++ b/debian/patches/features/all/rt/drivers-net-at91-make-mdio-protection-rt-safe.patch @@ -1,7 +1,6 @@ -From e8586bc580f0516100fe73e3e838fd746d491f75 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 17 Nov 2009 12:02:43 +0100 -Subject: [031/256] drivers: net: at91_ether: Make mdio protection -rt safe +Subject: drivers: net: at91_ether: Make mdio protection -rt safe Neither the phy interrupt nor the timer callback which updates the link status in absense of a phy interrupt are taking lp->lock which @@ -14,15 +13,16 @@ Fix this by adding proper locking to at91ether_phy_interrupt() and at91_check_ether() which serializes the access on -rt. Signed-off-by: Thomas Gleixner + --- drivers/net/ethernet/cadence/at91_ether.c | 5 +++++ 1 file changed, 5 insertions(+) -diff --git a/drivers/net/ethernet/cadence/at91_ether.c b/drivers/net/ethernet/cadence/at91_ether.c -index 9061170..6b9e006 100644 ---- a/drivers/net/ethernet/cadence/at91_ether.c -+++ b/drivers/net/ethernet/cadence/at91_ether.c -@@ -201,7 +201,9 @@ static irqreturn_t at91ether_phy_interrupt(int irq, void *dev_id) +Index: linux-stable/drivers/net/ethernet/cadence/at91_ether.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/cadence/at91_ether.c ++++ linux-stable/drivers/net/ethernet/cadence/at91_ether.c +@@ -199,7 +199,9 @@ static irqreturn_t at91ether_phy_interru struct net_device *dev = (struct net_device *) dev_id; struct at91_private *lp = netdev_priv(dev); unsigned int phy; @@ -32,22 +32,22 @@ index 9061170..6b9e006 100644 /* * This hander is triggered on both edges, but the PHY chips expect * level-triggering. We therefore have to check if the PHY actually has -@@ -243,6 +245,7 @@ static irqreturn_t at91ether_phy_interrupt(int irq, void *dev_id) +@@ -241,6 +243,7 @@ static irqreturn_t at91ether_phy_interru done: - disable_mdi(); + disable_mdi(lp); + spin_unlock_irqrestore(&lp->lock, flags); return IRQ_HANDLED; } -@@ -399,9 +402,11 @@ static void at91ether_check_link(unsigned long dev_id) +@@ -397,9 +400,11 @@ static void at91ether_check_link(unsigne struct net_device *dev = (struct net_device *) dev_id; struct at91_private *lp = netdev_priv(dev); + spin_lock_irq(&lp->lock); - enable_mdi(); + enable_mdi(lp); update_linkspeed(dev, 1); - disable_mdi(); + disable_mdi(lp); + spin_unlock_irq(&lp->lock); mod_timer(&lp->check_timer, jiffies + LINK_POLL_INTERVAL); diff --git a/debian/patches/features/all/rt/0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch b/debian/patches/features/all/rt/drivers-net-ehea-mark-rx-irq-no-thread.patch similarity index 81% rename from debian/patches/features/all/rt/0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch rename to debian/patches/features/all/rt/drivers-net-ehea-mark-rx-irq-no-thread.patch index a176323b4..942a767c1 100644 --- a/debian/patches/features/all/rt/0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch +++ b/debian/patches/features/all/rt/drivers-net-ehea-mark-rx-irq-no-thread.patch @@ -1,8 +1,6 @@ -From e6535d525046fb8f73575ec9641c213ebefe16c7 Mon Sep 17 00:00:00 2001 From: Darren Hart Date: Tue, 18 May 2010 14:33:07 -0700 -Subject: [030/256] drivers: net: ehea: Make rx irq handler non-threaded - (IRQF_NO_THREAD) +Subject: drivers: net: ehea: Make rx irq handler non-threaded (IRQF_NO_THREAD) The underlying hardware is edge triggered but presented by XICS as level triggered. The edge triggered interrupts are not reissued after masking. This @@ -35,15 +33,16 @@ Cc: Michael Ellerman Cc: Doug Maxey LKML-Reference: <4BF30793.5070300@us.ibm.com> Signed-off-by: Thomas Gleixner + --- drivers/net/ethernet/ibm/ehea/ehea_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c -index f4d2da0..a4cb742 100644 ---- a/drivers/net/ethernet/ibm/ehea/ehea_main.c -+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c -@@ -1308,7 +1308,7 @@ static int ehea_reg_interrupts(struct net_device *dev) +Index: linux-stable/drivers/net/ethernet/ibm/ehea/ehea_main.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/ibm/ehea/ehea_main.c ++++ linux-stable/drivers/net/ethernet/ibm/ehea/ehea_main.c +@@ -1308,7 +1308,7 @@ static int ehea_reg_interrupts(struct ne "%s-queue%d", dev->name, i); ret = ibmebus_request_irq(pr->eq->attr.ist1, ehea_recv_irq_handler, diff --git a/debian/patches/features/all/rt/0083-drivers-net-fix-livelock-issues.patch b/debian/patches/features/all/rt/drivers-net-fix-livelock-issues.patch similarity index 53% rename from debian/patches/features/all/rt/0083-drivers-net-fix-livelock-issues.patch rename to debian/patches/features/all/rt/drivers-net-fix-livelock-issues.patch index 48b531d0f..e4bfc617b 100644 --- a/debian/patches/features/all/rt/0083-drivers-net-fix-livelock-issues.patch +++ b/debian/patches/features/all/rt/drivers-net-fix-livelock-issues.patch @@ -1,7 +1,6 @@ -From 56d31d400f86dff026047ae500f2d63684b5fb34 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sat, 20 Jun 2009 11:36:54 +0200 -Subject: [083/256] drivers/net: fix livelock issues +Subject: drivers/net: fix livelock issues Preempt-RT runs into a live lock issue with the NETDEV_TX_LOCKED micro optimization. The reason is that the softirq thread is rescheduling @@ -11,21 +10,22 @@ monoplize the CPU and livelock on UP systems. Remove it. Signed-off-by: Thomas Gleixner + --- drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 6 +----- drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 3 +-- drivers/net/ethernet/chelsio/cxgb/sge.c | 3 +-- drivers/net/ethernet/neterion/s2io.c | 7 +------ - drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 7 +++---- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 6 ++---- drivers/net/ethernet/tehuti/tehuti.c | 9 ++------- drivers/net/rionet.c | 6 +----- - 7 files changed, 10 insertions(+), 31 deletions(-) + 7 files changed, 9 insertions(+), 31 deletions(-) -diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c -index 1ef0c92..7cb889c 100644 ---- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c -+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c -@@ -2240,11 +2240,7 @@ static netdev_tx_t atl1c_xmit_frame(struct sk_buff *skb, +Index: linux-stable/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/atheros/atl1c/atl1c_main.c ++++ linux-stable/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +@@ -2122,11 +2122,7 @@ static netdev_tx_t atl1c_xmit_frame(stru } tpd_req = atl1c_cal_tpd_req(skb); @@ -38,11 +38,11 @@ index 1ef0c92..7cb889c 100644 if (atl1c_tpd_avail(adapter, type) < tpd_req) { /* no enough descriptor, just stop queue */ -diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c -index 93ff2b2..cecc414 100644 ---- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c -+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c -@@ -1822,8 +1822,7 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb, +Index: linux-stable/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/atheros/atl1e/atl1e_main.c ++++ linux-stable/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +@@ -1803,8 +1803,7 @@ static netdev_tx_t atl1e_xmit_frame(stru return NETDEV_TX_OK; } tpd_req = atl1e_cal_tdp_req(skb); @@ -52,11 +52,11 @@ index 93ff2b2..cecc414 100644 if (atl1e_tpd_avail(adapter) < tpd_req) { /* no enough descriptor, just stop queue */ -diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c -index 47a8435..279c04e 100644 ---- a/drivers/net/ethernet/chelsio/cxgb/sge.c -+++ b/drivers/net/ethernet/chelsio/cxgb/sge.c -@@ -1678,8 +1678,7 @@ static int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter, +Index: linux-stable/drivers/net/ethernet/chelsio/cxgb/sge.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/chelsio/cxgb/sge.c ++++ linux-stable/drivers/net/ethernet/chelsio/cxgb/sge.c +@@ -1678,8 +1678,7 @@ static int t1_sge_tx(struct sk_buff *skb struct cmdQ *q = &sge->cmdQ[qid]; unsigned int credits, pidx, genbit, count, use_sched_skb = 0; @@ -66,11 +66,11 @@ index 47a8435..279c04e 100644 reclaim_completed_tx(sge, q); -diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c -index 6338ef8..ad2f094 100644 ---- a/drivers/net/ethernet/neterion/s2io.c -+++ b/drivers/net/ethernet/neterion/s2io.c -@@ -4089,12 +4089,7 @@ static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev) +Index: linux-stable/drivers/net/ethernet/neterion/s2io.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/neterion/s2io.c ++++ linux-stable/drivers/net/ethernet/neterion/s2io.c +@@ -4088,12 +4088,7 @@ static netdev_tx_t s2io_xmit(struct sk_b [skb->priority & (MAX_TX_FIFOS - 1)]; fifo = &mac_control->fifos[queue]; @@ -84,29 +84,28 @@ index 6338ef8..ad2f094 100644 if (sp->config.multiq) { if (__netif_subqueue_stopped(dev, fifo->fifo_no)) { -diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c -index 1e38d50..f017954 100644 ---- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c -+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c -@@ -2128,10 +2128,9 @@ static int pch_gbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev) - adapter->stats.tx_length_errors++; - return NETDEV_TX_OK; - } +Index: linux-stable/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ linux-stable/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -2159,10 +2159,8 @@ static int pch_gbe_xmit_frame(struct sk_ + struct pch_gbe_tx_ring *tx_ring = adapter->tx_ring; + unsigned long flags; + - if (!spin_trylock_irqsave(&tx_ring->tx_lock, flags)) { - /* Collision - tell upper layer to requeue */ - return NETDEV_TX_LOCKED; - } -+ + spin_lock_irqsave(&tx_ring->tx_lock, flags); + if (unlikely(!PCH_GBE_DESC_UNUSED(tx_ring))) { netif_stop_queue(netdev); spin_unlock_irqrestore(&tx_ring->tx_lock, flags); -diff --git a/drivers/net/ethernet/tehuti/tehuti.c b/drivers/net/ethernet/tehuti/tehuti.c -index ad973ff..1afa33c 100644 ---- a/drivers/net/ethernet/tehuti/tehuti.c -+++ b/drivers/net/ethernet/tehuti/tehuti.c -@@ -1606,13 +1606,8 @@ static netdev_tx_t bdx_tx_transmit(struct sk_buff *skb, +Index: linux-stable/drivers/net/ethernet/tehuti/tehuti.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/tehuti/tehuti.c ++++ linux-stable/drivers/net/ethernet/tehuti/tehuti.c +@@ -1630,13 +1630,8 @@ static netdev_tx_t bdx_tx_transmit(struc unsigned long flags; ENTER; @@ -122,13 +121,13 @@ index ad973ff..1afa33c 100644 /* build tx descriptor */ BDX_ASSERT(f->m.wptr >= f->m.memsz); /* started with valid wptr */ -diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c -index 91d2588..d4c418e 100644 ---- a/drivers/net/rionet.c -+++ b/drivers/net/rionet.c -@@ -176,11 +176,7 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) - u16 destid; +Index: linux-stable/drivers/net/rionet.c +=================================================================== +--- linux-stable.orig/drivers/net/rionet.c ++++ linux-stable/drivers/net/rionet.c +@@ -178,11 +178,7 @@ static int rionet_start_xmit(struct sk_b unsigned long flags; + int add_num = 1; - local_irq_save(flags); - if (!spin_trylock(&rnet->tx_lock)) { @@ -137,5 +136,5 @@ index 91d2588..d4c418e 100644 - } + spin_lock_irqsave(&rnet->tx_lock, flags); - if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) { - netif_stop_queue(ndev); + if (is_multicast_ether_addr(eth->h_dest)) + add_num = nact; diff --git a/debian/patches/features/all/rt/0085-drivers-net-gianfar-Make-RT-aware.patch b/debian/patches/features/all/rt/drivers-net-gianfar-make-rt-aware.patch similarity index 67% rename from debian/patches/features/all/rt/0085-drivers-net-gianfar-Make-RT-aware.patch rename to debian/patches/features/all/rt/drivers-net-gianfar-make-rt-aware.patch index aaf8e657d..cac7b0b1b 100644 --- a/debian/patches/features/all/rt/0085-drivers-net-gianfar-Make-RT-aware.patch +++ b/debian/patches/features/all/rt/drivers-net-gianfar-make-rt-aware.patch @@ -1,7 +1,6 @@ -From ac9c32dccd74d3c6344a4d857e3b0fa028df7249 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 1 Apr 2010 20:20:57 +0200 -Subject: [085/256] drivers: net: gianfar: Make RT aware +Subject: drivers: net: gianfar: Make RT aware The adjust_link() disables interrupts before taking the queue locks. On RT those locks are converted to "sleeping" locks and @@ -11,15 +10,16 @@ local_irq_save/restore_nort. Reported-by: Xianghua Xiao Signed-off-by: Thomas Gleixner Tested-by: Xianghua Xiao + --- drivers/net/ethernet/freescale/gianfar.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c -index e7bed53..3a42d36 100644 ---- a/drivers/net/ethernet/freescale/gianfar.c -+++ b/drivers/net/ethernet/freescale/gianfar.c -@@ -1643,7 +1643,7 @@ void stop_gfar(struct net_device *dev) +Index: linux-stable/drivers/net/ethernet/freescale/gianfar.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/freescale/gianfar.c ++++ linux-stable/drivers/net/ethernet/freescale/gianfar.c +@@ -1652,7 +1652,7 @@ void stop_gfar(struct net_device *dev) /* Lock it down */ @@ -28,7 +28,7 @@ index e7bed53..3a42d36 100644 lock_tx_qs(priv); lock_rx_qs(priv); -@@ -1651,7 +1651,7 @@ void stop_gfar(struct net_device *dev) +@@ -1660,7 +1660,7 @@ void stop_gfar(struct net_device *dev) unlock_rx_qs(priv); unlock_tx_qs(priv); @@ -37,7 +37,7 @@ index e7bed53..3a42d36 100644 /* Free the IRQs */ if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) { -@@ -2948,7 +2948,7 @@ static void adjust_link(struct net_device *dev) +@@ -2957,7 +2957,7 @@ static void adjust_link(struct net_devic struct phy_device *phydev = priv->phydev; int new_state = 0; @@ -46,7 +46,7 @@ index e7bed53..3a42d36 100644 lock_tx_qs(priv); if (phydev->link) { -@@ -3015,7 +3015,7 @@ static void adjust_link(struct net_device *dev) +@@ -3026,7 +3026,7 @@ static void adjust_link(struct net_devic if (new_state && netif_msg_link(priv)) phy_print_status(phydev); unlock_tx_qs(priv); diff --git a/debian/patches/features/all/rt/0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch b/debian/patches/features/all/rt/drivers-net-tulip-add-missing-pci-disable.patch similarity index 51% rename from debian/patches/features/all/rt/0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch rename to debian/patches/features/all/rt/drivers-net-tulip-add-missing-pci-disable.patch index 3868f9191..b83d282b7 100644 --- a/debian/patches/features/all/rt/0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch +++ b/debian/patches/features/all/rt/drivers-net-tulip-add-missing-pci-disable.patch @@ -1,22 +1,21 @@ -From dd9a1a7b9922f4f3c8fee60720aff0baf8fa150b Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:18 -0500 -Subject: [028/256] drivers/net: tulip_remove_one needs to call - pci_disable_device() +Subject: drivers/net: tulip_remove_one needs to call pci_disable_device() Otherwise the device is not completely shut down. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/net/ethernet/dec/tulip/tulip_core.c | 1 + 1 file changed, 1 insertion(+) -diff --git a/drivers/net/ethernet/dec/tulip/tulip_core.c b/drivers/net/ethernet/dec/tulip/tulip_core.c -index fea3641..d9a5fe0 100644 ---- a/drivers/net/ethernet/dec/tulip/tulip_core.c -+++ b/drivers/net/ethernet/dec/tulip/tulip_core.c -@@ -1946,6 +1946,7 @@ static void __devexit tulip_remove_one (struct pci_dev *pdev) +Index: linux-stable/drivers/net/ethernet/dec/tulip/tulip_core.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/dec/tulip/tulip_core.c ++++ linux-stable/drivers/net/ethernet/dec/tulip/tulip_core.c +@@ -1948,6 +1948,7 @@ static void __devexit tulip_remove_one ( pci_iounmap(pdev, tp->base_addr); free_netdev (dev); pci_release_regions (pdev); diff --git a/debian/patches/features/all/rt/0084-drivers-net-vortex-fix-locking-issues.patch b/debian/patches/features/all/rt/drivers-net-vortex-fix-locking-issues.patch similarity index 72% rename from debian/patches/features/all/rt/0084-drivers-net-vortex-fix-locking-issues.patch rename to debian/patches/features/all/rt/drivers-net-vortex-fix-locking-issues.patch index a0494fccb..6f8b3e472 100644 --- a/debian/patches/features/all/rt/0084-drivers-net-vortex-fix-locking-issues.patch +++ b/debian/patches/features/all/rt/drivers-net-vortex-fix-locking-issues.patch @@ -1,7 +1,6 @@ -From 235883690f6e8ec9f7b95aa9d14e4131ad511090 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Fri, 3 Jul 2009 08:30:00 -0500 -Subject: [084/256] drivers/net: vortex fix locking issues +Subject: drivers/net: vortex fix locking issues Argh, cut and paste wasn't enough... @@ -17,15 +16,12 @@ Signed-off-by: Thomas Gleixner 1 file changed, 4 insertions(+), 4 deletions(-) Signed-off-by: Ingo Molnar ---- - drivers/net/ethernet/3com/3c59x.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c -index e463d10..848aeea 100644 ---- a/drivers/net/ethernet/3com/3c59x.c -+++ b/drivers/net/ethernet/3com/3c59x.c -@@ -843,9 +843,9 @@ static void poll_vortex(struct net_device *dev) +Index: linux-stable/drivers/net/ethernet/3com/3c59x.c +=================================================================== +--- linux-stable.orig/drivers/net/ethernet/3com/3c59x.c ++++ linux-stable/drivers/net/ethernet/3com/3c59x.c +@@ -843,9 +843,9 @@ static void poll_vortex(struct net_devic { struct vortex_private *vp = netdev_priv(dev); unsigned long flags; @@ -37,7 +33,7 @@ index e463d10..848aeea 100644 } #endif -@@ -1920,12 +1920,12 @@ static void vortex_tx_timeout(struct net_device *dev) +@@ -1920,12 +1920,12 @@ static void vortex_tx_timeout(struct net * Block interrupts because vortex_interrupt does a bare spin_lock() */ unsigned long flags; diff --git a/debian/patches/features/all/rt/0025-drivers-random-Reduce-preempt-disabled-region.patch b/debian/patches/features/all/rt/drivers-random-reduce-preempt-disabled-region.patch similarity index 64% rename from debian/patches/features/all/rt/0025-drivers-random-Reduce-preempt-disabled-region.patch rename to debian/patches/features/all/rt/drivers-random-reduce-preempt-disabled-region.patch index 721de5c55..e76754c08 100644 --- a/debian/patches/features/all/rt/0025-drivers-random-Reduce-preempt-disabled-region.patch +++ b/debian/patches/features/all/rt/drivers-random-reduce-preempt-disabled-region.patch @@ -1,21 +1,21 @@ -From f8d2d716a11367c1961fb00e19123380a9d48ee4 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:30 -0500 -Subject: [025/256] drivers: random: Reduce preempt disabled region +Subject: drivers: random: Reduce preempt disabled region No need to keep preemption disabled across the whole function. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/char/random.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) -diff --git a/drivers/char/random.c b/drivers/char/random.c -index 4ec04a7..1e37cf4 100644 ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -633,8 +633,11 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) +Index: linux-stable/drivers/char/random.c +=================================================================== +--- linux-stable.orig/drivers/char/random.c ++++ linux-stable/drivers/char/random.c +@@ -679,9 +679,12 @@ static void add_timer_randomness(struct preempt_disable(); /* if over the trickle threshold, use only 1 in 4096 samples */ if (input_pool.entropy_count > trickle_thresh && @@ -25,11 +25,12 @@ index 4ec04a7..1e37cf4 100644 + preempt_enable(); + return; + } + + preempt_enable(); - sample.jiffies = jiffies; - -@@ -680,8 +683,6 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) + sample.cycles = get_cycles(); + sample.num = num; +@@ -722,8 +725,6 @@ static void add_timer_randomness(struct credit_entropy_bits(&input_pool, min_t(int, fls(delta>>1), 11)); } diff --git a/debian/patches/features/all/rt/0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch b/debian/patches/features/all/rt/drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch similarity index 57% rename from debian/patches/features/all/rt/0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch rename to debian/patches/features/all/rt/drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch index 393185f81..a6ddc990a 100644 --- a/debian/patches/features/all/rt/0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch +++ b/debian/patches/features/all/rt/drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch @@ -1,19 +1,19 @@ -From e447d6e43e11faf76069bfabd1d43c1a55bc57aa Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:01 -0500 -Subject: [193/256] serial: 8250: Call flush_to_ldisc when the irq is threaded +Subject: serial: 8250: Call flush_to_ldisc when the irq is threaded Signed-off-by: Ingo Molnar + --- drivers/tty/serial/8250/8250.c | 2 ++ drivers/tty/tty_buffer.c | 4 ++++ 2 files changed, 6 insertions(+) -diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c -index 6ede5a7..ff93c70 100644 ---- a/drivers/tty/serial/8250/8250.c -+++ b/drivers/tty/serial/8250/8250.c -@@ -1584,12 +1584,14 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id) +Index: linux-stable/drivers/tty/serial/8250/8250.c +=================================================================== +--- linux-stable.orig/drivers/tty/serial/8250/8250.c ++++ linux-stable/drivers/tty/serial/8250/8250.c +@@ -1549,12 +1549,14 @@ static irqreturn_t serial8250_interrupt( l = l->next; @@ -28,11 +28,11 @@ index 6ede5a7..ff93c70 100644 } while (l != end); spin_unlock(&i->lock); -diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c -index 6c9b7cd..a56c223 100644 ---- a/drivers/tty/tty_buffer.c -+++ b/drivers/tty/tty_buffer.c -@@ -493,10 +493,14 @@ void tty_flip_buffer_push(struct tty_struct *tty) +Index: linux-stable/drivers/tty/tty_buffer.c +=================================================================== +--- linux-stable.orig/drivers/tty/tty_buffer.c ++++ linux-stable/drivers/tty/tty_buffer.c +@@ -538,10 +538,14 @@ void tty_flip_buffer_push(struct tty_str tty->buf.tail->commit = tty->buf.tail->used; spin_unlock_irqrestore(&tty->buf.lock, flags); diff --git a/debian/patches/features/all/rt/0192-serial-8250-Clean-up-the-locking-for-rt.patch b/debian/patches/features/all/rt/drivers-serial-cleanup-locking-for-rt.patch similarity index 65% rename from debian/patches/features/all/rt/0192-serial-8250-Clean-up-the-locking-for-rt.patch rename to debian/patches/features/all/rt/drivers-serial-cleanup-locking-for-rt.patch index f186ce485..3a6363324 100644 --- a/debian/patches/features/all/rt/0192-serial-8250-Clean-up-the-locking-for-rt.patch +++ b/debian/patches/features/all/rt/drivers-serial-cleanup-locking-for-rt.patch @@ -1,19 +1,19 @@ -From 6503c468cedb29732e4dd282219e3d311837e031 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:01 -0500 -Subject: [192/256] serial: 8250: Clean up the locking for -rt +Subject: serial: 8250: Clean up the locking for -rt Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/tty/serial/8250/8250.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) -diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c -index d537431..6ede5a7 100644 ---- a/drivers/tty/serial/8250/8250.c -+++ b/drivers/tty/serial/8250/8250.c -@@ -2808,14 +2808,10 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count) +Index: linux-stable/drivers/tty/serial/8250/8250.c +=================================================================== +--- linux-stable.orig/drivers/tty/serial/8250/8250.c ++++ linux-stable/drivers/tty/serial/8250/8250.c +@@ -2773,14 +2773,10 @@ serial8250_console_write(struct console touch_nmi_watchdog(); @@ -32,7 +32,7 @@ index d537431..6ede5a7 100644 /* * First save the IER then disable the interrupts -@@ -2847,8 +2843,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count) +@@ -2812,8 +2808,7 @@ serial8250_console_write(struct console serial8250_modem_status(up); if (locked) diff --git a/debian/patches/features/all/rt/0194-drivers-tty-fix-omap-lock-crap.patch.patch b/debian/patches/features/all/rt/drivers-tty-fix-omap-lock-crap.patch similarity index 64% rename from debian/patches/features/all/rt/0194-drivers-tty-fix-omap-lock-crap.patch.patch rename to debian/patches/features/all/rt/drivers-tty-fix-omap-lock-crap.patch index cc7276e96..382de0a9d 100644 --- a/debian/patches/features/all/rt/0194-drivers-tty-fix-omap-lock-crap.patch.patch +++ b/debian/patches/features/all/rt/drivers-tty-fix-omap-lock-crap.patch @@ -1,18 +1,17 @@ -From 3cbc89cb4588fb756ae01316e2652119eb6dd5fc Mon Sep 17 00:00:00 2001 +Subject: drivers-tty-fix-omap-lock-crap.patch From: Thomas Gleixner Date: Thu, 28 Jul 2011 13:32:57 +0200 -Subject: [194/256] drivers-tty-fix-omap-lock-crap.patch Signed-off-by: Thomas Gleixner --- drivers/tty/serial/omap-serial.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) -diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c -index d00b38e..f697492 100644 ---- a/drivers/tty/serial/omap-serial.c -+++ b/drivers/tty/serial/omap-serial.c -@@ -1064,13 +1064,10 @@ serial_omap_console_write(struct console *co, const char *s, +Index: linux-stable/drivers/tty/serial/omap-serial.c +=================================================================== +--- linux-stable.orig/drivers/tty/serial/omap-serial.c ++++ linux-stable/drivers/tty/serial/omap-serial.c +@@ -1082,13 +1082,10 @@ serial_omap_console_write(struct console pm_runtime_get_sync(&up->pdev->dev); @@ -29,7 +28,7 @@ index d00b38e..f697492 100644 /* * First save the IER then disable the interrupts -@@ -1099,8 +1096,7 @@ serial_omap_console_write(struct console *co, const char *s, +@@ -1117,8 +1114,7 @@ serial_omap_console_write(struct console pm_runtime_mark_last_busy(&up->pdev->dev); pm_runtime_put_autosuspend(&up->pdev->dev); if (locked) diff --git a/debian/patches/features/all/rt/0057-early-printk-consolidate.patch.patch b/debian/patches/features/all/rt/early-printk-consolidate.patch similarity index 65% rename from debian/patches/features/all/rt/0057-early-printk-consolidate.patch.patch rename to debian/patches/features/all/rt/early-printk-consolidate.patch index 289318a4f..54015e02a 100644 --- a/debian/patches/features/all/rt/0057-early-printk-consolidate.patch.patch +++ b/debian/patches/features/all/rt/early-printk-consolidate.patch @@ -1,32 +1,31 @@ -From 5f55e0bba8030011d082892e2c5c789795450715 Mon Sep 17 00:00:00 2001 +Subject: early-printk-consolidate.patch From: Thomas Gleixner Date: Sat, 23 Jul 2011 11:04:08 +0200 -Subject: [057/256] early-printk-consolidate.patch Signed-off-by: Thomas Gleixner --- arch/arm/kernel/early_printk.c | 17 +++-------------- arch/blackfin/kernel/early_printk.c | 2 -- arch/microblaze/kernel/early_printk.c | 26 ++++---------------------- - arch/mips/kernel/early_printk.c | 10 ++++------ + arch/mips/kernel/early_printk.c | 11 +++++------ arch/powerpc/kernel/udbg.c | 6 ++---- arch/sh/kernel/sh_bios.c | 2 -- arch/sparc/kernel/setup_32.c | 1 + arch/sparc/kernel/setup_64.c | 8 +++++++- - arch/tile/kernel/early_printk.c | 26 ++++---------------------- + arch/tile/kernel/early_printk.c | 27 +++++---------------------- arch/um/kernel/early_printk.c | 8 +++++--- arch/unicore32/kernel/early_printk.c | 12 ++++-------- arch/x86/kernel/early_printk.c | 21 ++------------------- include/linux/console.h | 1 + - include/linux/printk.h | 5 +++++ + include/linux/printk.h | 6 ++++++ kernel/printk.c | 30 +++++++++++++++++++++++------- - 15 files changed, 65 insertions(+), 110 deletions(-) + 15 files changed, 68 insertions(+), 110 deletions(-) -diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c -index 85aa2b2..4307653 100644 ---- a/arch/arm/kernel/early_printk.c -+++ b/arch/arm/kernel/early_printk.c -@@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n) +Index: linux-stable/arch/arm/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/arm/kernel/early_printk.c ++++ linux-stable/arch/arm/kernel/early_printk.c +@@ -29,28 +29,17 @@ static void early_console_write(struct c early_write(s, n); } @@ -58,11 +57,11 @@ index 85aa2b2..4307653 100644 return 0; } -diff --git a/arch/blackfin/kernel/early_printk.c b/arch/blackfin/kernel/early_printk.c -index 84ed837..61fbd2d 100644 ---- a/arch/blackfin/kernel/early_printk.c -+++ b/arch/blackfin/kernel/early_printk.c -@@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_init(unsigned int port, +Index: linux-stable/arch/blackfin/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/blackfin/kernel/early_printk.c ++++ linux-stable/arch/blackfin/kernel/early_printk.c +@@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_ extern struct console *bfin_jc_early_init(void); #endif @@ -71,10 +70,10 @@ index 84ed837..61fbd2d 100644 /* Default console */ #define DEFAULT_PORT 0 #define DEFAULT_CFLAG CS8|B57600 -diff --git a/arch/microblaze/kernel/early_printk.c b/arch/microblaze/kernel/early_printk.c -index aba1f9a..b099a86 100644 ---- a/arch/microblaze/kernel/early_printk.c -+++ b/arch/microblaze/kernel/early_printk.c +Index: linux-stable/arch/microblaze/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/microblaze/kernel/early_printk.c ++++ linux-stable/arch/microblaze/kernel/early_printk.c @@ -21,7 +21,6 @@ #include #include @@ -83,7 +82,7 @@ index aba1f9a..b099a86 100644 static u32 base_addr; #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE -@@ -109,27 +108,11 @@ static struct console early_serial_uart16550_console = { +@@ -109,27 +108,11 @@ static struct console early_serial_uart1 }; #endif /* CONFIG_SERIAL_8250_CONSOLE */ @@ -141,11 +140,19 @@ index aba1f9a..b099a86 100644 - early_console_initialized = 0; + early_console = NULL; } -diff --git a/arch/mips/kernel/early_printk.c b/arch/mips/kernel/early_printk.c -index 9ae813e..973c995 100644 ---- a/arch/mips/kernel/early_printk.c -+++ b/arch/mips/kernel/early_printk.c -@@ -25,20 +25,18 @@ early_console_write(struct console *con, const char *s, unsigned n) +Index: linux-stable/arch/mips/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/mips/kernel/early_printk.c ++++ linux-stable/arch/mips/kernel/early_printk.c +@@ -8,6 +8,7 @@ + * written by Ralf Baechle (ralf@linux-mips.org) + */ + #include ++#include + #include + + #include +@@ -25,20 +26,18 @@ early_console_write(struct console *con, } } @@ -170,10 +177,10 @@ index 9ae813e..973c995 100644 - register_console(&early_console); + register_console(&early_console_prom); } -diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c -index c39c1ca..8b00aab 100644 ---- a/arch/powerpc/kernel/udbg.c -+++ b/arch/powerpc/kernel/udbg.c +Index: linux-stable/arch/powerpc/kernel/udbg.c +=================================================================== +--- linux-stable.orig/arch/powerpc/kernel/udbg.c ++++ linux-stable/arch/powerpc/kernel/udbg.c @@ -179,15 +179,13 @@ static struct console udbg_console = { .index = 0, }; @@ -191,7 +198,7 @@ index c39c1ca..8b00aab 100644 return; if (!udbg_putc) -@@ -197,7 +195,7 @@ void __init register_early_udbg_console(void) +@@ -197,7 +195,7 @@ void __init register_early_udbg_console( printk(KERN_INFO "early console immortal !\n"); udbg_console.flags &= ~CON_BOOT; } @@ -200,10 +207,10 @@ index c39c1ca..8b00aab 100644 register_console(&udbg_console); } -diff --git a/arch/sh/kernel/sh_bios.c b/arch/sh/kernel/sh_bios.c -index 47475cc..a5b51b9 100644 ---- a/arch/sh/kernel/sh_bios.c -+++ b/arch/sh/kernel/sh_bios.c +Index: linux-stable/arch/sh/kernel/sh_bios.c +=================================================================== +--- linux-stable.orig/arch/sh/kernel/sh_bios.c ++++ linux-stable/arch/sh/kernel/sh_bios.c @@ -144,8 +144,6 @@ static struct console bios_console = { .index = -1, }; @@ -213,23 +220,23 @@ index 47475cc..a5b51b9 100644 static int __init setup_early_printk(char *buf) { int keep_early = 0; -diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c -index d444468..a000aa5 100644 ---- a/arch/sparc/kernel/setup_32.c -+++ b/arch/sparc/kernel/setup_32.c -@@ -221,6 +221,7 @@ void __init setup_arch(char **cmdline_p) +Index: linux-stable/arch/sparc/kernel/setup_32.c +=================================================================== +--- linux-stable.orig/arch/sparc/kernel/setup_32.c ++++ linux-stable/arch/sparc/kernel/setup_32.c +@@ -309,6 +309,7 @@ void __init setup_arch(char **cmdline_p) boot_flags_init(*cmdline_p); + early_console = &prom_early_console; register_console(&prom_early_console); - /* Set sparc_cpu_model */ -diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c -index 1414d16..8b37e5a 100644 ---- a/arch/sparc/kernel/setup_64.c -+++ b/arch/sparc/kernel/setup_64.c -@@ -487,6 +487,12 @@ static void __init init_sparc64_elf_hwcap(void) + printk("ARCH: "); +Index: linux-stable/arch/sparc/kernel/setup_64.c +=================================================================== +--- linux-stable.orig/arch/sparc/kernel/setup_64.c ++++ linux-stable/arch/sparc/kernel/setup_64.c +@@ -487,6 +487,12 @@ static void __init init_sparc64_elf_hwca popc_patch(); } @@ -251,11 +258,19 @@ index 1414d16..8b37e5a 100644 if (tlb_type == hypervisor) printk("ARCH: SUN4V\n"); -diff --git a/arch/tile/kernel/early_printk.c b/arch/tile/kernel/early_printk.c -index afb9c9a..ff25220 100644 ---- a/arch/tile/kernel/early_printk.c -+++ b/arch/tile/kernel/early_printk.c -@@ -33,25 +33,8 @@ static struct console early_hv_console = { +Index: linux-stable/arch/tile/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/tile/kernel/early_printk.c ++++ linux-stable/arch/tile/kernel/early_printk.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -33,25 +34,8 @@ static struct console early_hv_console = }; /* Direct interface for emergencies */ @@ -281,7 +296,7 @@ index afb9c9a..ff25220 100644 void early_panic(const char *fmt, ...) { va_list ap; -@@ -69,14 +52,13 @@ static int __initdata keep_early; +@@ -69,14 +53,13 @@ static int __initdata keep_early; static int __init setup_early_printk(char *str) { @@ -297,7 +312,7 @@ index afb9c9a..ff25220 100644 register_console(early_console); return 0; -@@ -85,12 +67,12 @@ static int __init setup_early_printk(char *str) +@@ -85,12 +68,12 @@ static int __init setup_early_printk(cha void __init disable_early_printk(void) { early_console_complete = 1; @@ -312,7 +327,7 @@ index afb9c9a..ff25220 100644 } else { early_printk("keeping early console\n"); } -@@ -98,7 +80,7 @@ void __init disable_early_printk(void) +@@ -98,7 +81,7 @@ void __init disable_early_printk(void) void warn_early_printk(void) { @@ -321,11 +336,11 @@ index afb9c9a..ff25220 100644 return; early_printk("\ Machine shutting down before console output is fully initialized.\n\ -diff --git a/arch/um/kernel/early_printk.c b/arch/um/kernel/early_printk.c -index ec649bf..183060f 100644 ---- a/arch/um/kernel/early_printk.c -+++ b/arch/um/kernel/early_printk.c -@@ -16,7 +16,7 @@ static void early_console_write(struct console *con, const char *s, unsigned int +Index: linux-stable/arch/um/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/um/kernel/early_printk.c ++++ linux-stable/arch/um/kernel/early_printk.c +@@ -16,7 +16,7 @@ static void early_console_write(struct c um_early_printk(s, n); } @@ -347,11 +362,11 @@ index ec649bf..183060f 100644 return 0; } -diff --git a/arch/unicore32/kernel/early_printk.c b/arch/unicore32/kernel/early_printk.c -index 3922255..9be0d5d 100644 ---- a/arch/unicore32/kernel/early_printk.c -+++ b/arch/unicore32/kernel/early_printk.c -@@ -33,21 +33,17 @@ static struct console early_ocd_console = { +Index: linux-stable/arch/unicore32/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/unicore32/kernel/early_printk.c ++++ linux-stable/arch/unicore32/kernel/early_printk.c +@@ -33,21 +33,17 @@ static struct console early_ocd_console .index = -1, }; @@ -377,11 +392,11 @@ index 3922255..9be0d5d 100644 if (keep_early) early_console->flags &= ~CON_BOOT; -diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c -index 9b9f18b..d15f575 100644 ---- a/arch/x86/kernel/early_printk.c -+++ b/arch/x86/kernel/early_printk.c -@@ -169,25 +169,9 @@ static struct console early_serial_console = { +Index: linux-stable/arch/x86/kernel/early_printk.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/early_printk.c ++++ linux-stable/arch/x86/kernel/early_printk.c +@@ -169,25 +169,9 @@ static struct console early_serial_conso .index = -1, }; @@ -408,7 +423,7 @@ index 9b9f18b..d15f575 100644 printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n", con->name); return; -@@ -207,9 +191,8 @@ static int __init setup_early_printk(char *buf) +@@ -207,9 +191,8 @@ static int __init setup_early_printk(cha if (!buf) return 0; @@ -419,10 +434,10 @@ index 9b9f18b..d15f575 100644 keep = (strstr(buf, "keep") != NULL); -diff --git a/include/linux/console.h b/include/linux/console.h -index 7201ce4..dec7f97 100644 ---- a/include/linux/console.h -+++ b/include/linux/console.h +Index: linux-stable/include/linux/console.h +=================================================================== +--- linux-stable.orig/include/linux/console.h ++++ linux-stable/include/linux/console.h @@ -133,6 +133,7 @@ struct console { for (con = console_drivers; con != NULL; con = con->next) @@ -431,17 +446,18 @@ index 7201ce4..dec7f97 100644 extern int add_preferred_console(char *name, int idx, char *options); extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options); -diff --git a/include/linux/printk.h b/include/linux/printk.h -index 0525927..c8d7f7b 100644 ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -88,8 +88,13 @@ int no_printk(const char *fmt, ...) +Index: linux-stable/include/linux/printk.h +=================================================================== +--- linux-stable.orig/include/linux/printk.h ++++ linux-stable/include/linux/printk.h +@@ -95,8 +95,14 @@ int no_printk(const char *fmt, ...) return 0; } +#ifdef CONFIG_EARLY_PRINTK extern asmlinkage __printf(1, 2) void early_printk(const char *fmt, ...); ++void early_vprintk(const char *fmt, va_list ap); +#else +static inline __printf(1, 2) __cold +void early_printk(const char *s, ...) { } @@ -449,11 +465,11 @@ index 0525927..c8d7f7b 100644 extern int printk_needs_cpu(int cpu); extern void printk_tick(void); -diff --git a/kernel/printk.c b/kernel/printk.c -index b663c2c..c442606 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -47,13 +47,6 @@ +Index: linux-stable/kernel/printk.c +=================================================================== +--- linux-stable.orig/kernel/printk.c ++++ linux-stable/kernel/printk.c +@@ -48,13 +48,6 @@ #define CREATE_TRACE_POINTS #include @@ -464,17 +480,17 @@ index b663c2c..c442606 100644 -{ -} - - #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) - /* printk's without a loglevel use this.. */ -@@ -524,6 +517,29 @@ static void __call_console_drivers(unsigned start, unsigned end) - } + #define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL + +@@ -1232,6 +1225,29 @@ SYSCALL_DEFINE3(syslog, int, type, char + return do_syslog(type, buf, len, SYSLOG_FROM_CALL); } +#ifdef CONFIG_EARLY_PRINTK +struct console *early_console; + -+static void early_vprintk(const char *fmt, va_list ap) ++void early_vprintk(const char *fmt, va_list ap) +{ + if (early_console) { + char buf[512]; diff --git a/debian/patches/features/all/rt/0206-epoll.patch.patch b/debian/patches/features/all/rt/epoll-use-get-cpu-light.patch similarity index 59% rename from debian/patches/features/all/rt/0206-epoll.patch.patch rename to debian/patches/features/all/rt/epoll-use-get-cpu-light.patch index fed79a261..269a907d3 100644 --- a/debian/patches/features/all/rt/0206-epoll.patch.patch +++ b/debian/patches/features/all/rt/epoll-use-get-cpu-light.patch @@ -1,18 +1,17 @@ -From e00039cd78706b8e320bb3009c12991e4ec6e303 Mon Sep 17 00:00:00 2001 +Subject: epoll.patch From: Thomas Gleixner -Date: Fri, 8 Jul 2011 16:35:35 +0200 -Subject: [206/256] epoll.patch +Date: Fri, 08 Jul 2011 16:35:35 +0200 Signed-off-by: Thomas Gleixner --- fs/eventpoll.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/fs/eventpoll.c b/fs/eventpoll.c -index c0b3c70..39a2364 100644 ---- a/fs/eventpoll.c -+++ b/fs/eventpoll.c -@@ -488,12 +488,12 @@ static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) +Index: linux-stable/fs/eventpoll.c +=================================================================== +--- linux-stable.orig/fs/eventpoll.c ++++ linux-stable/fs/eventpoll.c +@@ -495,12 +495,12 @@ static int ep_poll_wakeup_proc(void *pri */ static void ep_poll_safewake(wait_queue_head_t *wq) { diff --git a/debian/patches/features/all/rt/0036-filemap-fix-up.patch.patch b/debian/patches/features/all/rt/filemap-fix-up.patch similarity index 62% rename from debian/patches/features/all/rt/0036-filemap-fix-up.patch.patch rename to debian/patches/features/all/rt/filemap-fix-up.patch index 5a25d4f73..0f6897c7b 100644 --- a/debian/patches/features/all/rt/0036-filemap-fix-up.patch.patch +++ b/debian/patches/features/all/rt/filemap-fix-up.patch @@ -1,7 +1,6 @@ -From aa2098c961cc12184d7df1e87ff12c6020d5f785 Mon Sep 17 00:00:00 2001 +Subject: filemap-fix-up.patch From: Thomas Gleixner Date: Fri, 17 Jun 2011 18:56:24 +0200 -Subject: [036/256] filemap-fix-up.patch Signed-off-by: Thomas Gleixner Wrecked-off-by: Peter Zijlstra @@ -10,11 +9,11 @@ Link: http://lkml.kernel.org/n/tip-m6yuzd6ul717hlnl2gj6p3ou@git.kernel.org mm/filemap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/mm/filemap.c b/mm/filemap.c -index 79c4b2b..51c34c0 100644 ---- a/mm/filemap.c -+++ b/mm/filemap.c -@@ -2036,7 +2036,7 @@ size_t iov_iter_copy_from_user_atomic(struct page *page, +Index: linux-stable/mm/filemap.c +=================================================================== +--- linux-stable.orig/mm/filemap.c ++++ linux-stable/mm/filemap.c +@@ -1955,7 +1955,7 @@ size_t iov_iter_copy_from_user_atomic(st char *kaddr; size_t copied; diff --git a/debian/patches/features/all/rt/0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch b/debian/patches/features/all/rt/fix-rt-int3-x86_32-3.2-rt.patch similarity index 78% rename from debian/patches/features/all/rt/0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch rename to debian/patches/features/all/rt/fix-rt-int3-x86_32-3.2-rt.patch index d25effed6..c1ecdf8b2 100644 --- a/debian/patches/features/all/rt/0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch +++ b/debian/patches/features/all/rt/fix-rt-int3-x86_32-3.2-rt.patch @@ -1,7 +1,5 @@ -From 66eecab296c168e350a2f94e157a443b6243e63e Mon Sep 17 00:00:00 2001 From: Steven Rostedt -Date: Thu, 7 Jun 2012 07:46:49 -0400 -Subject: [051/256] x86: Do not disable preemption in int3 on 32bit +Subject: x86: Do not disable preemption in int3 on 32bit Preemption must be disabled before enabling interrupts in do_trap on x86_64 because the stack in use for int3 and debug is a per CPU @@ -19,15 +17,16 @@ when the stack is on the IST. Cc: stable-rt@vger.kernel.org Signed-off-by: Steven Rostedt Signed-off-by: Thomas Gleixner + --- arch/x86/kernel/traps.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) -diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c -index ff9281f1..0b01977 100644 ---- a/arch/x86/kernel/traps.c -+++ b/arch/x86/kernel/traps.c -@@ -87,9 +87,21 @@ static inline void conditional_sti(struct pt_regs *regs) +Index: linux-stable/arch/x86/kernel/traps.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/traps.c ++++ linux-stable/arch/x86/kernel/traps.c +@@ -87,9 +87,21 @@ static inline void conditional_sti(struc local_irq_enable(); } @@ -50,7 +49,7 @@ index ff9281f1..0b01977 100644 if (regs->flags & X86_EFLAGS_IF) local_irq_enable(); } -@@ -100,11 +112,13 @@ static inline void conditional_cli(struct pt_regs *regs) +@@ -100,11 +112,13 @@ static inline void conditional_cli(struc local_irq_disable(); } @@ -65,7 +64,7 @@ index ff9281f1..0b01977 100644 } static void __kprobes -@@ -226,9 +240,9 @@ dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code) +@@ -225,9 +239,9 @@ dotraplinkage void do_stack_segment(stru if (notify_die(DIE_TRAP, "stack segment", regs, error_code, X86_TRAP_SS, SIGBUS) == NOTIFY_STOP) return; @@ -77,7 +76,7 @@ index ff9281f1..0b01977 100644 } dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) -@@ -320,9 +334,9 @@ dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code) +@@ -327,9 +341,9 @@ dotraplinkage void __kprobes notrace do_ * as we may switch to the interrupt stack. */ debug_stack_usage_inc(); @@ -89,7 +88,7 @@ index ff9281f1..0b01977 100644 debug_stack_usage_dec(); } -@@ -423,12 +437,12 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) +@@ -430,12 +444,12 @@ dotraplinkage void __kprobes do_debug(st debug_stack_usage_inc(); /* It's safe to allow irq's after DR6 has been saved */ @@ -104,7 +103,7 @@ index ff9281f1..0b01977 100644 debug_stack_usage_dec(); return; } -@@ -448,7 +462,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) +@@ -455,7 +469,7 @@ dotraplinkage void __kprobes do_debug(st si_code = get_si_code(tsk->thread.debugreg6); if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) send_sigtrap(tsk, regs, error_code, si_code); diff --git a/debian/patches/features/all/rt/0199-fs-block-rt-support.patch.patch b/debian/patches/features/all/rt/fs-block-rt-support.patch similarity index 63% rename from debian/patches/features/all/rt/0199-fs-block-rt-support.patch.patch rename to debian/patches/features/all/rt/fs-block-rt-support.patch index 2ea7140b5..a047eb43f 100644 --- a/debian/patches/features/all/rt/0199-fs-block-rt-support.patch.patch +++ b/debian/patches/features/all/rt/fs-block-rt-support.patch @@ -1,7 +1,6 @@ -From 144c78a3b223b226689db343fedd8d47fbd7dc2d Mon Sep 17 00:00:00 2001 +Subject: fs-block-rt-support.patch From: Thomas Gleixner Date: Tue, 14 Jun 2011 17:05:09 +0200 -Subject: [199/256] fs-block-rt-support.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner fs/file.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) -diff --git a/block/blk-core.c b/block/blk-core.c -index 0d947d0..f068328 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -237,7 +237,7 @@ EXPORT_SYMBOL(blk_delay_queue); +Index: linux-stable/block/blk-core.c +=================================================================== +--- linux-stable.orig/block/blk-core.c ++++ linux-stable/block/blk-core.c +@@ -239,7 +239,7 @@ EXPORT_SYMBOL(blk_delay_queue); **/ void blk_start_queue(struct request_queue *q) { @@ -22,11 +21,11 @@ index 0d947d0..f068328 100644 queue_flag_clear(QUEUE_FLAG_STOPPED, q); __blk_run_queue(q); -diff --git a/fs/file.c b/fs/file.c -index 6f176f5..9f5343d 100644 ---- a/fs/file.c -+++ b/fs/file.c -@@ -105,14 +105,14 @@ void free_fdtable_rcu(struct rcu_head *rcu) +Index: linux-stable/fs/file.c +=================================================================== +--- linux-stable.orig/fs/file.c ++++ linux-stable/fs/file.c +@@ -105,14 +105,14 @@ void free_fdtable_rcu(struct rcu_head *r kfree(fdt->open_fds); kfree(fdt); } else { diff --git a/debian/patches/features/all/rt/0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch b/debian/patches/features/all/rt/fs-dcache-use-cpu-chill-in-trylock-loops.patch similarity index 65% rename from debian/patches/features/all/rt/0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch rename to debian/patches/features/all/rt/fs-dcache-use-cpu-chill-in-trylock-loops.patch index ea2190c1e..2665a2446 100644 --- a/debian/patches/features/all/rt/0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch +++ b/debian/patches/features/all/rt/fs-dcache-use-cpu-chill-in-trylock-loops.patch @@ -1,7 +1,6 @@ -From ba7ac3a9415b0c09e16f37e5c56fc5cf64aaf71f Mon Sep 17 00:00:00 2001 +Subject: fs: dcache: Use cpu_chill() in trylock loops From: Thomas Gleixner -Date: Wed, 7 Mar 2012 21:00:34 +0100 -Subject: [245/256] fs: dcache: Use cpu_chill() in trylock loops +Date: Wed, 07 Mar 2012 21:00:34 +0100 Retry loops on RT might loop forever when the modifying side was preempted. Use cpu_chill() instead of cpu_relax() to let the system @@ -16,10 +15,10 @@ Cc: stable-rt@vger.kernel.org fs/namespace.c | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) -diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h -index 908e184..bdd1788 100644 ---- a/fs/autofs4/autofs_i.h -+++ b/fs/autofs4/autofs_i.h +Index: linux-stable/fs/autofs4/autofs_i.h +=================================================================== +--- linux-stable.orig/fs/autofs4/autofs_i.h ++++ linux-stable/fs/autofs4/autofs_i.h @@ -34,6 +34,7 @@ #include #include @@ -28,11 +27,11 @@ index 908e184..bdd1788 100644 #include #include -diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c -index 1feb68e..859badd 100644 ---- a/fs/autofs4/expire.c -+++ b/fs/autofs4/expire.c -@@ -171,7 +171,7 @@ again: +Index: linux-stable/fs/autofs4/expire.c +=================================================================== +--- linux-stable.orig/fs/autofs4/expire.c ++++ linux-stable/fs/autofs4/expire.c +@@ -166,7 +166,7 @@ again: parent = p->d_parent; if (!spin_trylock(&parent->d_lock)) { spin_unlock(&p->d_lock); @@ -41,10 +40,10 @@ index 1feb68e..859badd 100644 goto relock; } spin_unlock(&p->d_lock); -diff --git a/fs/dcache.c b/fs/dcache.c -index b80531c..0801198 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c +Index: linux-stable/fs/dcache.c +=================================================================== +--- linux-stable.orig/fs/dcache.c ++++ linux-stable/fs/dcache.c @@ -37,6 +37,7 @@ #include #include @@ -53,7 +52,7 @@ index b80531c..0801198 100644 #include "internal.h" #include "mount.h" -@@ -472,7 +473,7 @@ static inline struct dentry *dentry_kill(struct dentry *dentry, int ref) +@@ -488,7 +489,7 @@ static inline struct dentry *dentry_kill if (inode && !spin_trylock(&inode->i_lock)) { relock: spin_unlock(&dentry->d_lock); @@ -62,7 +61,7 @@ index b80531c..0801198 100644 return dentry; /* try again with same dentry */ } if (IS_ROOT(dentry)) -@@ -858,7 +859,7 @@ relock: +@@ -876,7 +877,7 @@ relock: if (!spin_trylock(&dentry->d_lock)) { spin_unlock(&dcache_lru_lock); @@ -71,7 +70,7 @@ index b80531c..0801198 100644 goto relock; } -@@ -2040,7 +2041,7 @@ again: +@@ -2115,7 +2116,7 @@ again: if (dentry->d_count == 1) { if (inode && !spin_trylock(&inode->i_lock)) { spin_unlock(&dentry->d_lock); @@ -80,10 +79,10 @@ index b80531c..0801198 100644 goto again; } dentry->d_flags &= ~DCACHE_CANT_MOUNT; -diff --git a/fs/namespace.c b/fs/namespace.c -index 6dc617c..02f02ea 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c +Index: linux-stable/fs/namespace.c +=================================================================== +--- linux-stable.orig/fs/namespace.c ++++ linux-stable/fs/namespace.c @@ -20,6 +20,7 @@ #include /* get_fs_root et.al. */ #include /* fsnotify_vfsmount_delete */ @@ -92,7 +91,7 @@ index 6dc617c..02f02ea 100644 #include "pnode.h" #include "internal.h" -@@ -315,7 +316,7 @@ int mnt_want_write(struct vfsmount *m) +@@ -313,7 +314,7 @@ int __mnt_want_write(struct vfsmount *m) smp_mb(); while (mnt->mnt.mnt_flags & MNT_WRITE_HOLD) { preempt_enable(); diff --git a/debian/patches/features/all/rt/fs-jbd-pull-plug-when-waiting-for-space.patch b/debian/patches/features/all/rt/fs-jbd-pull-plug-when-waiting-for-space.patch new file mode 100644 index 000000000..cbd3076e0 --- /dev/null +++ b/debian/patches/features/all/rt/fs-jbd-pull-plug-when-waiting-for-space.patch @@ -0,0 +1,31 @@ +From: Mike Galbraith +Date: Wed, 11 Jul 2012 22:05:20 +0000 +Subject: fs, jbd: pull your plug when waiting for space + +With an -rt kernel, and a heavy sync IO load, tasks can jam +up on journal locks without unplugging, which can lead to +terminal IO starvation. Unplug and schedule when waiting for space. + +Signed-off-by: Mike Galbraith +Cc: Steven Rostedt +Cc: Theodore Tso +Link: http://lkml.kernel.org/r/1341812414.7370.73.camel@marge.simpson.net +Signed-off-by: Thomas Gleixner + +--- + fs/jbd/checkpoint.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: linux-stable/fs/jbd/checkpoint.c +=================================================================== +--- linux-stable.orig/fs/jbd/checkpoint.c ++++ linux-stable/fs/jbd/checkpoint.c +@@ -129,6 +129,8 @@ void __log_wait_for_space(journal_t *jou + if (journal->j_flags & JFS_ABORT) + return; + spin_unlock(&journal->j_state_lock); ++ if (current->plug) ++ io_schedule(); + mutex_lock(&journal->j_checkpoint_mutex); + + /* diff --git a/debian/patches/features/all/rt/0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch b/debian/patches/features/all/rt/fs-jbd-replace-bh_state-lock.patch similarity index 73% rename from debian/patches/features/all/rt/0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch rename to debian/patches/features/all/rt/fs-jbd-replace-bh_state-lock.patch index 53fd43071..a981eefc2 100644 --- a/debian/patches/features/all/rt/0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch +++ b/debian/patches/features/all/rt/fs-jbd-replace-bh_state-lock.patch @@ -1,8 +1,6 @@ -From 2e64cea6269df0581e5f38a53232c0d1b495b6b8 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 18 Mar 2011 10:11:25 +0100 -Subject: [078/256] fs: jbd/jbd2: Make state lock and journal head lock rt - safe +Subject: fs: jbd/jbd2: Make state lock and journal head lock rt safe bit_spin_locks break under RT. @@ -14,15 +12,11 @@ Signed-off-by: Thomas Gleixner include/linux/buffer_head.h | 10 ++++++++++ include/linux/jbd_common.h | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) ---- - include/linux/buffer_head.h | 10 ++++++++++ - include/linux/jbd_common.h | 24 ++++++++++++++++++++++++ - 2 files changed, 34 insertions(+) -diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h -index 5c16cf1..3f8e27b 100644 ---- a/include/linux/buffer_head.h -+++ b/include/linux/buffer_head.h +Index: linux-stable/include/linux/buffer_head.h +=================================================================== +--- linux-stable.orig/include/linux/buffer_head.h ++++ linux-stable/include/linux/buffer_head.h @@ -74,6 +74,11 @@ struct buffer_head { atomic_t b_count; /* users using this buffer_head */ #ifdef CONFIG_PREEMPT_RT_BASE @@ -35,7 +29,7 @@ index 5c16cf1..3f8e27b 100644 #endif }; -@@ -105,6 +110,11 @@ static inline void buffer_head_init_locks(struct buffer_head *bh) +@@ -105,6 +110,11 @@ static inline void buffer_head_init_lock { #ifdef CONFIG_PREEMPT_RT_BASE spin_lock_init(&bh->b_uptodate_lock); @@ -47,11 +41,11 @@ index 5c16cf1..3f8e27b 100644 #endif } -diff --git a/include/linux/jbd_common.h b/include/linux/jbd_common.h -index 6230f85..11c313e 100644 ---- a/include/linux/jbd_common.h -+++ b/include/linux/jbd_common.h -@@ -37,32 +37,56 @@ static inline struct journal_head *bh2jh(struct buffer_head *bh) +Index: linux-stable/include/linux/jbd_common.h +=================================================================== +--- linux-stable.orig/include/linux/jbd_common.h ++++ linux-stable/include/linux/jbd_common.h +@@ -39,32 +39,56 @@ static inline struct journal_head *bh2jh static inline void jbd_lock_bh_state(struct buffer_head *bh) { diff --git a/debian/patches/features/all/rt/0196-fs-namespace-preemption-fix.patch b/debian/patches/features/all/rt/fs-namespace-preemption-fix.patch similarity index 72% rename from debian/patches/features/all/rt/0196-fs-namespace-preemption-fix.patch rename to debian/patches/features/all/rt/fs-namespace-preemption-fix.patch index 4ffe2b680..8b4a69ea1 100644 --- a/debian/patches/features/all/rt/0196-fs-namespace-preemption-fix.patch +++ b/debian/patches/features/all/rt/fs-namespace-preemption-fix.patch @@ -1,7 +1,6 @@ -From 02c6cb04ae86544743ced9468bb81a8659473acc Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 19 Jul 2009 08:44:27 -0500 -Subject: [196/256] fs: namespace preemption fix +Subject: fs: namespace preemption fix On RT we cannot loop with preemption disabled here as mnt_make_readonly() might have been preempted. We can safely enable @@ -9,15 +8,16 @@ preemption while waiting for MNT_WRITE_HOLD to be cleared. Safe on !RT as well. Signed-off-by: Thomas Gleixner + --- fs/namespace.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) -diff --git a/fs/namespace.c b/fs/namespace.c -index 4e46539..6dc617c 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -313,8 +313,11 @@ int mnt_want_write(struct vfsmount *m) +Index: linux-stable/fs/namespace.c +=================================================================== +--- linux-stable.orig/fs/namespace.c ++++ linux-stable/fs/namespace.c +@@ -311,8 +311,11 @@ int __mnt_want_write(struct vfsmount *m) * incremented count after it has set MNT_WRITE_HOLD. */ smp_mb(); diff --git a/debian/patches/features/all/rt/0200-fs-ntfs-disable-interrupt-only-on-RT.patch b/debian/patches/features/all/rt/fs-ntfs-disable-interrupt-non-rt.patch similarity index 86% rename from debian/patches/features/all/rt/0200-fs-ntfs-disable-interrupt-only-on-RT.patch rename to debian/patches/features/all/rt/fs-ntfs-disable-interrupt-non-rt.patch index 2ff1b35c7..f30579a4e 100644 --- a/debian/patches/features/all/rt/0200-fs-ntfs-disable-interrupt-only-on-RT.patch +++ b/debian/patches/features/all/rt/fs-ntfs-disable-interrupt-non-rt.patch @@ -1,7 +1,6 @@ -From 8cd9691b9af403d1373b92eaeaa06ba645cb3e26 Mon Sep 17 00:00:00 2001 From: Mike Galbraith Date: Fri, 3 Jul 2009 08:44:12 -0500 -Subject: [200/256] fs: ntfs: disable interrupt only on !RT +Subject: fs: ntfs: disable interrupt only on !RT On Sat, 2007-10-27 at 11:44 +0200, Ingo Molnar wrote: > * Nick Piggin wrote: @@ -35,15 +34,16 @@ instead? Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- fs/ntfs/aops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c -index 4e4ca73..f5d4565 100644 ---- a/fs/ntfs/aops.c -+++ b/fs/ntfs/aops.c -@@ -144,13 +144,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) +Index: linux-stable/fs/ntfs/aops.c +=================================================================== +--- linux-stable.orig/fs/ntfs/aops.c ++++ linux-stable/fs/ntfs/aops.c +@@ -144,13 +144,13 @@ static void ntfs_end_buffer_async_read(s recs = PAGE_CACHE_SIZE / rec_size; /* Should have been verified before we got here... */ BUG_ON(!recs); diff --git a/debian/patches/features/all/rt/0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch b/debian/patches/features/all/rt/fs-replace-bh_uptodate_lock-for-rt.patch similarity index 74% rename from debian/patches/features/all/rt/0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch rename to debian/patches/features/all/rt/fs-replace-bh_uptodate_lock-for-rt.patch index d76344b54..7e5b393ac 100644 --- a/debian/patches/features/all/rt/0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch +++ b/debian/patches/features/all/rt/fs-replace-bh_uptodate_lock-for-rt.patch @@ -1,7 +1,6 @@ -From 050653e6f4bca360d267b8e6cfbc85184bcc89bf Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 18 Mar 2011 09:18:52 +0100 -Subject: [077/256] buffer_head: Replace bh_uptodate_lock for -rt +Subject: buffer_head: Replace bh_uptodate_lock for -rt Wrap the bit_spin_lock calls into a separate inline and add the RT replacements with a real spinlock. @@ -13,11 +12,11 @@ Signed-off-by: Thomas Gleixner include/linux/buffer_head.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 21 deletions(-) -diff --git a/fs/buffer.c b/fs/buffer.c -index ad5938c..38956b5 100644 ---- a/fs/buffer.c -+++ b/fs/buffer.c -@@ -281,8 +281,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) +Index: linux-stable/fs/buffer.c +=================================================================== +--- linux-stable.orig/fs/buffer.c ++++ linux-stable/fs/buffer.c +@@ -281,8 +281,7 @@ static void end_buffer_async_read(struct * decide that the page is now completely done. */ first = page_buffers(page); @@ -27,7 +26,7 @@ index ad5938c..38956b5 100644 clear_buffer_async_read(bh); unlock_buffer(bh); tmp = bh; -@@ -295,8 +294,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) +@@ -295,8 +294,7 @@ static void end_buffer_async_read(struct } tmp = tmp->b_this_page; } while (tmp != bh); @@ -37,7 +36,7 @@ index ad5938c..38956b5 100644 /* * If none of the buffers had errors and they are all -@@ -308,9 +306,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) +@@ -308,9 +306,7 @@ static void end_buffer_async_read(struct return; still_busy: @@ -48,7 +47,7 @@ index ad5938c..38956b5 100644 } /* -@@ -344,8 +340,7 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate) +@@ -344,8 +340,7 @@ void end_buffer_async_write(struct buffe } first = page_buffers(page); @@ -58,7 +57,7 @@ index ad5938c..38956b5 100644 clear_buffer_async_write(bh); unlock_buffer(bh); -@@ -357,15 +352,12 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate) +@@ -357,15 +352,12 @@ void end_buffer_async_write(struct buffe } tmp = tmp->b_this_page; } @@ -76,7 +75,7 @@ index ad5938c..38956b5 100644 } EXPORT_SYMBOL(end_buffer_async_write); -@@ -3187,6 +3179,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags) +@@ -3177,6 +3169,7 @@ struct buffer_head *alloc_buffer_head(gf struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags); if (ret) { INIT_LIST_HEAD(&ret->b_assoc_buffers); @@ -84,11 +83,11 @@ index ad5938c..38956b5 100644 preempt_disable(); __this_cpu_inc(bh_accounting.nr); recalc_bh_state(); -diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c -index fa9c05f..4e4ca73 100644 ---- a/fs/ntfs/aops.c -+++ b/fs/ntfs/aops.c -@@ -108,8 +108,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) +Index: linux-stable/fs/ntfs/aops.c +=================================================================== +--- linux-stable.orig/fs/ntfs/aops.c ++++ linux-stable/fs/ntfs/aops.c +@@ -108,8 +108,7 @@ static void ntfs_end_buffer_async_read(s "0x%llx.", (unsigned long long)bh->b_blocknr); } first = page_buffers(page); @@ -98,7 +97,7 @@ index fa9c05f..4e4ca73 100644 clear_buffer_async_read(bh); unlock_buffer(bh); tmp = bh; -@@ -124,8 +123,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) +@@ -124,8 +123,7 @@ static void ntfs_end_buffer_async_read(s } tmp = tmp->b_this_page; } while (tmp != bh); @@ -108,7 +107,7 @@ index fa9c05f..4e4ca73 100644 /* * If none of the buffers had errors then we can set the page uptodate, * but we first have to perform the post read mst fixups, if the -@@ -160,9 +158,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) +@@ -160,9 +158,7 @@ static void ntfs_end_buffer_async_read(s unlock_page(page); return; still_busy: @@ -119,10 +118,10 @@ index fa9c05f..4e4ca73 100644 } /** -diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h -index 458f497..5c16cf1 100644 ---- a/include/linux/buffer_head.h -+++ b/include/linux/buffer_head.h +Index: linux-stable/include/linux/buffer_head.h +=================================================================== +--- linux-stable.orig/include/linux/buffer_head.h ++++ linux-stable/include/linux/buffer_head.h @@ -72,8 +72,42 @@ struct buffer_head { struct address_space *b_assoc_map; /* mapping this buffer is associated with */ diff --git a/debian/patches/features/all/rt/0155-ftrace-crap.patch.patch b/debian/patches/features/all/rt/ftrace-crap.patch similarity index 65% rename from debian/patches/features/all/rt/0155-ftrace-crap.patch.patch rename to debian/patches/features/all/rt/ftrace-crap.patch index 11094b566..70a9227f2 100644 --- a/debian/patches/features/all/rt/0155-ftrace-crap.patch.patch +++ b/debian/patches/features/all/rt/ftrace-crap.patch @@ -1,7 +1,6 @@ -From e634e6cb2d7783c3387fae3c98f3f96011802330 Mon Sep 17 00:00:00 2001 +Subject: ftrace-crap.patch From: Thomas Gleixner -Date: Fri, 9 Sep 2011 16:55:53 +0200 -Subject: [155/256] ftrace-crap.patch +Date: Fri, 09 Sep 2011 16:55:53 +0200 Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/trace/trace.h | 1 - 2 files changed, 24 insertions(+), 3 deletions(-) -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index ee744f3..6a00ff4 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -414,11 +414,13 @@ EXPORT_SYMBOL_GPL(tracing_is_on); +Index: linux-stable/kernel/trace/trace.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace.c ++++ linux-stable/kernel/trace/trace.c +@@ -402,11 +402,13 @@ EXPORT_SYMBOL_GPL(tracing_is_on); */ void trace_wake_up(void) { @@ -27,7 +26,7 @@ index ee744f3..6a00ff4 100644 } static int __init set_buf_size(char *str) -@@ -775,6 +777,12 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu) +@@ -756,6 +758,12 @@ update_max_tr_single(struct trace_array } #endif /* CONFIG_TRACER_MAX_TRACE */ @@ -40,7 +39,7 @@ index ee744f3..6a00ff4 100644 /** * register_tracer - register a tracer with the ftrace system. * @type - the plugin for the tracer -@@ -3303,6 +3311,7 @@ static int tracing_release_pipe(struct inode *inode, struct file *file) +@@ -3365,6 +3373,7 @@ static int tracing_release_pipe(struct i return 0; } @@ -48,7 +47,7 @@ index ee744f3..6a00ff4 100644 static unsigned int tracing_poll_pipe(struct file *filp, poll_table *poll_table) { -@@ -3324,8 +3333,7 @@ tracing_poll_pipe(struct file *filp, poll_table *poll_table) +@@ -3386,8 +3395,7 @@ tracing_poll_pipe(struct file *filp, pol } } @@ -58,7 +57,7 @@ index ee744f3..6a00ff4 100644 { DEFINE_WAIT(wait); -@@ -3336,6 +3344,20 @@ void default_wait_pipe(struct trace_iterator *iter) +@@ -3398,6 +3406,20 @@ void default_wait_pipe(struct trace_iter finish_wait(&trace_wait, &wait); } @@ -79,11 +78,11 @@ index ee744f3..6a00ff4 100644 /* * This is a make-shift waitqueue. -diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h -index f95d65d..fe96b7c 100644 ---- a/kernel/trace/trace.h -+++ b/kernel/trace/trace.h -@@ -354,7 +354,6 @@ void trace_init_global_iter(struct trace_iterator *iter); +Index: linux-stable/kernel/trace/trace.h +=================================================================== +--- linux-stable.orig/kernel/trace/trace.h ++++ linux-stable/kernel/trace/trace.h +@@ -367,7 +367,6 @@ void trace_init_global_iter(struct trace void tracing_iter_reset(struct trace_iterator *iter, int cpu); diff --git a/debian/patches/features/all/rt/0144-ftrace-migrate-disable-tracing.patch.patch b/debian/patches/features/all/rt/ftrace-migrate-disable-tracing.patch similarity index 64% rename from debian/patches/features/all/rt/0144-ftrace-migrate-disable-tracing.patch.patch rename to debian/patches/features/all/rt/ftrace-migrate-disable-tracing.patch index c6690d75a..cc073a93a 100644 --- a/debian/patches/features/all/rt/0144-ftrace-migrate-disable-tracing.patch.patch +++ b/debian/patches/features/all/rt/ftrace-migrate-disable-tracing.patch @@ -1,7 +1,6 @@ -From a270094d07da20d6324798c10bdd3e277fa65af4 Mon Sep 17 00:00:00 2001 +Subject: ftrace-migrate-disable-tracing.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:56:42 +0200 -Subject: [144/256] ftrace-migrate-disable-tracing.patch Signed-off-by: Thomas Gleixner --- @@ -11,10 +10,10 @@ Signed-off-by: Thomas Gleixner kernel/trace/trace_output.c | 5 +++++ 4 files changed, 14 insertions(+), 4 deletions(-) -diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h -index 176a939..14cac32 100644 ---- a/include/linux/ftrace_event.h -+++ b/include/linux/ftrace_event.h +Index: linux-stable/include/linux/ftrace_event.h +=================================================================== +--- linux-stable.orig/include/linux/ftrace_event.h ++++ linux-stable/include/linux/ftrace_event.h @@ -49,7 +49,8 @@ struct trace_entry { unsigned char flags; unsigned char preempt_count; @@ -25,11 +24,11 @@ index 176a939..14cac32 100644 }; #define FTRACE_MAX_EVENT \ -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 464a96f..8e79f40 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -1179,6 +1179,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, +Index: linux-stable/kernel/trace/trace.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace.c ++++ linux-stable/kernel/trace/trace.c +@@ -1155,6 +1155,8 @@ tracing_generic_entry_update(struct trac ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); @@ -38,7 +37,7 @@ index 464a96f..8e79f40 100644 } EXPORT_SYMBOL_GPL(tracing_generic_entry_update); -@@ -1937,9 +1939,10 @@ static void print_lat_help_header(struct seq_file *m) +@@ -1980,9 +1982,10 @@ static void print_lat_help_header(struct seq_puts(m, "# | / _----=> need-resched \n"); seq_puts(m, "# || / _---=> hardirq/softirq \n"); seq_puts(m, "# ||| / _--=> preempt-depth \n"); @@ -52,11 +51,11 @@ index 464a96f..8e79f40 100644 } static void print_event_info(struct trace_array *tr, struct seq_file *m) -diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c -index 29111da..4c3a7b3 100644 ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -116,6 +116,7 @@ static int trace_define_common_fields(void) +Index: linux-stable/kernel/trace/trace_events.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace_events.c ++++ linux-stable/kernel/trace/trace_events.c +@@ -116,6 +116,7 @@ static int trace_define_common_fields(vo __common_field(unsigned char, flags); __common_field(unsigned char, preempt_count); __common_field(int, pid); @@ -64,11 +63,11 @@ index 29111da..4c3a7b3 100644 __common_field(int, padding); return ret; -diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c -index df611a0..1b79535 100644 ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -593,6 +593,11 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) +Index: linux-stable/kernel/trace/trace_output.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace_output.c ++++ linux-stable/kernel/trace/trace_output.c +@@ -593,6 +593,11 @@ int trace_print_lat_fmt(struct trace_seq else ret = trace_seq_putc(s, '.'); diff --git a/debian/patches/features/all/rt/0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch b/debian/patches/features/all/rt/futex-requeue-pi-fix.patch similarity index 79% rename from debian/patches/features/all/rt/0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch rename to debian/patches/features/all/rt/futex-requeue-pi-fix.patch index 5b2fd474b..75b4003b1 100644 --- a/debian/patches/features/all/rt/0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch +++ b/debian/patches/features/all/rt/futex-requeue-pi-fix.patch @@ -1,12 +1,11 @@ -From a385ed1641702529dd5906ce0fc1ad203538430c Mon Sep 17 00:00:00 2001 From: Steven Rostedt -Date: Thu, 7 Jun 2012 07:47:03 -0400 -Subject: [173/256] futex: Fix bug on when a requeued RT task times out +Subject: futex: Fix bug on when a requeued RT task times out Requeue with timeout causes a bug with PREEMPT_RT_FULL. The bug comes from a timed out condition. + TASK 1 TASK 2 ------ ------ futex_wait_requeue_pi() @@ -16,12 +15,13 @@ The bug comes from a timed out condition. double_lock_hb(); raw_spin_lock(pi_lock); - if (current->pi_blocked_on) { + if (current->pi_blocked_on) { } else { current->pi_blocked_on = PI_WAKE_INPROGRESS; run_spin_unlock(pi_lock); spin_lock(hb->lock); <-- blocked! + plist_for_each_entry_safe(this) { rt_mutex_start_proxy_lock(); task_blocks_on_rt_mutex(); @@ -47,16 +47,18 @@ appropriately. Cc: stable-rt@vger.kernel.org Signed-off-by: Steven Rostedt Signed-off-by: Thomas Gleixner + + --- kernel/rtmutex.c | 32 +++++++++++++++++++++++++++++++- kernel/rtmutex_common.h | 1 + 2 files changed, 32 insertions(+), 1 deletion(-) -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index 1e98e24..7a96797 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c -@@ -69,7 +69,8 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) +Index: linux-stable/kernel/rtmutex.c +=================================================================== +--- linux-stable.orig/kernel/rtmutex.c ++++ linux-stable/kernel/rtmutex.c +@@ -69,7 +69,8 @@ static void fixup_rt_mutex_waiters(struc static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) { @@ -66,7 +68,7 @@ index 1e98e24..7a96797 100644 } /* -@@ -1002,6 +1003,35 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock, +@@ -1002,6 +1003,35 @@ int rt_mutex_start_proxy_lock(struct rt_ return 1; } @@ -89,24 +91,24 @@ index 1e98e24..7a96797 100644 + * PI_REQUEUE_INPROGRESS, so that if the task is waking up + * it will know that we are in the process of requeuing it. + */ -+ raw_spin_lock(&task->pi_lock); ++ raw_spin_lock_irq(&task->pi_lock); + if (task->pi_blocked_on) { -+ raw_spin_unlock(&task->pi_lock); ++ raw_spin_unlock_irq(&task->pi_lock); + raw_spin_unlock(&lock->wait_lock); + return -EAGAIN; + } + task->pi_blocked_on = PI_REQUEUE_INPROGRESS; -+ raw_spin_unlock(&task->pi_lock); ++ raw_spin_unlock_irq(&task->pi_lock); +#endif + ret = task_blocks_on_rt_mutex(lock, waiter, task, detect_deadlock); if (ret && !rt_mutex_owner(lock)) { -diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h -index b43d832..47290ec 100644 ---- a/kernel/rtmutex_common.h -+++ b/kernel/rtmutex_common.h -@@ -104,6 +104,7 @@ static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock) +Index: linux-stable/kernel/rtmutex_common.h +=================================================================== +--- linux-stable.orig/kernel/rtmutex_common.h ++++ linux-stable/kernel/rtmutex_common.h +@@ -104,6 +104,7 @@ static inline struct task_struct *rt_mut * PI-futex support (proxy locking functions, etc.): */ #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) diff --git a/debian/patches/features/all/rt/0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch b/debian/patches/features/all/rt/generic-cmpxchg-use-raw-local-irq.patch similarity index 58% rename from debian/patches/features/all/rt/0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch rename to debian/patches/features/all/rt/generic-cmpxchg-use-raw-local-irq.patch index e1a8f9d8e..3750ddad7 100644 --- a/debian/patches/features/all/rt/0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch +++ b/debian/patches/features/all/rt/generic-cmpxchg-use-raw-local-irq.patch @@ -1,21 +1,21 @@ -From 42beaeae2dcd8371ff2e0c229f83a58bc1fc425a Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:30 -0500 -Subject: [024/256] generic: Use raw local irq variant for generic cmpxchg +Subject: generic: Use raw local irq variant for generic cmpxchg No point in tracing those. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- include/asm-generic/cmpxchg-local.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h -index 2533fdd..d8d4c89 100644 ---- a/include/asm-generic/cmpxchg-local.h -+++ b/include/asm-generic/cmpxchg-local.h -@@ -21,7 +21,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr, +Index: linux-stable/include/asm-generic/cmpxchg-local.h +=================================================================== +--- linux-stable.orig/include/asm-generic/cmpxchg-local.h ++++ linux-stable/include/asm-generic/cmpxchg-local.h +@@ -21,7 +21,7 @@ static inline unsigned long __cmpxchg_lo if (size == 8 && sizeof(unsigned long) != 8) wrong_size_cmpxchg(ptr); @@ -24,7 +24,7 @@ index 2533fdd..d8d4c89 100644 switch (size) { case 1: prev = *(u8 *)ptr; if (prev == old) -@@ -42,7 +42,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr, +@@ -42,7 +42,7 @@ static inline unsigned long __cmpxchg_lo default: wrong_size_cmpxchg(ptr); } @@ -33,7 +33,7 @@ index 2533fdd..d8d4c89 100644 return prev; } -@@ -55,11 +55,11 @@ static inline u64 __cmpxchg64_local_generic(volatile void *ptr, +@@ -55,11 +55,11 @@ static inline u64 __cmpxchg64_local_gene u64 prev; unsigned long flags; diff --git a/debian/patches/features/all/rt/0251-genirq-Add-default-affinity-mask-command-line-option.patch b/debian/patches/features/all/rt/genirq-add-default-mask-cmdline-option.patch similarity index 76% rename from debian/patches/features/all/rt/0251-genirq-Add-default-affinity-mask-command-line-option.patch rename to debian/patches/features/all/rt/genirq-add-default-mask-cmdline-option.patch index dc8fcdf97..a6104c2da 100644 --- a/debian/patches/features/all/rt/0251-genirq-Add-default-affinity-mask-command-line-option.patch +++ b/debian/patches/features/all/rt/genirq-add-default-mask-cmdline-option.patch @@ -1,7 +1,6 @@ -From 909da5deefc2d3dcede823c42a91380ea0bec608 Mon Sep 17 00:00:00 2001 +Subject: genirq: Add default affinity mask command line option From: Thomas Gleixner Date: Fri, 25 May 2012 16:59:47 +0200 -Subject: [251/256] genirq: Add default affinity mask command line option If we isolate CPUs, then we don't want random device interrupts on them. Even w/o the user space irq balancer enabled we can end up with @@ -15,11 +14,11 @@ Signed-off-by: Thomas Gleixner kernel/irq/irqdesc.c | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) -diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt -index 1e0150e..67d1350 100644 ---- a/Documentation/kernel-parameters.txt -+++ b/Documentation/kernel-parameters.txt -@@ -1126,6 +1126,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted. +Index: linux-stable/Documentation/kernel-parameters.txt +=================================================================== +--- linux-stable.orig/Documentation/kernel-parameters.txt ++++ linux-stable/Documentation/kernel-parameters.txt +@@ -1157,6 +1157,15 @@ bytes respectively. Such letter suffixes See comment before ip2_setup() in drivers/char/ip2/ip2base.c. @@ -35,10 +34,10 @@ index 1e0150e..67d1350 100644 irqfixup [HW] When an interrupt is not handled search all handlers for it. Intended to get systems with badly broken -diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c -index 192a302..473b2b6 100644 ---- a/kernel/irq/irqdesc.c -+++ b/kernel/irq/irqdesc.c +Index: linux-stable/kernel/irq/irqdesc.c +=================================================================== +--- linux-stable.orig/kernel/irq/irqdesc.c ++++ linux-stable/kernel/irq/irqdesc.c @@ -23,10 +23,27 @@ static struct lock_class_key irq_desc_lock_class; diff --git a/debian/patches/features/all/rt/0081-genirq-disable-irqpoll-on-rt.patch b/debian/patches/features/all/rt/genirq-disable-irqpoll-on-rt.patch similarity index 72% rename from debian/patches/features/all/rt/0081-genirq-disable-irqpoll-on-rt.patch rename to debian/patches/features/all/rt/genirq-disable-irqpoll-on-rt.patch index 3ca33460e..453192393 100644 --- a/debian/patches/features/all/rt/0081-genirq-disable-irqpoll-on-rt.patch +++ b/debian/patches/features/all/rt/genirq-disable-irqpoll-on-rt.patch @@ -1,21 +1,21 @@ -From 21ae6fbad1ee6a562b0b8dd536f6915614e79c5b Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:57 -0500 -Subject: [081/256] genirq: disable irqpoll on -rt +Subject: genirq: disable irqpoll on -rt Creates long latencies for no value Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- kernel/irq/spurious.c | 10 ++++++++++ 1 file changed, 10 insertions(+) -diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c -index 611cd60..d1c80fa 100644 ---- a/kernel/irq/spurious.c -+++ b/kernel/irq/spurious.c -@@ -341,6 +341,11 @@ MODULE_PARM_DESC(noirqdebug, "Disable irq lockup detection when true"); +Index: linux-stable/kernel/irq/spurious.c +=================================================================== +--- linux-stable.orig/kernel/irq/spurious.c ++++ linux-stable/kernel/irq/spurious.c +@@ -341,6 +341,11 @@ MODULE_PARM_DESC(noirqdebug, "Disable ir static int __init irqfixup_setup(char *str) { diff --git a/debian/patches/features/all/rt/0082-genirq-force-threading.patch.patch b/debian/patches/features/all/rt/genirq-force-threading.patch similarity index 57% rename from debian/patches/features/all/rt/0082-genirq-force-threading.patch.patch rename to debian/patches/features/all/rt/genirq-force-threading.patch index 3701fd265..0c609612c 100644 --- a/debian/patches/features/all/rt/0082-genirq-force-threading.patch.patch +++ b/debian/patches/features/all/rt/genirq-force-threading.patch @@ -1,7 +1,6 @@ -From 314b6e5ffef017ed2493a828cf32f886cb61e850 Mon Sep 17 00:00:00 2001 +Subject: genirq-force-threading.patch From: Thomas Gleixner -Date: Sun, 3 Apr 2011 11:57:29 +0200 -Subject: [082/256] genirq-force-threading.patch +Date: Sun, 03 Apr 2011 11:57:29 +0200 Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/irq/manage.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index d2cc272..9027bde 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -394,9 +394,13 @@ static inline int disable_irq_wake(unsigned int irq) +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -388,9 +388,13 @@ static inline int disable_irq_wake(unsig #ifdef CONFIG_IRQ_FORCED_THREADING @@ -29,11 +28,11 @@ index d2cc272..9027bde 100644 #endif #ifndef __ARCH_SET_SOFTIRQ_PENDING -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 89a3ea8..975b3a1 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -18,6 +18,7 @@ +Index: linux-stable/kernel/irq/manage.c +=================================================================== +--- linux-stable.orig/kernel/irq/manage.c ++++ linux-stable/kernel/irq/manage.c +@@ -21,6 +21,7 @@ #include "internals.h" #ifdef CONFIG_IRQ_FORCED_THREADING @@ -41,7 +40,7 @@ index 89a3ea8..975b3a1 100644 __read_mostly bool force_irqthreads; static int __init setup_forced_irqthreads(char *arg) -@@ -26,6 +27,7 @@ static int __init setup_forced_irqthreads(char *arg) +@@ -29,6 +30,7 @@ static int __init setup_forced_irqthread return 0; } early_param("threadirqs", setup_forced_irqthreads); diff --git a/debian/patches/features/all/rt/0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch b/debian/patches/features/all/rt/genirq-nodebug-shirq.patch similarity index 59% rename from debian/patches/features/all/rt/0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch rename to debian/patches/features/all/rt/genirq-nodebug-shirq.patch index 352aa7f49..b2647e1f2 100644 --- a/debian/patches/features/all/rt/0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch +++ b/debian/patches/features/all/rt/genirq-nodebug-shirq.patch @@ -1,18 +1,17 @@ -From caa14a79da63821e3ba4076f7c83c41c5873eefc Mon Sep 17 00:00:00 2001 From: Thomas Gleixner -Date: Fri, 18 Mar 2011 10:22:04 +0100 -Subject: [079/256] genirq: Disable DEBUG_SHIRQ for rt +Date: Sun, 18 Mar 2011 10:22:04 +0100 +Subject: genirq: Disable DEBUG_SHIRQ for rt Signed-off-by: Thomas Gleixner --- lib/Kconfig.debug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug -index 6777153..1d80795 100644 ---- a/lib/Kconfig.debug -+++ b/lib/Kconfig.debug -@@ -151,7 +151,7 @@ config DEBUG_KERNEL +Index: linux-stable/lib/Kconfig.debug +=================================================================== +--- linux-stable.orig/lib/Kconfig.debug ++++ linux-stable/lib/Kconfig.debug +@@ -164,7 +164,7 @@ config DEBUG_KERNEL config DEBUG_SHIRQ bool "Debug shared IRQ handlers" diff --git a/debian/patches/features/all/rt/0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch b/debian/patches/features/all/rt/harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch similarity index 76% rename from debian/patches/features/all/rt/0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch rename to debian/patches/features/all/rt/harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch index 47bc0a675..0090a7730 100644 --- a/debian/patches/features/all/rt/0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch +++ b/debian/patches/features/all/rt/harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch @@ -1,11 +1,6 @@ -From 1d5690ccc588e836538cfb08ae21f10ce857f488 Mon Sep 17 00:00:00 2001 +Subject: hardirq.h: Define softirq_count() as OUL to kill build warning From: Yong Zhang Date: Thu, 13 Oct 2011 17:19:09 +0800 -Subject: [163/256] hardirq.h: Define softirq_count() as OUL to kill build - warning -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit kernel/lockdep.c: In function ‘print_bad_irq_dependency’: kernel/lockdep.c:1476:3: warning: format ‘%lu’ expects type ‘long unsigned int’, but argument 7 has type ‘unsigned int’ @@ -27,10 +22,10 @@ Signed-off-by: Thomas Gleixner include/linux/hardirq.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h -index cbd7c99..318d91e 100644 ---- a/include/linux/hardirq.h -+++ b/include/linux/hardirq.h +Index: linux-stable/include/linux/hardirq.h +=================================================================== +--- linux-stable.orig/include/linux/hardirq.h ++++ linux-stable/include/linux/hardirq.h @@ -84,7 +84,7 @@ # define softirq_count() (preempt_count() & SOFTIRQ_MASK) # define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) diff --git a/debian/patches/features/all/rt/0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch b/debian/patches/features/all/rt/hotplug-call-cpu_unplug_begin-a-little-early.patch similarity index 85% rename from debian/patches/features/all/rt/0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch rename to debian/patches/features/all/rt/hotplug-call-cpu_unplug_begin-a-little-early.patch index 8a1b12803..d9be58406 100644 --- a/debian/patches/features/all/rt/0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch +++ b/debian/patches/features/all/rt/hotplug-call-cpu_unplug_begin-a-little-early.patch @@ -1,7 +1,6 @@ -From 9831e60c0e5b45404bc3410179206b9fb3e8c3dc Mon Sep 17 00:00:00 2001 +Subject: hotplug: Call cpu_unplug_begin() before DOWN_PREPARE From: Yong Zhang Date: Sun, 16 Oct 2011 18:56:44 +0800 -Subject: [143/256] hotplug: Call cpu_unplug_begin() before DOWN_PREPARE cpu_unplug_begin() should be called before CPU_DOWN_PREPARE, because at CPU_DOWN_PREPARE cpu_active is cleared and sched_domain is @@ -26,11 +25,11 @@ Signed-off-by: Thomas Gleixner kernel/cpu.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index c8aee90..37b2212 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -337,22 +337,20 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -383,22 +383,20 @@ static int __ref _cpu_down(unsigned int return -EBUSY; } diff --git a/debian/patches/features/all/rt/0138-hotplug-Lightweight-get-online-cpus.patch b/debian/patches/features/all/rt/hotplug-light-get-online-cpus.patch similarity index 85% rename from debian/patches/features/all/rt/0138-hotplug-Lightweight-get-online-cpus.patch rename to debian/patches/features/all/rt/hotplug-light-get-online-cpus.patch index 0148dc714..9f0b4dc3e 100644 --- a/debian/patches/features/all/rt/0138-hotplug-Lightweight-get-online-cpus.patch +++ b/debian/patches/features/all/rt/hotplug-light-get-online-cpus.patch @@ -1,7 +1,6 @@ -From 9698a154a5ca400da809937bca83bdc7589df9be Mon Sep 17 00:00:00 2001 +Subject: hotplug: Lightweight get online cpus From: Thomas Gleixner Date: Wed, 15 Jun 2011 12:36:06 +0200 -Subject: [138/256] hotplug: Lightweight get online cpus get_online_cpus() is a heavy weight function which involves a global mutex. migrate_disable() wants a simpler construct which prevents only @@ -13,15 +12,15 @@ tasks on the cpu which should be brought down. Signed-off-by: Thomas Gleixner --- - include/linux/cpu.h | 4 ++ - kernel/cpu.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++-- + include/linux/cpu.h | 4 + + kernel/cpu.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 128 insertions(+), 3 deletions(-) -diff --git a/include/linux/cpu.h b/include/linux/cpu.h -index ee28844..00d2f6f8 100644 ---- a/include/linux/cpu.h -+++ b/include/linux/cpu.h -@@ -176,6 +176,8 @@ extern struct bus_type cpu_subsys; +Index: linux-stable/include/linux/cpu.h +=================================================================== +--- linux-stable.orig/include/linux/cpu.h ++++ linux-stable/include/linux/cpu.h +@@ -175,6 +175,8 @@ extern struct bus_type cpu_subsys; extern void get_online_cpus(void); extern void put_online_cpus(void); @@ -30,7 +29,7 @@ index ee28844..00d2f6f8 100644 #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) -@@ -198,6 +200,8 @@ static inline void cpu_hotplug_driver_unlock(void) +@@ -198,6 +200,8 @@ static inline void cpu_hotplug_driver_un #define get_online_cpus() do { } while (0) #define put_online_cpus() do { } while (0) @@ -39,11 +38,11 @@ index ee28844..00d2f6f8 100644 #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) /* These aren't inline functions due to a GCC bug. */ #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index 2060c6e..8aaa210 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -58,6 +58,102 @@ static struct { +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -63,6 +63,102 @@ static struct { .refcount = 0, }; @@ -146,7 +145,7 @@ index 2060c6e..8aaa210 100644 void get_online_cpus(void) { might_sleep(); -@@ -210,13 +306,14 @@ static int __ref take_cpu_down(void *_param) +@@ -256,13 +352,14 @@ static int __ref take_cpu_down(void *_pa /* Requires cpu_add_remove_lock to be held */ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) { @@ -162,7 +161,7 @@ index 2060c6e..8aaa210 100644 if (num_online_cpus() == 1) return -EBUSY; -@@ -224,7 +321,20 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +@@ -270,7 +367,20 @@ static int __ref _cpu_down(unsigned int if (!cpu_online(cpu)) return -EINVAL; @@ -184,7 +183,7 @@ index 2060c6e..8aaa210 100644 err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls); if (err) { -@@ -232,7 +342,16 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +@@ -278,7 +388,16 @@ static int __ref _cpu_down(unsigned int __cpu_notify(CPU_DOWN_FAILED | mod, hcpu, nr_calls, NULL); printk("%s: attempt to take down CPU %u failed\n", __func__, cpu); @@ -202,7 +201,7 @@ index 2060c6e..8aaa210 100644 } err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu)); -@@ -263,6 +382,8 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +@@ -309,6 +428,8 @@ static int __ref _cpu_down(unsigned int check_for_tasks(cpu); out_release: diff --git a/debian/patches/features/all/rt/0139-hotplug-sync_unplug-No.patch b/debian/patches/features/all/rt/hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch similarity index 68% rename from debian/patches/features/all/rt/0139-hotplug-sync_unplug-No.patch rename to debian/patches/features/all/rt/hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch index 1c3a56c0f..73e14f185 100644 --- a/debian/patches/features/all/rt/0139-hotplug-sync_unplug-No.patch +++ b/debian/patches/features/all/rt/hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch @@ -1,7 +1,6 @@ -From 4210eba03aafc8271a8f97fccfab1ad0893f4086 Mon Sep 17 00:00:00 2001 +Subject: hotplug: sync_unplug: No "\n" in task name From: Yong Zhang Date: Sun, 16 Oct 2011 18:56:43 +0800 -Subject: [139/256] hotplug: sync_unplug: No " " in task name Otherwise the output will look a little odd. @@ -12,11 +11,11 @@ Signed-off-by: Thomas Gleixner kernel/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index 8aaa210..da4ed4f 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -138,7 +138,7 @@ static int cpu_unplug_begin(unsigned int cpu) +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -143,7 +143,7 @@ static int cpu_unplug_begin(unsigned int struct task_struct *tsk; init_completion(&hp->synced); diff --git a/debian/patches/features/all/rt/0142-hotplug-use-migrate-disable.patch.patch b/debian/patches/features/all/rt/hotplug-use-migrate-disable.patch similarity index 66% rename from debian/patches/features/all/rt/0142-hotplug-use-migrate-disable.patch.patch rename to debian/patches/features/all/rt/hotplug-use-migrate-disable.patch index a3d5cc7a5..cef74186f 100644 --- a/debian/patches/features/all/rt/0142-hotplug-use-migrate-disable.patch.patch +++ b/debian/patches/features/all/rt/hotplug-use-migrate-disable.patch @@ -1,18 +1,17 @@ -From 5963228cdaa3c49a09035f1251f15113e0a3dd2c Mon Sep 17 00:00:00 2001 +Subject: hotplug-use-migrate-disable.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 19:35:29 +0200 -Subject: [142/256] hotplug-use-migrate-disable.patch Signed-off-by: Thomas Gleixner --- kernel/cpu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index 1e80dff..c8aee90 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -329,14 +329,13 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -375,14 +375,13 @@ static int __ref _cpu_down(unsigned int cpumask_andnot(cpumask, cpu_online_mask, cpumask_of(cpu)); set_cpus_allowed_ptr(current, cpumask); free_cpumask_var(cpumask); @@ -29,7 +28,7 @@ index 1e80dff..c8aee90 100644 err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls); if (err) { -@@ -386,6 +385,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) +@@ -432,6 +431,7 @@ static int __ref _cpu_down(unsigned int out_release: cpu_unplug_done(cpu); out_cancel: diff --git a/debian/patches/features/all/rt/hrtimer-add-missing-debug_activate-aid.patch b/debian/patches/features/all/rt/hrtimer-add-missing-debug_activate-aid.patch new file mode 100644 index 000000000..f4e13a560 --- /dev/null +++ b/debian/patches/features/all/rt/hrtimer-add-missing-debug_activate-aid.patch @@ -0,0 +1,49 @@ +From: Yong Zhang +Subject: hrtimer: Add missing debug_activate() aid +Date: Thu, 13 Oct 2011 15:52:30 +0800 + +It will fix below warning, which is also reported by Fernando: + +[ 7.616090] ------------[ cut here ]------------ +[ 7.616093] WARNING: at kernel/hrtimer.c:391 hrtimer_fixup_activate+0x27/0x50() +[ 7.616094] Hardware name: OptiPlex 755 +[ 7.616096] Modules linked in: +[ 7.616099] Pid: 0, comm: kworker/0:0 Tainted: G W 3.0.6-rt17-00284-g9d73a61 #15 +[ 7.616100] Call Trace: +[ 7.616103] [] warn_slowpath_common+0x72/0xa0 +[ 7.616106] [] ? hrtimer_fixup_activate+0x27/0x50 +[ 7.616109] [] ? hrtimer_fixup_activate+0x27/0x50 +[ 7.616112] [] warn_slowpath_null+0x22/0x30 +[ 7.616115] [] hrtimer_fixup_activate+0x27/0x50 +[ 7.616118] [] debug_object_activate+0x100/0x130 +[ 7.616121] [] ? hrtimer_start_range_ns+0x26/0x30 +[ 7.616123] [] enqueue_hrtimer+0x19/0x100 +[ 7.616126] [] ? hrtimer_start_range_ns+0x26/0x30 +[ 7.616129] [] __hrtimer_start_range_ns+0x144/0x540 +[ 7.616132] [] ? _raw_spin_unlock_irqrestore+0x3a/0x80 +[ 7.616136] [] hrtimer_start_range_ns+0x26/0x30 +[ 7.616139] [] tick_nohz_restart_sched_tick+0x185/0x1b0 +[ 7.616142] [] cpu_idle+0x98/0xc0 +[ 7.616146] [] start_secondary+0x1d3/0x1da +[ 7.616148] ---[ end trace 0000000000000003 ]--- + +Reported-by: Fernando Lopez-Lezcano +Signed-off-by: Yong Zhang +Link: http://lkml.kernel.org/r/20111013075230.GA2740@zhy +Signed-off-by: Thomas Gleixner +--- + kernel/hrtimer.c | 1 + + 1 file changed, 1 insertion(+) + +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c +@@ -1063,6 +1063,7 @@ int __hrtimer_start_range_ns(struct hrti + * remove it again and report a failure. This avoids + * stale base->first entries. + */ ++ debug_deactivate(timer); + __remove_hrtimer(timer, new_base, + timer->state & HRTIMER_STATE_CALLBACK, 0); + } diff --git a/debian/patches/features/all/rt/0119-hrtimer-fix-reprogram-madness.patch.patch b/debian/patches/features/all/rt/hrtimer-fix-reprogram-madness.patch similarity index 62% rename from debian/patches/features/all/rt/0119-hrtimer-fix-reprogram-madness.patch.patch rename to debian/patches/features/all/rt/hrtimer-fix-reprogram-madness.patch index dd282bf96..ec68a0438 100644 --- a/debian/patches/features/all/rt/0119-hrtimer-fix-reprogram-madness.patch.patch +++ b/debian/patches/features/all/rt/hrtimer-fix-reprogram-madness.patch @@ -1,18 +1,17 @@ -From 251da2a935bd80dc09d674a1c0466f03ada7dfac Mon Sep 17 00:00:00 2001 +Subject: hrtimer-fix-reprogram-madness.patch From: Thomas Gleixner Date: Wed, 14 Sep 2011 14:48:43 +0200 -Subject: [119/256] hrtimer-fix-reprogram-madness.patch Signed-off-by: Thomas Gleixner --- kernel/hrtimer.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index d363df8..3991464 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -1317,7 +1317,11 @@ static void hrtimer_rt_reprogram(int restart, struct hrtimer *timer, +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c +@@ -1338,7 +1338,11 @@ static void hrtimer_rt_reprogram(int res if (!enqueue_hrtimer(timer, base)) return; @@ -25,7 +24,7 @@ index d363df8..3991464 100644 goto requeue; } else if (hrtimer_active(timer)) { -@@ -1326,6 +1330,7 @@ static void hrtimer_rt_reprogram(int restart, struct hrtimer *timer, +@@ -1347,6 +1351,7 @@ static void hrtimer_rt_reprogram(int res * the event device. */ if (&timer->node == base->active.next && @@ -33,7 +32,7 @@ index d363df8..3991464 100644 hrtimer_reprogram(timer, base)) goto requeue; } -@@ -1338,6 +1343,7 @@ requeue: +@@ -1359,6 +1364,7 @@ requeue: */ __remove_hrtimer(timer, base, timer->state, 0); list_add_tail(&timer->cb_entry, &base->expired); diff --git a/debian/patches/features/all/rt/0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch b/debian/patches/features/all/rt/hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch similarity index 73% rename from debian/patches/features/all/rt/0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch rename to debian/patches/features/all/rt/hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch index 8a6f50a56..ffd05f871 100644 --- a/debian/patches/features/all/rt/0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch +++ b/debian/patches/features/all/rt/hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch @@ -1,7 +1,6 @@ -From b852214ab58a1fe26b51298ed91c0a7ed3dd465d Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:31 -0500 -Subject: [116/256] hrtimer: fixup hrtimer callback changes for preempt-rt +Subject: hrtimer: fixup hrtimer callback changes for preempt-rt In preempt-rt we can not call the callbacks which take sleeping locks from the timer interrupt context. @@ -11,29 +10,30 @@ delivery problem for real. Signed-off-by: Thomas Gleixner Signed-off-by: Ingo Molnar ---- - include/linux/hrtimer.h | 3 + - kernel/hrtimer.c | 190 +++++++++++++++++++++++++++++++++++++++++----- - kernel/sched/core.c | 1 + - kernel/sched/rt.c | 1 + - kernel/time/tick-sched.c | 1 + - kernel/watchdog.c | 1 + - 6 files changed, 179 insertions(+), 18 deletions(-) -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index e8b395d..0e37086 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h +--- + include/linux/hrtimer.h | 3 + kernel/hrtimer.c | 196 ++++++++++++++++++++++++++++++++++++++++++----- + kernel/sched/core.c | 1 + kernel/sched/rt.c | 1 + kernel/time/tick-sched.c | 1 + kernel/watchdog.c | 1 + 6 files changed, 183 insertions(+), 20 deletions(-) + +Index: linux-stable/include/linux/hrtimer.h +=================================================================== +--- linux-stable.orig/include/linux/hrtimer.h ++++ linux-stable/include/linux/hrtimer.h @@ -111,6 +111,8 @@ struct hrtimer { enum hrtimer_restart (*function)(struct hrtimer *); struct hrtimer_clock_base *base; unsigned long state; + struct list_head cb_entry; + int irqsafe; - #ifdef CONFIG_TIMER_STATS - int start_pid; - void *start_site; -@@ -147,6 +149,7 @@ struct hrtimer_clock_base { + #ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST + ktime_t praecox; + #endif +@@ -150,6 +152,7 @@ struct hrtimer_clock_base { int index; clockid_t clockid; struct timerqueue_head active; @@ -41,11 +41,11 @@ index e8b395d..0e37086 100644 ktime_t resolution; ktime_t (*get_time)(void); ktime_t softirq_time; -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 905e2cd2..1dd627b 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -589,8 +589,7 @@ static int hrtimer_reprogram(struct hrtimer *timer, +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c +@@ -589,8 +589,7 @@ static int hrtimer_reprogram(struct hrti * When the callback is running, we do not reprogram the clock event * device. The timer callback is either running on a different CPU or * the callback is executed in the hrtimer_interrupt context. The @@ -55,7 +55,7 @@ index 905e2cd2..1dd627b 100644 */ if (hrtimer_callback_running(timer)) return 0; -@@ -625,6 +624,9 @@ static int hrtimer_reprogram(struct hrtimer *timer, +@@ -625,6 +624,9 @@ static int hrtimer_reprogram(struct hrti return res; } @@ -65,13 +65,13 @@ index 905e2cd2..1dd627b 100644 /* * Initialize the high resolution related parts of cpu_base */ -@@ -644,7 +646,29 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, +@@ -644,7 +646,29 @@ static inline int hrtimer_enqueue_reprog struct hrtimer_clock_base *base, int wakeup) { +#ifdef CONFIG_PREEMPT_RT_BASE +again: -+ if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { + if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { + /* + * Move softirq based timers away from the rbtree in + * case it expired already. Otherwise we would have a @@ -90,12 +90,12 @@ index 905e2cd2..1dd627b 100644 + return 1; + } +#else - if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { ++ if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) { +#endif if (wakeup) { raw_spin_unlock(&base->cpu_base->lock); raise_softirq_irqoff(HRTIMER_SOFTIRQ); -@@ -733,6 +757,11 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, +@@ -743,6 +767,11 @@ static inline int hrtimer_enqueue_reprog } static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base) { } static inline void retrigger_next_event(void *arg) { } @@ -107,7 +107,7 @@ index 905e2cd2..1dd627b 100644 #endif /* CONFIG_HIGH_RES_TIMERS */ -@@ -864,9 +893,9 @@ void hrtimer_wait_for_timer(const struct hrtimer *timer) +@@ -874,9 +903,9 @@ void hrtimer_wait_for_timer(const struct { struct hrtimer_clock_base *base = timer->base; @@ -119,7 +119,7 @@ index 905e2cd2..1dd627b 100644 } #else -@@ -916,6 +945,11 @@ static void __remove_hrtimer(struct hrtimer *timer, +@@ -926,6 +955,11 @@ static void __remove_hrtimer(struct hrti if (!(timer->state & HRTIMER_STATE_ENQUEUED)) goto out; @@ -131,7 +131,7 @@ index 905e2cd2..1dd627b 100644 next_timer = timerqueue_getnext(&base->active); timerqueue_del(&base->active, &timer->node); if (&timer->node == next_timer) { -@@ -1178,6 +1212,7 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, +@@ -1199,6 +1233,7 @@ static void __hrtimer_init(struct hrtime base = hrtimer_clockid_to_base(clock_id); timer->base = &cpu_base->clock_base[base]; @@ -139,7 +139,7 @@ index 905e2cd2..1dd627b 100644 timerqueue_init(&timer->node); #ifdef CONFIG_TIMER_STATS -@@ -1261,10 +1296,118 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now) +@@ -1282,10 +1317,118 @@ static void __run_hrtimer(struct hrtimer timer->state &= ~HRTIMER_STATE_CALLBACK; } @@ -260,7 +260,7 @@ index 905e2cd2..1dd627b 100644 /* * High resolution timer interrupt * Called with interrupts disabled -@@ -1273,7 +1416,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) +@@ -1294,7 +1437,7 @@ void hrtimer_interrupt(struct clock_even { struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); ktime_t expires_next, now, entry_time, delta; @@ -269,7 +269,7 @@ index 905e2cd2..1dd627b 100644 BUG_ON(!cpu_base->hres_active); cpu_base->nr_events++; -@@ -1340,7 +1483,10 @@ retry: +@@ -1361,7 +1504,10 @@ retry: break; } @@ -281,7 +281,7 @@ index 905e2cd2..1dd627b 100644 } } -@@ -1355,6 +1501,10 @@ retry: +@@ -1376,6 +1522,10 @@ retry: if (expires_next.tv64 == KTIME_MAX || !tick_program_event(expires_next, 0)) { cpu_base->hang_detected = 0; @@ -292,30 +292,41 @@ index 905e2cd2..1dd627b 100644 return; } -@@ -1430,17 +1580,17 @@ void hrtimer_peek_ahead_timers(void) +@@ -1456,24 +1606,26 @@ void hrtimer_peek_ahead_timers(void) local_irq_restore(flags); } --static void run_hrtimer_softirq(struct softirq_action *h) --{ -- hrtimer_peek_ahead_timers(); --} -- - #else /* CONFIG_HIGH_RES_TIMERS */ - - static inline void __hrtimer_peek_ahead_timers(void) { } - - #endif /* !CONFIG_HIGH_RES_TIMERS */ - -+static void run_hrtimer_softirq(struct softirq_action *h) -+{ -+ hrtimer_rt_run_pending(); -+} ++#else /* CONFIG_HIGH_RES_TIMERS */ + ++static inline void __hrtimer_peek_ahead_timers(void) { } ++ ++#endif /* !CONFIG_HIGH_RES_TIMERS */ ++ + static void run_hrtimer_softirq(struct softirq_action *h) + { ++#ifdef CONFIG_HIGH_RES_TIMERS + struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); + + if (cpu_base->clock_was_set) { + cpu_base->clock_was_set = 0; + clock_was_set(); + } ++#endif + +- hrtimer_peek_ahead_timers(); ++ hrtimer_rt_run_pending(); + } + +-#else /* CONFIG_HIGH_RES_TIMERS */ +- +-static inline void __hrtimer_peek_ahead_timers(void) { } +- +-#endif /* !CONFIG_HIGH_RES_TIMERS */ +- /* * Called from timer softirq every jiffy, expire hrtimers: * -@@ -1473,7 +1623,7 @@ void hrtimer_run_queues(void) +@@ -1506,7 +1658,7 @@ void hrtimer_run_queues(void) struct timerqueue_node *node; struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); struct hrtimer_clock_base *base; @@ -324,7 +335,7 @@ index 905e2cd2..1dd627b 100644 if (hrtimer_hres_active()) return; -@@ -1498,12 +1648,16 @@ void hrtimer_run_queues(void) +@@ -1531,12 +1683,16 @@ void hrtimer_run_queues(void) hrtimer_get_expires_tv64(timer)) break; @@ -343,7 +354,7 @@ index 905e2cd2..1dd627b 100644 } /* -@@ -1525,6 +1679,7 @@ static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer) +@@ -1558,6 +1714,7 @@ static enum hrtimer_restart hrtimer_wake void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) { sl->timer.function = hrtimer_wakeup; @@ -351,7 +362,7 @@ index 905e2cd2..1dd627b 100644 sl->task = task; } EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); -@@ -1663,6 +1818,7 @@ static void __cpuinit init_hrtimers_cpu(int cpu) +@@ -1696,6 +1853,7 @@ static void __cpuinit init_hrtimers_cpu( for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { cpu_base->clock_base[i].cpu_base = cpu_base; timerqueue_init_head(&cpu_base->clock_base[i].active); @@ -359,7 +370,7 @@ index 905e2cd2..1dd627b 100644 } hrtimer_init_hres(cpu_base); -@@ -1781,9 +1937,7 @@ void __init hrtimers_init(void) +@@ -1814,9 +1972,7 @@ void __init hrtimers_init(void) hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); register_cpu_notifier(&hrtimers_nb); @@ -369,11 +380,11 @@ index 905e2cd2..1dd627b 100644 } /** -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 83a36dd..bf42b7d 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -480,6 +480,7 @@ static void init_rq_hrtick(struct rq *rq) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -480,6 +480,7 @@ static void init_rq_hrtick(struct rq *rq hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); rq->hrtick_timer.function = hrtick; @@ -381,11 +392,11 @@ index 83a36dd..bf42b7d 100644 } #else /* CONFIG_SCHED_HRTICK */ static inline void hrtick_clear(struct rq *rq) -diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c -index 44af55e..8bb9f00 100644 ---- a/kernel/sched/rt.c -+++ b/kernel/sched/rt.c -@@ -41,6 +41,7 @@ void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) +Index: linux-stable/kernel/sched/rt.c +=================================================================== +--- linux-stable.orig/kernel/sched/rt.c ++++ linux-stable/kernel/sched/rt.c +@@ -41,6 +41,7 @@ void init_rt_bandwidth(struct rt_bandwid hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); @@ -393,11 +404,11 @@ index 44af55e..8bb9f00 100644 rt_b->rt_period_timer.function = sched_rt_period_timer; } -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index a607a7c..5d409b0 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -840,6 +840,7 @@ void tick_setup_sched_timer(void) +Index: linux-stable/kernel/time/tick-sched.c +=================================================================== +--- linux-stable.orig/kernel/time/tick-sched.c ++++ linux-stable/kernel/time/tick-sched.c +@@ -873,6 +873,7 @@ void tick_setup_sched_timer(void) * Emulate tick processing via per-CPU hrtimers: */ hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); @@ -405,11 +416,11 @@ index a607a7c..5d409b0 100644 ts->sched_timer.function = tick_sched_timer; /* Get the next period (per cpu) */ -diff --git a/kernel/watchdog.c b/kernel/watchdog.c -index de08263..87192eb 100644 ---- a/kernel/watchdog.c -+++ b/kernel/watchdog.c -@@ -441,6 +441,7 @@ static void watchdog_prepare_cpu(int cpu) +Index: linux-stable/kernel/watchdog.c +=================================================================== +--- linux-stable.orig/kernel/watchdog.c ++++ linux-stable/kernel/watchdog.c +@@ -470,6 +470,7 @@ static void watchdog_prepare_cpu(int cpu WARN_ON(per_cpu(softlockup_watchdog, cpu)); hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hrtimer->function = watchdog_timer_fn; diff --git a/debian/patches/features/all/rt/0115-hrtimers-prepare-full-preemption.patch b/debian/patches/features/all/rt/hrtimers-prepare-full-preemption.patch similarity index 77% rename from debian/patches/features/all/rt/0115-hrtimers-prepare-full-preemption.patch rename to debian/patches/features/all/rt/hrtimers-prepare-full-preemption.patch index f0062136b..467eb03d1 100644 --- a/debian/patches/features/all/rt/0115-hrtimers-prepare-full-preemption.patch +++ b/debian/patches/features/all/rt/hrtimers-prepare-full-preemption.patch @@ -1,13 +1,13 @@ -From f845e00d0d0639b3c0b3817300c7b50c3185d5d0 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:34 -0500 -Subject: [115/256] hrtimers: prepare full preemption +Subject: hrtimers: prepare full preemption Make cancellation of a running callback in softirq context safe against preemption. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- include/linux/hrtimer.h | 10 ++++++++++ kernel/hrtimer.c | 33 ++++++++++++++++++++++++++++++++- @@ -15,11 +15,11 @@ Signed-off-by: Thomas Gleixner kernel/posix-timers.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index fd0dc30..e8b395d 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -187,6 +187,9 @@ struct hrtimer_cpu_base { +Index: linux-stable/include/linux/hrtimer.h +=================================================================== +--- linux-stable.orig/include/linux/hrtimer.h ++++ linux-stable/include/linux/hrtimer.h +@@ -192,6 +192,9 @@ struct hrtimer_cpu_base { unsigned long nr_hangs; ktime_t max_hang_time; #endif @@ -29,7 +29,7 @@ index fd0dc30..e8b395d 100644 struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; }; -@@ -374,6 +377,13 @@ static inline int hrtimer_restart(struct hrtimer *timer) +@@ -385,6 +388,13 @@ static inline int hrtimer_restart(struct return hrtimer_start_expires(timer, HRTIMER_MODE_ABS); } @@ -43,11 +43,11 @@ index fd0dc30..e8b395d 100644 /* Query timers: */ extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer); extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp); -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 1a3695e..905e2cd2 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -847,6 +847,32 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c +@@ -857,6 +857,32 @@ u64 hrtimer_forward(struct hrtimer *time } EXPORT_SYMBOL_GPL(hrtimer_forward); @@ -80,7 +80,7 @@ index 1a3695e..905e2cd2 100644 /* * enqueue_hrtimer - internal function to (re)start a timer * -@@ -1073,7 +1099,7 @@ int hrtimer_cancel(struct hrtimer *timer) +@@ -1094,7 +1120,7 @@ int hrtimer_cancel(struct hrtimer *timer if (ret >= 0) return ret; @@ -89,7 +89,7 @@ index 1a3695e..905e2cd2 100644 } } EXPORT_SYMBOL_GPL(hrtimer_cancel); -@@ -1476,6 +1502,8 @@ void hrtimer_run_queues(void) +@@ -1509,6 +1535,8 @@ void hrtimer_run_queues(void) } raw_spin_unlock(&cpu_base->lock); } @@ -98,7 +98,7 @@ index 1a3695e..905e2cd2 100644 } /* -@@ -1638,6 +1666,9 @@ static void __cpuinit init_hrtimers_cpu(int cpu) +@@ -1671,6 +1699,9 @@ static void __cpuinit init_hrtimers_cpu( } hrtimer_init_hres(cpu_base); @@ -108,10 +108,10 @@ index 1a3695e..905e2cd2 100644 } #ifdef CONFIG_HOTPLUG_CPU -diff --git a/kernel/itimer.c b/kernel/itimer.c -index 8d262b4..d051390 100644 ---- a/kernel/itimer.c -+++ b/kernel/itimer.c +Index: linux-stable/kernel/itimer.c +=================================================================== +--- linux-stable.orig/kernel/itimer.c ++++ linux-stable/kernel/itimer.c @@ -213,6 +213,7 @@ again: /* We are sharing ->siglock with it_real_fn() */ if (hrtimer_try_to_cancel(timer) < 0) { @@ -120,11 +120,11 @@ index 8d262b4..d051390 100644 goto again; } expires = timeval_to_ktime(value->it_value); -diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c -index 7b73c34..6a74800 100644 ---- a/kernel/posix-timers.c -+++ b/kernel/posix-timers.c -@@ -766,6 +766,20 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id) +Index: linux-stable/kernel/posix-timers.c +=================================================================== +--- linux-stable.orig/kernel/posix-timers.c ++++ linux-stable/kernel/posix-timers.c +@@ -766,6 +766,20 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_ return overrun; } @@ -182,7 +182,7 @@ index 7b73c34..6a74800 100644 spin_lock(¤t->sighand->siglock); list_del(&timer->list); -@@ -920,8 +943,18 @@ static void itimer_delete(struct k_itimer *timer) +@@ -920,8 +943,18 @@ static void itimer_delete(struct k_itime retry_delete: spin_lock_irqsave(&timer->it_lock, flags); diff --git a/debian/patches/features/all/rt/0055-hwlatdetect.patch.patch b/debian/patches/features/all/rt/hwlatdetect.patch similarity index 96% rename from debian/patches/features/all/rt/0055-hwlatdetect.patch.patch rename to debian/patches/features/all/rt/hwlatdetect.patch index b646e232b..c64e5db5a 100644 --- a/debian/patches/features/all/rt/0055-hwlatdetect.patch.patch +++ b/debian/patches/features/all/rt/hwlatdetect.patch @@ -1,28 +1,24 @@ -From 994f3a6efaab1873be49220e12dd8a4992fab8df Mon Sep 17 00:00:00 2001 +Subject: hwlatdetect.patch From: Carsten Emde Date: Tue, 19 Jul 2011 13:53:12 +0100 -Subject: [055/256] hwlatdetect.patch Jon Masters developed this wonderful SMI detector. For details please consult Documentation/hwlat_detector.txt. It could be ported to Linux 3.0 RT without any major change. Signed-off-by: Carsten Emde + --- Documentation/hwlat_detector.txt | 64 ++ - MAINTAINERS | 9 + - drivers/misc/Kconfig | 29 + - drivers/misc/Makefile | 1 + - drivers/misc/hwlat_detector.c | 1212 ++++++++++++++++++++++++++++++++++++++ - 5 files changed, 1315 insertions(+) - create mode 100644 Documentation/hwlat_detector.txt - create mode 100644 drivers/misc/hwlat_detector.c + drivers/misc/Kconfig | 29 + drivers/misc/Makefile | 1 + drivers/misc/hwlat_detector.c | 1212 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 1306 insertions(+) -diff --git a/Documentation/hwlat_detector.txt b/Documentation/hwlat_detector.txt -new file mode 100644 -index 0000000..cb61516 +Index: linux-stable/Documentation/hwlat_detector.txt +=================================================================== --- /dev/null -+++ b/Documentation/hwlat_detector.txt ++++ linux-stable/Documentation/hwlat_detector.txt @@ -0,0 +1,64 @@ +Introduction: +------------- @@ -88,31 +84,11 @@ index 0000000..cb61516 +observe any latencies that exceed the threshold (initially 100 usecs), +then we write to a global sample ring buffer of 8K samples, which is +consumed by reading from the "sample" (pipe) debugfs file interface. -diff --git a/MAINTAINERS b/MAINTAINERS -index b362709..249426c 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -3081,6 +3081,15 @@ L: linuxppc-dev@lists.ozlabs.org - S: Odd Fixes - F: drivers/tty/hvc/ - -+HARDWARE LATENCY DETECTOR -+P: Jon Masters -+M: jcm@jonmasters.org -+W: http://www.kernel.org/pub/linux/kernel/people/jcm/hwlat_detector/ -+S: Supported -+L: linux-kernel@vger.kernel.org -+F: Documentation/hwlat_detector.txt -+F: drivers/misc/hwlat_detector.c -+ - HARDWARE MONITORING - M: Jean Delvare - M: Guenter Roeck -diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index 504daa3..eead6ce 100644 ---- a/drivers/misc/Kconfig -+++ b/drivers/misc/Kconfig -@@ -130,6 +130,35 @@ config IBM_ASM +Index: linux-stable/drivers/misc/Kconfig +=================================================================== +--- linux-stable.orig/drivers/misc/Kconfig ++++ linux-stable/drivers/misc/Kconfig +@@ -131,6 +131,35 @@ config IBM_ASM for information on the specific driver level and support statement for your IBM server. @@ -148,20 +124,19 @@ index 504daa3..eead6ce 100644 config PHANTOM tristate "Sensable PHANToM (PCI)" depends on PCI -diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index 3e1d8010..c7c058a 100644 ---- a/drivers/misc/Makefile -+++ b/drivers/misc/Makefile -@@ -49,3 +49,4 @@ obj-y += carma/ +Index: linux-stable/drivers/misc/Makefile +=================================================================== +--- linux-stable.orig/drivers/misc/Makefile ++++ linux-stable/drivers/misc/Makefile +@@ -50,3 +50,4 @@ obj-y += carma/ obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ - obj-$(CONFIG_MAX8997_MUIC) += max8997-muic.o + obj-$(CONFIG_INTEL_MEI) += mei/ +obj-$(CONFIG_HWLAT_DETECTOR) += hwlat_detector.o -diff --git a/drivers/misc/hwlat_detector.c b/drivers/misc/hwlat_detector.c -new file mode 100644 -index 0000000..b7b7c90 +Index: linux-stable/drivers/misc/hwlat_detector.c +=================================================================== --- /dev/null -+++ b/drivers/misc/hwlat_detector.c ++++ linux-stable/drivers/misc/hwlat_detector.c @@ -0,0 +1,1212 @@ +/* + * hwlat_detector.c - A simple Hardware Latency detector. diff --git a/debian/patches/features/all/rt/0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch b/debian/patches/features/all/rt/ide-use-nort-local-irq-variants.patch similarity index 59% rename from debian/patches/features/all/rt/0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch rename to debian/patches/features/all/rt/ide-use-nort-local-irq-variants.patch index 7d3dc272e..1a363e674 100644 --- a/debian/patches/features/all/rt/0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch +++ b/debian/patches/features/all/rt/ide-use-nort-local-irq-variants.patch @@ -1,12 +1,12 @@ -From 7bd701e724b6ac30489d769e303c3becfbfbfcfc Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:16 -0500 -Subject: [065/256] ide: Do not disable interrupts for PREEMPT-RT +Subject: ide: Do not disable interrupts for PREEMPT-RT Use the local_irq_*_nort variants. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/ide/alim15x3.c | 4 ++-- drivers/ide/hpt366.c | 4 ++-- @@ -17,11 +17,11 @@ Signed-off-by: Thomas Gleixner drivers/ide/ide-taskfile.c | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) -diff --git a/drivers/ide/alim15x3.c b/drivers/ide/alim15x3.c -index 2c8016a..6fd6037 100644 ---- a/drivers/ide/alim15x3.c -+++ b/drivers/ide/alim15x3.c -@@ -234,7 +234,7 @@ static int init_chipset_ali15x3(struct pci_dev *dev) +Index: linux-stable/drivers/ide/alim15x3.c +=================================================================== +--- linux-stable.orig/drivers/ide/alim15x3.c ++++ linux-stable/drivers/ide/alim15x3.c +@@ -234,7 +234,7 @@ static int init_chipset_ali15x3(struct p isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); @@ -39,11 +39,11 @@ index 2c8016a..6fd6037 100644 return 0; } -diff --git a/drivers/ide/hpt366.c b/drivers/ide/hpt366.c -index 58c51cd..d2a4059 100644 ---- a/drivers/ide/hpt366.c -+++ b/drivers/ide/hpt366.c -@@ -1241,7 +1241,7 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif, +Index: linux-stable/drivers/ide/hpt366.c +=================================================================== +--- linux-stable.orig/drivers/ide/hpt366.c ++++ linux-stable/drivers/ide/hpt366.c +@@ -1241,7 +1241,7 @@ static int __devinit init_dma_hpt366(ide dma_old = inb(base + 2); @@ -52,7 +52,7 @@ index 58c51cd..d2a4059 100644 dma_new = dma_old; pci_read_config_byte(dev, hwif->channel ? 0x4b : 0x43, &masterdma); -@@ -1252,7 +1252,7 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif, +@@ -1252,7 +1252,7 @@ static int __devinit init_dma_hpt366(ide if (dma_new != dma_old) outb(dma_new, base + 2); @@ -61,11 +61,11 @@ index 58c51cd..d2a4059 100644 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, base, base + 7); -diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c -index 1976397..4169433 100644 ---- a/drivers/ide/ide-io-std.c -+++ b/drivers/ide/ide-io-std.c -@@ -175,7 +175,7 @@ void ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, +Index: linux-stable/drivers/ide/ide-io-std.c +=================================================================== +--- linux-stable.orig/drivers/ide/ide-io-std.c ++++ linux-stable/drivers/ide/ide-io-std.c +@@ -175,7 +175,7 @@ void ide_input_data(ide_drive_t *drive, unsigned long uninitialized_var(flags); if ((io_32bit & 2) && !mmio) { @@ -74,7 +74,7 @@ index 1976397..4169433 100644 ata_vlb_sync(io_ports->nsect_addr); } -@@ -186,7 +186,7 @@ void ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, +@@ -186,7 +186,7 @@ void ide_input_data(ide_drive_t *drive, insl(data_addr, buf, words); if ((io_32bit & 2) && !mmio) @@ -83,7 +83,7 @@ index 1976397..4169433 100644 if (((len + 1) & 3) < 2) return; -@@ -219,7 +219,7 @@ void ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, +@@ -219,7 +219,7 @@ void ide_output_data(ide_drive_t *drive, unsigned long uninitialized_var(flags); if ((io_32bit & 2) && !mmio) { @@ -92,7 +92,7 @@ index 1976397..4169433 100644 ata_vlb_sync(io_ports->nsect_addr); } -@@ -230,7 +230,7 @@ void ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, void *buf, +@@ -230,7 +230,7 @@ void ide_output_data(ide_drive_t *drive, outsl(data_addr, buf, words); if ((io_32bit & 2) && !mmio) @@ -101,11 +101,11 @@ index 1976397..4169433 100644 if (((len + 1) & 3) < 2) return; -diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c -index 177db6d..079ae6b 100644 ---- a/drivers/ide/ide-io.c -+++ b/drivers/ide/ide-io.c -@@ -659,7 +659,7 @@ void ide_timer_expiry (unsigned long data) +Index: linux-stable/drivers/ide/ide-io.c +=================================================================== +--- linux-stable.orig/drivers/ide/ide-io.c ++++ linux-stable/drivers/ide/ide-io.c +@@ -659,7 +659,7 @@ void ide_timer_expiry (unsigned long dat /* disable_irq_nosync ?? */ disable_irq(hwif->irq); /* local CPU only, as if we were handling an interrupt */ @@ -114,11 +114,11 @@ index 177db6d..079ae6b 100644 if (hwif->polling) { startstop = handler(drive); } else if (drive_is_ready(drive)) { -diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c -index 376f2dc..f014dd1 100644 ---- a/drivers/ide/ide-iops.c -+++ b/drivers/ide/ide-iops.c -@@ -129,12 +129,12 @@ int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, +Index: linux-stable/drivers/ide/ide-iops.c +=================================================================== +--- linux-stable.orig/drivers/ide/ide-iops.c ++++ linux-stable/drivers/ide/ide-iops.c +@@ -129,12 +129,12 @@ int __ide_wait_stat(ide_drive_t *drive, if ((stat & ATA_BUSY) == 0) break; @@ -133,11 +133,11 @@ index 376f2dc..f014dd1 100644 } /* * Allow status to settle, then read it again. -diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c -index 068cef0..38e69e1 100644 ---- a/drivers/ide/ide-probe.c -+++ b/drivers/ide/ide-probe.c -@@ -196,10 +196,10 @@ static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id) +Index: linux-stable/drivers/ide/ide-probe.c +=================================================================== +--- linux-stable.orig/drivers/ide/ide-probe.c ++++ linux-stable/drivers/ide/ide-probe.c +@@ -196,10 +196,10 @@ static void do_identify(ide_drive_t *dri int bswap = 1; /* local CPU only; some systems need this */ @@ -150,11 +150,11 @@ index 068cef0..38e69e1 100644 drive->dev_flags |= IDE_DFLAG_ID_READ; #ifdef DEBUG -diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c -index 729428e..3a9a1fc 100644 ---- a/drivers/ide/ide-taskfile.c -+++ b/drivers/ide/ide-taskfile.c -@@ -251,7 +251,7 @@ void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, +Index: linux-stable/drivers/ide/ide-taskfile.c +=================================================================== +--- linux-stable.orig/drivers/ide/ide-taskfile.c ++++ linux-stable/drivers/ide/ide-taskfile.c +@@ -251,7 +251,7 @@ void ide_pio_bytes(ide_drive_t *drive, s page_is_high = PageHighMem(page); if (page_is_high) @@ -163,7 +163,7 @@ index 729428e..3a9a1fc 100644 buf = kmap_atomic(page) + offset; -@@ -272,7 +272,7 @@ void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, +@@ -272,7 +272,7 @@ void ide_pio_bytes(ide_drive_t *drive, s kunmap_atomic(buf); if (page_is_high) @@ -172,7 +172,7 @@ index 729428e..3a9a1fc 100644 len -= nr_bytes; } -@@ -415,7 +415,7 @@ static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, +@@ -415,7 +415,7 @@ static ide_startstop_t pre_task_out_intr } if ((drive->dev_flags & IDE_DFLAG_UNMASK) == 0) diff --git a/debian/patches/features/all/rt/0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch b/debian/patches/features/all/rt/infiniband-mellanox-ib-use-nort-irq.patch similarity index 65% rename from debian/patches/features/all/rt/0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch rename to debian/patches/features/all/rt/infiniband-mellanox-ib-use-nort-irq.patch index ae8cdf740..683982714 100644 --- a/debian/patches/features/all/rt/0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch +++ b/debian/patches/features/all/rt/infiniband-mellanox-ib-use-nort-irq.patch @@ -1,8 +1,6 @@ -From bcd7012f3bfabeb95de135946520f8f240f11778 Mon Sep 17 00:00:00 2001 From: Sven-Thorsten Dietrich Date: Fri, 3 Jul 2009 08:30:35 -0500 -Subject: [066/256] infiniband: Mellanox IB driver patch use _nort() - primitives +Subject: infiniband: Mellanox IB driver patch use _nort() primitives Fixes in_atomic stack-dump, when Mellanox module is loaded into the RT Kernel. @@ -15,15 +13,16 @@ changes." Signed-off-by: Sven-Thorsten Dietrich Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c -index 20ebc6f..525fca6 100644 ---- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c -+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c -@@ -798,7 +798,7 @@ void ipoib_mcast_restart_task(struct work_struct *work) +Index: linux-stable/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +=================================================================== +--- linux-stable.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c ++++ linux-stable/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +@@ -783,7 +783,7 @@ void ipoib_mcast_restart_task(struct wor ipoib_mcast_stop_thread(dev, 0); @@ -32,7 +31,7 @@ index 20ebc6f..525fca6 100644 netif_addr_lock(dev); spin_lock(&priv->lock); -@@ -880,7 +880,7 @@ void ipoib_mcast_restart_task(struct work_struct *work) +@@ -865,7 +865,7 @@ void ipoib_mcast_restart_task(struct wor spin_unlock(&priv->lock); netif_addr_unlock(dev); diff --git a/debian/patches/features/all/rt/0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch b/debian/patches/features/all/rt/inpt-gameport-use-local-irq-nort.patch similarity index 65% rename from debian/patches/features/all/rt/0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch rename to debian/patches/features/all/rt/inpt-gameport-use-local-irq-nort.patch index b100a0037..861a98dfe 100644 --- a/debian/patches/features/all/rt/0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch +++ b/debian/patches/features/all/rt/inpt-gameport-use-local-irq-nort.patch @@ -1,21 +1,21 @@ -From 9c42db1c94f200b115c6ea592ec7567706e43098 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:16 -0500 -Subject: [067/256] input: gameport: Do not disable interrupts on PREEMPT_RT +Subject: input: gameport: Do not disable interrupts on PREEMPT_RT Use the _nort() primitives. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/input/gameport/gameport.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c -index da739d9..18fdafe 100644 ---- a/drivers/input/gameport/gameport.c -+++ b/drivers/input/gameport/gameport.c -@@ -87,12 +87,12 @@ static int gameport_measure_speed(struct gameport *gameport) +Index: linux-stable/drivers/input/gameport/gameport.c +=================================================================== +--- linux-stable.orig/drivers/input/gameport/gameport.c ++++ linux-stable/drivers/input/gameport/gameport.c +@@ -87,12 +87,12 @@ static int gameport_measure_speed(struct tx = 1 << 30; for(i = 0; i < 50; i++) { @@ -30,7 +30,7 @@ index da739d9..18fdafe 100644 udelay(i * 10); if ((t = DELTA(t2,t1) - DELTA(t3,t2)) < tx) tx = t; } -@@ -111,11 +111,11 @@ static int gameport_measure_speed(struct gameport *gameport) +@@ -111,11 +111,11 @@ static int gameport_measure_speed(struct tx = 1 << 30; for(i = 0; i < 50; i++) { diff --git a/debian/patches/features/all/rt/0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch b/debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch similarity index 79% rename from debian/patches/features/all/rt/0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch rename to debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch index e35cd91a5..60291d02a 100644 --- a/debian/patches/features/all/rt/0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch +++ b/debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch @@ -1,7 +1,6 @@ -From 6ee54eb5fc1def247b63e36c83b26ab5dfb34ce2 Mon Sep 17 00:00:00 2001 +Subject: intel_idle: Convert i7300_idle_lock to raw spinlock From: Mike Galbraith -Date: Wed, 7 Dec 2011 12:48:42 +0100 -Subject: [013/256] intel_idle: Convert i7300_idle_lock to raw spinlock +Date: Wed, 07 Dec 2011 12:48:42 +0100 24 core Intel box's first exposure to 3.0.12-rt30-rc3 didn't go well. @@ -23,14 +22,15 @@ Signed-off-by: Mike Galbraith Cc: Steven Rostedt Link: http://lkml.kernel.org/r/1323258522.5057.73.camel@marge.simson.net Signed-off-by: Thomas Gleixner + --- drivers/idle/i7300_idle.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/drivers/idle/i7300_idle.c b/drivers/idle/i7300_idle.c -index fa080eb..ffeebc7 100644 ---- a/drivers/idle/i7300_idle.c -+++ b/drivers/idle/i7300_idle.c +Index: linux-stable/drivers/idle/i7300_idle.c +=================================================================== +--- linux-stable.orig/drivers/idle/i7300_idle.c ++++ linux-stable/drivers/idle/i7300_idle.c @@ -75,7 +75,7 @@ static unsigned long past_skip; static struct pci_dev *fbd_dev; @@ -40,7 +40,7 @@ index fa080eb..ffeebc7 100644 static int i7300_idle_active; static u8 i7300_idle_thrtctl_saved; -@@ -457,7 +457,7 @@ static int i7300_idle_notifier(struct notifier_block *nb, unsigned long val, +@@ -457,7 +457,7 @@ static int i7300_idle_notifier(struct no idle_begin_time = ktime_get(); } @@ -49,7 +49,7 @@ index fa080eb..ffeebc7 100644 if (val == IDLE_START) { cpumask_set_cpu(smp_processor_id(), idle_cpumask); -@@ -506,7 +506,7 @@ static int i7300_idle_notifier(struct notifier_block *nb, unsigned long val, +@@ -506,7 +506,7 @@ static int i7300_idle_notifier(struct no } } end: diff --git a/debian/patches/features/all/rt/0103-ipc-Make-the-ipc-code-rt-aware.patch b/debian/patches/features/all/rt/ipc-make-rt-aware.patch similarity index 72% rename from debian/patches/features/all/rt/0103-ipc-Make-the-ipc-code-rt-aware.patch rename to debian/patches/features/all/rt/ipc-make-rt-aware.patch index 05cac88d7..a960f1c78 100644 --- a/debian/patches/features/all/rt/0103-ipc-Make-the-ipc-code-rt-aware.patch +++ b/debian/patches/features/all/rt/ipc-make-rt-aware.patch @@ -1,7 +1,6 @@ -From 739544c0eab09ad0faf0f47b7bd099e078a80a2e Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:12 -0500 -Subject: [103/256] ipc: Make the ipc code -rt aware +Subject: ipc: Make the ipc code -rt aware RT serializes the code with the (rt)spinlock but keeps preemption enabled. Some parts of the code need to be atomic nevertheless. @@ -10,16 +9,17 @@ Protect it with preempt_disable/enable_rt pairts. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- ipc/mqueue.c | 5 +++++ ipc/msg.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) -diff --git a/ipc/mqueue.c b/ipc/mqueue.c -index 28bd64d..dd9e66a 100644 ---- a/ipc/mqueue.c -+++ b/ipc/mqueue.c -@@ -813,12 +813,17 @@ static inline void pipelined_send(struct mqueue_inode_info *info, +Index: linux-stable/ipc/mqueue.c +=================================================================== +--- linux-stable.orig/ipc/mqueue.c ++++ linux-stable/ipc/mqueue.c +@@ -912,12 +912,17 @@ static inline void pipelined_send(struct struct msg_msg *message, struct ext_wait_queue *receiver) { @@ -37,11 +37,11 @@ index 28bd64d..dd9e66a 100644 } /* pipelined_receive() - if there is task waiting in sys_mq_timedsend() -diff --git a/ipc/msg.c b/ipc/msg.c -index 7385de2..06642ac 100644 ---- a/ipc/msg.c -+++ b/ipc/msg.c -@@ -259,12 +259,20 @@ static void expunge_all(struct msg_queue *msq, int res) +Index: linux-stable/ipc/msg.c +=================================================================== +--- linux-stable.orig/ipc/msg.c ++++ linux-stable/ipc/msg.c +@@ -259,12 +259,20 @@ static void expunge_all(struct msg_queue while (tmp != &msq->q_receivers) { struct msg_receiver *msr; @@ -62,7 +62,7 @@ index 7385de2..06642ac 100644 } } -@@ -611,6 +619,12 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) +@@ -611,6 +619,12 @@ static inline int pipelined_send(struct !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) { @@ -75,7 +75,7 @@ index 7385de2..06642ac 100644 list_del(&msr->r_list); if (msr->r_maxsize < msg->m_ts) { msr->r_msg = NULL; -@@ -624,9 +638,11 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg) +@@ -624,9 +638,11 @@ static inline int pipelined_send(struct wake_up_process(msr->r_tsk); smp_mb(); msr->r_msg = msg; diff --git a/debian/patches/features/all/rt/0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch b/debian/patches/features/all/rt/ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch similarity index 63% rename from debian/patches/features/all/rt/0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch rename to debian/patches/features/all/rt/ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch index 135511d9c..cbc2b1a99 100644 --- a/debian/patches/features/all/rt/0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch +++ b/debian/patches/features/all/rt/ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch @@ -1,7 +1,6 @@ -From ef6628d7653c6738f606413c6e3d65877f16a130 Mon Sep 17 00:00:00 2001 +Subject: ipc/mqueue: Add a critical section to avoid a deadlock From: KOBAYASHI Yoshitake Date: Sat, 23 Jul 2011 11:57:36 +0900 -Subject: [104/256] ipc/mqueue: Add a critical section to avoid a deadlock (Repost for v3.0-rt1 and changed the distination addreses) I have tested the following patch on v3.0-rt1 with PREEMPT_RT_FULL. @@ -22,6 +21,7 @@ Description of the problem *. receiver will never wake up and cannot change sender's state to STATE_READY because sender has higher priority + Signed-off-by: Yoshitake Kobayashi Cc: viro@zeniv.linux.org.uk Cc: dchinner@redhat.com @@ -31,32 +31,36 @@ Cc: arnd@arndb.de Link: http://lkml.kernel.org/r/4E2A38A0.1090601@toshiba.co.jp Signed-off-by: Thomas Gleixner --- - ipc/mqueue.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) + ipc/mqueue.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) -diff --git a/ipc/mqueue.c b/ipc/mqueue.c -index dd9e66a..e630272 100644 ---- a/ipc/mqueue.c -+++ b/ipc/mqueue.c -@@ -837,15 +837,19 @@ static inline void pipelined_receive(struct mqueue_inode_info *info) +Index: linux-stable/ipc/mqueue.c +=================================================================== +--- linux-stable.orig/ipc/mqueue.c ++++ linux-stable/ipc/mqueue.c +@@ -936,13 +936,18 @@ static inline void pipelined_receive(str wake_up_interruptible(&info->wait_q); return; } +- if (msg_insert(sender->msg, info)) +- return; +- list_del(&sender->list); +- sender->state = STATE_PENDING; +- wake_up_process(sender->task); +- smp_wmb(); +- sender->state = STATE_READY; + /* + * Keep them in one critical section for PREEMPT_RT: + */ + preempt_disable_rt(); - msg_insert(sender->msg, info); - list_del(&sender->list); - sender->state = STATE_PENDING; - wake_up_process(sender->task); - smp_wmb(); - sender->state = STATE_READY; ++ if (!msg_insert(sender->msg, info)) { ++ list_del(&sender->list); ++ sender->state = STATE_PENDING; ++ wake_up_process(sender->task); ++ smp_wmb(); ++ sender->state = STATE_READY; ++ } + preempt_enable_rt(); } -- --SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, -+ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, - size_t, msg_len, unsigned int, msg_prio, - const struct timespec __user *, u_abs_timeout) - { + + SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, diff --git a/debian/patches/features/all/rt/0228-ipc-sem-Rework-semaphore-wakeups.patch b/debian/patches/features/all/rt/ipc-sem-rework-semaphore-wakeups.patch similarity index 74% rename from debian/patches/features/all/rt/0228-ipc-sem-Rework-semaphore-wakeups.patch rename to debian/patches/features/all/rt/ipc-sem-rework-semaphore-wakeups.patch index 2065a7791..0c6abe61d 100644 --- a/debian/patches/features/all/rt/0228-ipc-sem-Rework-semaphore-wakeups.patch +++ b/debian/patches/features/all/rt/ipc-sem-rework-semaphore-wakeups.patch @@ -1,7 +1,10 @@ -From 8654f9ddc402aa902c8573788ca744c0f602c7b7 Mon Sep 17 00:00:00 2001 +Subject: ipc/sem: Rework semaphore wakeups +From: Peter Zijlstra +Date: Wed, 14 Sep 2011 11:57:04 +0200 + +Subject: ipc/sem: Rework semaphore wakeups From: Peter Zijlstra -Date: Tue, 13 Sep 2011 15:09:40 +0200 -Subject: [228/256] ipc/sem: Rework semaphore wakeups +Date: Tue Sep 13 15:09:40 CEST 2011 Current sysv sems have a weird ass wakeup scheme that involves keeping preemption disabled over a potential O(n^2) loop and busy waiting on @@ -28,10 +31,10 @@ Signed-off-by: Thomas Gleixner ipc/sem.c | 10 ++++++++++ 1 file changed, 10 insertions(+) -diff --git a/ipc/sem.c b/ipc/sem.c -index 5215a81..5eaf684 100644 ---- a/ipc/sem.c -+++ b/ipc/sem.c +Index: linux-stable/ipc/sem.c +=================================================================== +--- linux-stable.orig/ipc/sem.c ++++ linux-stable/ipc/sem.c @@ -461,6 +461,13 @@ undo: static void wake_up_sem_queue_prepare(struct list_head *pt, struct sem_queue *q, int error) @@ -46,7 +49,7 @@ index 5215a81..5eaf684 100644 if (list_empty(pt)) { /* * Hold preempt off so that we don't get preempted and have the -@@ -472,6 +479,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt, +@@ -472,6 +479,7 @@ static void wake_up_sem_queue_prepare(st q->pid = error; list_add_tail(&q->simple_list, pt); @@ -54,7 +57,7 @@ index 5215a81..5eaf684 100644 } /** -@@ -485,6 +493,7 @@ static void wake_up_sem_queue_prepare(struct list_head *pt, +@@ -485,6 +493,7 @@ static void wake_up_sem_queue_prepare(st */ static void wake_up_sem_queue_do(struct list_head *pt) { @@ -62,7 +65,7 @@ index 5215a81..5eaf684 100644 struct sem_queue *q, *t; int did_something; -@@ -497,6 +506,7 @@ static void wake_up_sem_queue_do(struct list_head *pt) +@@ -497,6 +506,7 @@ static void wake_up_sem_queue_do(struct } if (did_something) preempt_enable(); diff --git a/debian/patches/features/all/rt/0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch b/debian/patches/features/all/rt/irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch similarity index 73% rename from debian/patches/features/all/rt/0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch rename to debian/patches/features/all/rt/irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch index ca375f67d..ba7fb0a28 100644 --- a/debian/patches/features/all/rt/0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch +++ b/debian/patches/features/all/rt/irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch @@ -1,8 +1,6 @@ -From 0d4fd56e30a154612e0fee6b73a182ec739d8086 Mon Sep 17 00:00:00 2001 +Subject: genirq: Allow disabling of softirq processing in irq thread context From: Thomas Gleixner Date: Tue, 31 Jan 2012 13:01:27 +0100 -Subject: [168/256] genirq: Allow disabling of softirq processing in irq - thread context The processing of softirqs in irq thread context is a performance gain for the non-rt workloads of a system, but it's counterproductive for @@ -20,19 +18,19 @@ Cc: stable-rt@vger.kernel.org kernel/softirq.c | 7 +++++++ 5 files changed, 37 insertions(+), 2 deletions(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index be33625..773dbc9 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -59,6 +59,7 @@ +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -58,6 +58,7 @@ * IRQF_NO_THREAD - Interrupt cannot be threaded * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device * resume time. + * IRQF_NO_SOFTIRQ_CALL - Do not process softirqs in the irq thread context (RT) */ #define IRQF_DISABLED 0x00000020 - #define IRQF_SAMPLE_RANDOM 0x00000040 -@@ -73,6 +74,7 @@ + #define IRQF_SHARED 0x00000080 +@@ -71,6 +72,7 @@ #define IRQF_FORCE_RESUME 0x00008000 #define IRQF_NO_THREAD 0x00010000 #define IRQF_EARLY_RESUME 0x00020000 @@ -40,11 +38,11 @@ index be33625..773dbc9 100644 #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) -diff --git a/include/linux/irq.h b/include/linux/irq.h -index b27cfcf..496fa99 100644 ---- a/include/linux/irq.h -+++ b/include/linux/irq.h -@@ -73,6 +73,7 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data); +Index: linux-stable/include/linux/irq.h +=================================================================== +--- linux-stable.orig/include/linux/irq.h ++++ linux-stable/include/linux/irq.h +@@ -73,6 +73,7 @@ typedef void (*irq_preflow_handler_t)(st * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context * IRQ_NESTED_TRHEAD - Interrupt nests into another thread * IRQ_PER_CPU_DEVID - Dev_id is a per-cpu variable @@ -68,11 +66,11 @@ index b27cfcf..496fa99 100644 #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 975b3a1..cd4eb0a 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -749,7 +749,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action) +Index: linux-stable/kernel/irq/manage.c +=================================================================== +--- linux-stable.orig/kernel/irq/manage.c ++++ linux-stable/kernel/irq/manage.c +@@ -757,7 +757,15 @@ irq_forced_thread_fn(struct irq_desc *de local_bh_disable(); ret = action->thread_fn(action->irq, action->dev_id); irq_finalize_oneshot(desc, action); @@ -89,7 +87,7 @@ index 975b3a1..cd4eb0a 100644 return ret; } -@@ -1071,6 +1079,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) +@@ -1090,6 +1098,9 @@ __setup_irq(unsigned int irq, struct irq irqd_set(&desc->irq_data, IRQD_NO_BALANCING); } @@ -99,10 +97,10 @@ index 975b3a1..cd4eb0a 100644 /* Set default affinity mask once everything is setup */ setup_affinity(irq, desc, mask); -diff --git a/kernel/irq/settings.h b/kernel/irq/settings.h -index 1162f10..0d2c381 100644 ---- a/kernel/irq/settings.h -+++ b/kernel/irq/settings.h +Index: linux-stable/kernel/irq/settings.h +=================================================================== +--- linux-stable.orig/kernel/irq/settings.h ++++ linux-stable/kernel/irq/settings.h @@ -14,6 +14,7 @@ enum { _IRQ_NO_BALANCING = IRQ_NO_BALANCING, _IRQ_NESTED_THREAD = IRQ_NESTED_THREAD, @@ -119,7 +117,7 @@ index 1162f10..0d2c381 100644 #undef IRQF_MODIFY_MASK #define IRQF_MODIFY_MASK GOT_YOU_MORON -@@ -36,6 +38,16 @@ irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set) +@@ -36,6 +38,16 @@ irq_settings_clr_and_set(struct irq_desc desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK); } @@ -136,11 +134,11 @@ index 1162f10..0d2c381 100644 static inline bool irq_settings_is_per_cpu(struct irq_desc *desc) { return desc->status_use_accessors & _IRQ_PER_CPU; -diff --git a/kernel/softirq.c b/kernel/softirq.c -index aec7d69..35fb713 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -425,6 +425,13 @@ void local_bh_enable_ip(unsigned long ip) +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -434,6 +434,13 @@ void local_bh_enable_ip(unsigned long ip } EXPORT_SYMBOL(local_bh_enable_ip); diff --git a/debian/patches/features/all/rt/0213-jump-label-rt.patch.patch b/debian/patches/features/all/rt/jump-label-rt.patch similarity index 62% rename from debian/patches/features/all/rt/0213-jump-label-rt.patch.patch rename to debian/patches/features/all/rt/jump-label-rt.patch index ec4ad08d4..a1c64388c 100644 --- a/debian/patches/features/all/rt/0213-jump-label-rt.patch.patch +++ b/debian/patches/features/all/rt/jump-label-rt.patch @@ -1,18 +1,17 @@ -From 5ec9a9a754ce7dd17932e66e12a9754c9d14ea28 Mon Sep 17 00:00:00 2001 +Subject: jump-label-rt.patch From: Thomas Gleixner Date: Wed, 13 Jul 2011 11:03:16 +0200 -Subject: [213/256] jump-label-rt.patch Signed-off-by: Thomas Gleixner --- include/linux/jump_label.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h -index c513a40..f47f3e0 100644 ---- a/include/linux/jump_label.h -+++ b/include/linux/jump_label.h -@@ -51,7 +51,8 @@ +Index: linux-stable/include/linux/jump_label.h +=================================================================== +--- linux-stable.orig/include/linux/jump_label.h ++++ linux-stable/include/linux/jump_label.h +@@ -50,7 +50,8 @@ #include #include diff --git a/debian/patches/features/all/rt/0252-kconfig-disable-a-few-options-rt.patch.patch b/debian/patches/features/all/rt/kconfig-disable-a-few-options-rt.patch similarity index 60% rename from debian/patches/features/all/rt/0252-kconfig-disable-a-few-options-rt.patch.patch rename to debian/patches/features/all/rt/kconfig-disable-a-few-options-rt.patch index 9d0c8a3f3..db590c2fe 100644 --- a/debian/patches/features/all/rt/0252-kconfig-disable-a-few-options-rt.patch.patch +++ b/debian/patches/features/all/rt/kconfig-disable-a-few-options-rt.patch @@ -1,7 +1,6 @@ -From 14b8eadbeb7464a5e6b566f75cde75853ad6b528 Mon Sep 17 00:00:00 2001 +Subject: kconfig-disable-a-few-options-rt.patch From: Thomas Gleixner Date: Sun, 24 Jul 2011 12:11:43 +0200 -Subject: [252/256] kconfig-disable-a-few-options-rt.patch Disable stuff which is known to have issues on RT @@ -12,10 +11,10 @@ Signed-off-by: Thomas Gleixner mm/Kconfig | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) -diff --git a/arch/Kconfig b/arch/Kconfig -index 684eb5a..417ff4c 100644 ---- a/arch/Kconfig -+++ b/arch/Kconfig +Index: linux-stable/arch/Kconfig +=================================================================== +--- linux-stable.orig/arch/Kconfig ++++ linux-stable/arch/Kconfig @@ -6,6 +6,7 @@ config OPROFILE tristate "OProfile system profiling" depends on PROFILING @@ -24,11 +23,11 @@ index 684eb5a..417ff4c 100644 select RING_BUFFER select RING_BUFFER_ALLOW_SWAP help -diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig -index b982854..8b53d92 100644 ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -156,6 +156,7 @@ config MACVTAP +Index: linux-stable/drivers/net/Kconfig +=================================================================== +--- linux-stable.orig/drivers/net/Kconfig ++++ linux-stable/drivers/net/Kconfig +@@ -153,6 +153,7 @@ config MACVTAP config NETCONSOLE tristate "Network console logging support" @@ -36,11 +35,11 @@ index b982854..8b53d92 100644 ---help--- If you want to log kernel messages over the network, enable this. See for details. -diff --git a/mm/Kconfig b/mm/Kconfig -index e338407..096f436 100644 ---- a/mm/Kconfig -+++ b/mm/Kconfig -@@ -313,7 +313,7 @@ config NOMMU_INITIAL_TRIM_EXCESS +Index: linux-stable/mm/Kconfig +=================================================================== +--- linux-stable.orig/mm/Kconfig ++++ linux-stable/mm/Kconfig +@@ -318,7 +318,7 @@ config NOMMU_INITIAL_TRIM_EXCESS config TRANSPARENT_HUGEPAGE bool "Transparent Hugepage Support" diff --git a/debian/patches/features/all/rt/0253-kconfig-preempt-rt-full.patch.patch b/debian/patches/features/all/rt/kconfig-preempt-rt-full.patch similarity index 68% rename from debian/patches/features/all/rt/0253-kconfig-preempt-rt-full.patch.patch rename to debian/patches/features/all/rt/kconfig-preempt-rt-full.patch index 4b0f32274..bbeb0987b 100644 --- a/debian/patches/features/all/rt/0253-kconfig-preempt-rt-full.patch.patch +++ b/debian/patches/features/all/rt/kconfig-preempt-rt-full.patch @@ -1,7 +1,6 @@ -From d520488a76082f5f4811de981d57fb52bd6233f2 Mon Sep 17 00:00:00 2001 +Subject: kconfig-preempt-rt-full.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 14:58:57 +0200 -Subject: [253/256] kconfig-preempt-rt-full.patch Signed-off-by: Thomas Gleixner --- @@ -10,20 +9,20 @@ Signed-off-by: Thomas Gleixner scripts/mkcompile_h | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) -diff --git a/init/Makefile b/init/Makefile -index 0bf677a..6b473cd 100644 ---- a/init/Makefile -+++ b/init/Makefile -@@ -29,4 +29,4 @@ silent_chk_compile.h = : +Index: linux-stable/init/Makefile +=================================================================== +--- linux-stable.orig/init/Makefile ++++ linux-stable/init/Makefile +@@ -33,4 +33,4 @@ silent_chk_compile.h = : include/generated/compile.h: FORCE @$($(quiet)chk_compile.h) $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ - "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" + "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)" "$(CC) $(KBUILD_CFLAGS)" -diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt -index 885efbd..c9f006b 100644 ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt +Index: linux-stable/kernel/Kconfig.preempt +=================================================================== +--- linux-stable.orig/kernel/Kconfig.preempt ++++ linux-stable/kernel/Kconfig.preempt @@ -67,6 +67,13 @@ config PREEMPT_RTB enables changes which are preliminary for the full preemptiple RT kernel. @@ -38,10 +37,10 @@ index 885efbd..c9f006b 100644 endchoice config PREEMPT_COUNT -diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h -index f221ddf..5f44009 100755 ---- a/scripts/mkcompile_h -+++ b/scripts/mkcompile_h +Index: linux-stable/scripts/mkcompile_h +=================================================================== +--- linux-stable.orig/scripts/mkcompile_h ++++ linux-stable/scripts/mkcompile_h @@ -4,7 +4,8 @@ TARGET=$1 ARCH=$2 SMP=$3 diff --git a/debian/patches/features/all/rt/0225-kgdb-serial-Short-term-workaround.patch b/debian/patches/features/all/rt/kgb-serial-hackaround.patch similarity index 69% rename from debian/patches/features/all/rt/0225-kgdb-serial-Short-term-workaround.patch rename to debian/patches/features/all/rt/kgb-serial-hackaround.patch index 129ecb5bc..2793aa1fb 100644 --- a/debian/patches/features/all/rt/0225-kgdb-serial-Short-term-workaround.patch +++ b/debian/patches/features/all/rt/kgb-serial-hackaround.patch @@ -1,7 +1,6 @@ -From 0eba936278d1f093cf1b178ab6baff17d4c9fb59 Mon Sep 17 00:00:00 2001 From: Jason Wessel Date: Thu, 28 Jul 2011 12:42:23 -0500 -Subject: [225/256] kgdb/serial: Short term workaround +Subject: kgdb/serial: Short term workaround On 07/27/2011 04:37 PM, Thomas Gleixner wrote: > - KGDB (not yet disabled) is reportedly unusable on -rt right now due @@ -17,16 +16,17 @@ change separation between the console and the HW to have a polled mode Thanks, Jason. + --- drivers/tty/serial/8250/8250.c | 3 ++- include/linux/kdb.h | 2 ++ kernel/debug/kdb/kdb_io.c | 6 ++---- 3 files changed, 6 insertions(+), 5 deletions(-) -diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c -index a785ec0..0db379e 100644 ---- a/drivers/tty/serial/8250/8250.c -+++ b/drivers/tty/serial/8250/8250.c +Index: linux-stable/drivers/tty/serial/8250/8250.c +=================================================================== +--- linux-stable.orig/drivers/tty/serial/8250/8250.c ++++ linux-stable/drivers/tty/serial/8250/8250.c @@ -38,6 +38,7 @@ #include #include @@ -35,7 +35,7 @@ index a785ec0..0db379e 100644 #ifdef CONFIG_SPARC #include #endif -@@ -2817,7 +2818,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count) +@@ -2782,7 +2783,7 @@ serial8250_console_write(struct console touch_nmi_watchdog(); @@ -44,11 +44,11 @@ index a785ec0..0db379e 100644 locked = spin_trylock_irqsave(&port->lock, flags); else spin_lock_irqsave(&port->lock, flags); -diff --git a/include/linux/kdb.h b/include/linux/kdb.h -index 0647258..0d1ebfc 100644 ---- a/include/linux/kdb.h -+++ b/include/linux/kdb.h -@@ -150,12 +150,14 @@ extern int kdb_register(char *, kdb_func_t, char *, char *, short); +Index: linux-stable/include/linux/kdb.h +=================================================================== +--- linux-stable.orig/include/linux/kdb.h ++++ linux-stable/include/linux/kdb.h +@@ -148,12 +148,14 @@ extern int kdb_register(char *, kdb_func extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, short, kdb_repeat_t); extern int kdb_unregister(char *); @@ -63,19 +63,19 @@ index 0647258..0d1ebfc 100644 #endif /* CONFIG_KGDB_KDB */ enum { KDB_NOT_INITIALIZED, -diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c -index bb9520f..eb68a9d 100644 ---- a/kernel/debug/kdb/kdb_io.c -+++ b/kernel/debug/kdb/kdb_io.c -@@ -553,7 +553,6 @@ int vkdb_printf(const char *fmt, va_list ap) - int diag; +Index: linux-stable/kernel/debug/kdb/kdb_io.c +=================================================================== +--- linux-stable.orig/kernel/debug/kdb/kdb_io.c ++++ linux-stable/kernel/debug/kdb/kdb_io.c +@@ -554,7 +554,6 @@ int vkdb_printf(const char *fmt, va_list int linecount; + int colcount; int logging, saved_loglevel = 0; - int saved_trap_printk; int got_printf_lock = 0; int retlen = 0; int fnd, len; -@@ -564,8 +563,6 @@ int vkdb_printf(const char *fmt, va_list ap) +@@ -565,8 +564,6 @@ int vkdb_printf(const char *fmt, va_list unsigned long uninitialized_var(flags); preempt_disable(); @@ -84,7 +84,7 @@ index bb9520f..eb68a9d 100644 /* Serialize kdb_printf if multiple cpus try to write at once. * But if any cpu goes recursive in kdb, just print the output, -@@ -821,7 +818,6 @@ kdb_print_out: +@@ -833,7 +830,6 @@ kdb_print_out: } else { __release(kdb_printf_lock); } @@ -92,7 +92,7 @@ index bb9520f..eb68a9d 100644 preempt_enable(); return retlen; } -@@ -831,9 +827,11 @@ int kdb_printf(const char *fmt, ...) +@@ -843,9 +839,11 @@ int kdb_printf(const char *fmt, ...) va_list ap; int r; diff --git a/debian/patches/features/all/rt/0054-latency-hist.patch.patch b/debian/patches/features/all/rt/latency-hist.patch similarity index 90% rename from debian/patches/features/all/rt/0054-latency-hist.patch.patch rename to debian/patches/features/all/rt/latency-hist.patch index 04fc26f55..43d491526 100644 --- a/debian/patches/features/all/rt/0054-latency-hist.patch.patch +++ b/debian/patches/features/all/rt/latency-hist.patch @@ -1,7 +1,6 @@ -From 99509daf04c5a160ff9db1283595c58cd130ffd1 Mon Sep 17 00:00:00 2001 +Subject: latency-hist.patch From: Carsten Emde Date: Tue, 19 Jul 2011 14:03:41 +0100 -Subject: [054/256] latency-hist.patch This patch provides a recording mechanism to store data of potential sources of system latencies. The recordings separately determine the @@ -12,27 +11,24 @@ filesystem. For details please consult Documentation/trace/histograms.txt. Signed-off-by: Carsten Emde Signed-off-by: Thomas Gleixner ---- - Documentation/trace/histograms.txt | 186 ++++++ - include/linux/sched.h | 6 + - include/trace/events/hist.h | 69 +++ - include/trace/events/latency_hist.h | 30 + - kernel/hrtimer.c | 11 + - kernel/trace/Kconfig | 104 ++++ - kernel/trace/Makefile | 4 + - kernel/trace/latency_hist.c | 1170 +++++++++++++++++++++++++++++++++++ - kernel/trace/trace_irqsoff.c | 11 + - 9 files changed, 1591 insertions(+) - create mode 100644 Documentation/trace/histograms.txt - create mode 100644 include/trace/events/hist.h - create mode 100644 include/trace/events/latency_hist.h - create mode 100644 kernel/trace/latency_hist.c -diff --git a/Documentation/trace/histograms.txt b/Documentation/trace/histograms.txt -new file mode 100644 -index 0000000..6f2aeab +--- + Documentation/trace/histograms.txt | 186 +++++ + include/linux/hrtimer.h | 3 + include/linux/sched.h | 6 + include/trace/events/hist.h | 69 ++ + include/trace/events/latency_hist.h | 30 + kernel/hrtimer.c | 23 + kernel/trace/Kconfig | 104 +++ + kernel/trace/Makefile | 4 + kernel/trace/latency_hist.c | 1176 ++++++++++++++++++++++++++++++++++++ + kernel/trace/trace_irqsoff.c | 11 + 10 files changed, 1612 insertions(+) + +Index: linux-stable/Documentation/trace/histograms.txt +=================================================================== --- /dev/null -+++ b/Documentation/trace/histograms.txt ++++ linux-stable/Documentation/trace/histograms.txt @@ -0,0 +1,186 @@ + Using the Linux Kernel Latency Histograms + @@ -220,28 +216,41 @@ index 0000000..6f2aeab +is provided. + +These data are also reset when the wakeup histogram is reset. -diff --git a/include/linux/sched.h b/include/linux/sched.h -index f14b965..5b63855 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1614,6 +1614,12 @@ struct task_struct { +Index: linux-stable/include/linux/hrtimer.h +=================================================================== +--- linux-stable.orig/include/linux/hrtimer.h ++++ linux-stable/include/linux/hrtimer.h +@@ -111,6 +111,9 @@ struct hrtimer { + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + unsigned long state; ++#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST ++ ktime_t praecox; ++#endif + #ifdef CONFIG_TIMER_STATS + int start_pid; + void *start_site; +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1583,6 +1583,12 @@ struct task_struct { unsigned long trace; /* bitmask and counter of trace recursion */ unsigned long trace_recursion; +#ifdef CONFIG_WAKEUP_LATENCY_HIST + u64 preempt_timestamp_hist; +#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST -+ unsigned long timer_offset; ++ long timer_offset; +#endif +#endif #endif /* CONFIG_TRACING */ - #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */ + #ifdef CONFIG_MEMCG /* memcg uses this to do batch job */ struct memcg_batch_info { -diff --git a/include/trace/events/hist.h b/include/trace/events/hist.h -new file mode 100644 -index 0000000..28646db +Index: linux-stable/include/trace/events/hist.h +=================================================================== --- /dev/null -+++ b/include/trace/events/hist.h ++++ linux-stable/include/trace/events/hist.h @@ -0,0 +1,69 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hist @@ -312,12 +321,11 @@ index 0000000..28646db + +/* This part must be outside protection */ +#include -diff --git a/include/trace/events/latency_hist.h b/include/trace/events/latency_hist.h -new file mode 100644 -index 0000000..d6b5d77 +Index: linux-stable/include/trace/events/latency_hist.h +=================================================================== --- /dev/null -+++ b/include/trace/events/latency_hist.h -@@ -0,0 +1,30 @@ ++++ linux-stable/include/trace/events/latency_hist.h +@@ -0,0 +1,29 @@ +#ifndef _LATENCY_HIST_H +#define _LATENCY_HIST_H + @@ -347,11 +355,10 @@ index 0000000..d6b5d77 +} + +#endif /* _LATENCY_HIST_H */ -+ -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index ae34bf5..1a3695e 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c @@ -49,6 +49,7 @@ #include @@ -360,7 +367,25 @@ index ae34bf5..1a3695e 100644 /* * The timer bases: -@@ -1236,6 +1237,8 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now) +@@ -983,6 +984,17 @@ int __hrtimer_start_range_ns(struct hrti + #endif + } + ++#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST ++ { ++ ktime_t now = new_base->get_time(); ++ ++ if (ktime_to_ns(tim) < ktime_to_ns(now)) ++ timer->praecox = now; ++ else ++ timer->praecox = ktime_set(0, 0); ++ } ++#endif ++ + hrtimer_set_expires_range_ns(timer, tim, delta_ns); + + timer_stats_hrtimer_set_start_info(timer); +@@ -1246,6 +1258,8 @@ static void __run_hrtimer(struct hrtimer #ifdef CONFIG_HIGH_RES_TIMERS @@ -369,13 +394,14 @@ index ae34bf5..1a3695e 100644 /* * High resolution timer interrupt * Called with interrupts disabled -@@ -1280,6 +1283,14 @@ retry: +@@ -1289,6 +1303,15 @@ retry: timer = container_of(node, struct hrtimer, node); + trace_hrtimer_interrupt(raw_smp_processor_id(), -+ ktime_to_ns(ktime_sub( -+ hrtimer_get_expires(timer), basenow)), ++ ktime_to_ns(ktime_sub(ktime_to_ns(timer->praecox) ? ++ timer->praecox : hrtimer_get_expires(timer), ++ basenow)), + current, + timer->function == hrtimer_wakeup ? + container_of(timer, struct hrtimer_sleeper, @@ -384,11 +410,11 @@ index ae34bf5..1a3695e 100644 /* * The immediate goal for using the softexpires is * minimizing wakeups, not running timers at the -diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig -index a1d2849..23c737e 100644 ---- a/kernel/trace/Kconfig -+++ b/kernel/trace/Kconfig -@@ -192,6 +192,24 @@ config IRQSOFF_TRACER +Index: linux-stable/kernel/trace/Kconfig +=================================================================== +--- linux-stable.orig/kernel/trace/Kconfig ++++ linux-stable/kernel/trace/Kconfig +@@ -191,6 +191,24 @@ config IRQSOFF_TRACER enabled. This option and the preempt-off timing option can be used together or separately.) @@ -413,7 +439,7 @@ index a1d2849..23c737e 100644 config PREEMPT_TRACER bool "Preemption-off Latency Tracer" default n -@@ -214,6 +232,24 @@ config PREEMPT_TRACER +@@ -213,6 +231,24 @@ config PREEMPT_TRACER enabled. This option and the irqs-off timing option can be used together or separately.) @@ -438,7 +464,7 @@ index a1d2849..23c737e 100644 config SCHED_TRACER bool "Scheduling Latency Tracer" select GENERIC_TRACER -@@ -223,6 +259,74 @@ config SCHED_TRACER +@@ -222,6 +258,74 @@ config SCHED_TRACER This tracer tracks the latency of the highest priority task to be scheduled in, starting from the point it has woken up. @@ -513,11 +539,11 @@ index a1d2849..23c737e 100644 config ENABLE_DEFAULT_TRACERS bool "Trace process context switches and events" depends on !GENERIC_TRACER -diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile -index 5f39a07..108a387 100644 ---- a/kernel/trace/Makefile -+++ b/kernel/trace/Makefile -@@ -36,6 +36,10 @@ obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o +Index: linux-stable/kernel/trace/Makefile +=================================================================== +--- linux-stable.orig/kernel/trace/Makefile ++++ linux-stable/kernel/trace/Makefile +@@ -36,6 +36,10 @@ obj-$(CONFIG_FUNCTION_TRACER) += trace_f obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o obj-$(CONFIG_SCHED_TRACER) += trace_sched_wakeup.o @@ -528,12 +554,11 @@ index 5f39a07..108a387 100644 obj-$(CONFIG_NOP_TRACER) += trace_nop.o obj-$(CONFIG_STACK_TRACER) += trace_stack.o obj-$(CONFIG_MMIOTRACE) += trace_mmiotrace.o -diff --git a/kernel/trace/latency_hist.c b/kernel/trace/latency_hist.c -new file mode 100644 -index 0000000..9d49fcb +Index: linux-stable/kernel/trace/latency_hist.c +=================================================================== --- /dev/null -+++ b/kernel/trace/latency_hist.c -@@ -0,0 +1,1170 @@ ++++ linux-stable/kernel/trace/latency_hist.c +@@ -0,0 +1,1176 @@ +/* + * kernel/trace/latency_hist.c + * @@ -563,6 +588,8 @@ index 0000000..9d49fcb +#include "trace.h" +#include + ++#define NSECS_PER_USECS 1000L ++ +#define CREATE_TRACE_POINTS +#include + @@ -582,11 +609,11 @@ index 0000000..9d49fcb +struct hist_data { + atomic_t hist_mode; /* 0 log, 1 don't log */ + long offset; /* set it to MAX_ENTRY_NUM/2 for a bipolar scale */ -+ unsigned long min_lat; -+ unsigned long max_lat; ++ long min_lat; ++ long max_lat; + unsigned long long below_hist_bound_samples; + unsigned long long above_hist_bound_samples; -+ unsigned long long accumulate_lat; ++ long long accumulate_lat; + unsigned long long total_samples; + unsigned long long hist_array[MAX_ENTRY_NUM]; +}; @@ -688,8 +715,8 @@ index 0000000..9d49fcb +static DEFINE_PER_CPU(struct maxlatproc_data, timerandwakeup_maxlatproc); +#endif + -+void notrace latency_hist(int latency_type, int cpu, unsigned long latency, -+ unsigned long timeroffset, cycle_t stop, ++void notrace latency_hist(int latency_type, int cpu, long latency, ++ long timeroffset, cycle_t stop, + struct task_struct *p) +{ + struct hist_data *my_hist; @@ -760,7 +787,7 @@ index 0000000..9d49fcb + my_hist->hist_array[latency]++; + + if (unlikely(latency > my_hist->max_lat || -+ my_hist->min_lat == ULONG_MAX)) { ++ my_hist->min_lat == LONG_MAX)) { +#if defined(CONFIG_WAKEUP_LATENCY_HIST) || \ + defined(CONFIG_MISSED_TIMER_OFFSETS_HIST) + if (latency_type == WAKEUP_LATENCY || @@ -799,15 +826,14 @@ index 0000000..9d49fcb + atomic_dec(&my_hist->hist_mode); + + if (likely(my_hist->total_samples)) { -+ unsigned long avg = (unsigned long) -+ div64_u64(my_hist->accumulate_lat, ++ long avg = (long) div64_s64(my_hist->accumulate_lat, + my_hist->total_samples); + snprintf(minstr, sizeof(minstr), "%ld", -+ (long) my_hist->min_lat - my_hist->offset); ++ my_hist->min_lat - my_hist->offset); + snprintf(avgstr, sizeof(avgstr), "%ld", -+ (long) avg - my_hist->offset); ++ avg - my_hist->offset); + snprintf(maxstr, sizeof(maxstr), "%ld", -+ (long) my_hist->max_lat - my_hist->offset); ++ my_hist->max_lat - my_hist->offset); + } else { + strcpy(minstr, ""); + strcpy(avgstr, minstr); @@ -912,10 +938,10 @@ index 0000000..9d49fcb + memset(hist->hist_array, 0, sizeof(hist->hist_array)); + hist->below_hist_bound_samples = 0ULL; + hist->above_hist_bound_samples = 0ULL; -+ hist->min_lat = ULONG_MAX; -+ hist->max_lat = 0UL; ++ hist->min_lat = LONG_MAX; ++ hist->max_lat = LONG_MIN; + hist->total_samples = 0ULL; -+ hist->accumulate_lat = 0ULL; ++ hist->accumulate_lat = 0LL; + + atomic_inc(&hist->hist_mode); +} @@ -1326,9 +1352,9 @@ index 0000000..9d49fcb + + stop = ftrace_now(cpu); + time_set++; -+ if (start && stop >= start) { -+ unsigned long latency = -+ nsecs_to_usecs(stop - start); ++ if (start) { ++ long latency = ((long) (stop - start)) / ++ NSECS_PER_USECS; + + latency_hist(IRQSOFF_LATENCY, cpu, latency, 0, + stop, NULL); @@ -1344,9 +1370,9 @@ index 0000000..9d49fcb + + if (!(time_set++)) + stop = ftrace_now(cpu); -+ if (start && stop >= start) { -+ unsigned long latency = -+ nsecs_to_usecs(stop - start); ++ if (start) { ++ long latency = ((long) (stop - start)) / ++ NSECS_PER_USECS; + + latency_hist(PREEMPTOFF_LATENCY, cpu, latency, + 0, stop, NULL); @@ -1363,9 +1389,10 @@ index 0000000..9d49fcb + + if (!time_set) + stop = ftrace_now(cpu); -+ if (start && stop >= start) { -+ unsigned long latency = -+ nsecs_to_usecs(stop - start); ++ if (start) { ++ long latency = ((long) (stop - start)) / ++ NSECS_PER_USECS; ++ + latency_hist(PREEMPTIRQSOFF_LATENCY, cpu, + latency, 0, stop, NULL); + } @@ -1444,7 +1471,7 @@ index 0000000..9d49fcb +{ + unsigned long flags; + int cpu = task_cpu(next); -+ unsigned long latency; ++ long latency; + cycle_t stop; + struct task_struct *cpu_wakeup_task; + @@ -1469,13 +1496,17 @@ index 0000000..9d49fcb + goto out; + } + ++ if (current->prio == cpu_wakeup_task->prio) ++ per_cpu(wakeup_sharedprio, cpu) = 1; ++ + /* + * The task we are waiting for is about to be switched to. + * Calculate latency and store it in histogram. + */ + stop = ftrace_now(raw_smp_processor_id()); + -+ latency = nsecs_to_usecs(stop - next->preempt_timestamp_hist); ++ latency = ((long) (stop - next->preempt_timestamp_hist)) / ++ NSECS_PER_USECS; + + if (per_cpu(wakeup_sharedprio, cpu)) { + latency_hist(WAKEUP_LATENCY_SHAREDPRIO, cpu, latency, 0, stop, @@ -1511,7 +1542,7 @@ index 0000000..9d49fcb + (task->prio < curr->prio || + (task->prio == curr->prio && + !cpumask_test_cpu(cpu, &task->cpus_allowed)))) { -+ unsigned long latency; ++ long latency; + cycle_t now; + + if (missed_timer_offsets_pid) { @@ -1521,7 +1552,7 @@ index 0000000..9d49fcb + } + + now = ftrace_now(cpu); -+ latency = (unsigned long) div_s64(-latency_ns, 1000); ++ latency = (long) div_s64(-latency_ns, NSECS_PER_USECS); + latency_hist(MISSED_TIMER_OFFSETS, cpu, latency, latency, now, + task); +#ifdef CONFIG_WAKEUP_LATENCY_HIST @@ -1562,7 +1593,7 @@ index 0000000..9d49fcb + &per_cpu(irqsoff_hist, i), &latency_hist_fops); + my_hist = &per_cpu(irqsoff_hist, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + } + entry = debugfs_create_file("reset", 0644, dentry, + (void *)IRQSOFF_LATENCY, &latency_hist_reset_fops); @@ -1577,7 +1608,7 @@ index 0000000..9d49fcb + &per_cpu(preemptoff_hist, i), &latency_hist_fops); + my_hist = &per_cpu(preemptoff_hist, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + } + entry = debugfs_create_file("reset", 0644, dentry, + (void *)PREEMPTOFF_LATENCY, &latency_hist_reset_fops); @@ -1592,7 +1623,7 @@ index 0000000..9d49fcb + &per_cpu(preemptirqsoff_hist, i), &latency_hist_fops); + my_hist = &per_cpu(preemptirqsoff_hist, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + } + entry = debugfs_create_file("reset", 0644, dentry, + (void *)PREEMPTIRQSOFF_LATENCY, &latency_hist_reset_fops); @@ -1617,14 +1648,14 @@ index 0000000..9d49fcb + &latency_hist_fops); + my_hist = &per_cpu(wakeup_latency_hist, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + + entry = debugfs_create_file(name, 0444, dentry_sharedprio, + &per_cpu(wakeup_latency_hist_sharedprio, i), + &latency_hist_fops); + my_hist = &per_cpu(wakeup_latency_hist_sharedprio, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + + sprintf(name, cpufmt_maxlatproc, i); + @@ -1658,7 +1689,7 @@ index 0000000..9d49fcb + &per_cpu(missed_timer_offsets, i), &latency_hist_fops); + my_hist = &per_cpu(missed_timer_offsets, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + + sprintf(name, cpufmt_maxlatproc, i); + mp = &per_cpu(missed_timer_offsets_maxlatproc, i); @@ -1686,7 +1717,7 @@ index 0000000..9d49fcb + &latency_hist_fops); + my_hist = &per_cpu(timerandwakeup_latency_hist, i); + atomic_set(&my_hist->hist_mode, 1); -+ my_hist->min_lat = 0xFFFFFFFFUL; ++ my_hist->min_lat = LONG_MAX; + + sprintf(name, cpufmt_maxlatproc, i); + mp = &per_cpu(timerandwakeup_maxlatproc, i); @@ -1704,10 +1735,10 @@ index 0000000..9d49fcb +} + +__initcall(latency_hist_init); -diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c -index 99d20e9..384f603 100644 ---- a/kernel/trace/trace_irqsoff.c -+++ b/kernel/trace/trace_irqsoff.c +Index: linux-stable/kernel/trace/trace_irqsoff.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace_irqsoff.c ++++ linux-stable/kernel/trace/trace_irqsoff.c @@ -17,6 +17,7 @@ #include @@ -1730,7 +1761,7 @@ index 99d20e9..384f603 100644 if (preempt_trace() || irq_trace()) stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1); } -@@ -451,6 +454,7 @@ EXPORT_SYMBOL_GPL(stop_critical_timings); +@@ -451,6 +454,7 @@ EXPORT_SYMBOL_GPL(stop_critical_timings) #ifdef CONFIG_PROVE_LOCKING void time_hardirqs_on(unsigned long a0, unsigned long a1) { @@ -1738,7 +1769,7 @@ index 99d20e9..384f603 100644 if (!preempt_trace() && irq_trace()) stop_critical_timing(a0, a1); } -@@ -459,6 +463,7 @@ void time_hardirqs_off(unsigned long a0, unsigned long a1) +@@ -459,6 +463,7 @@ void time_hardirqs_off(unsigned long a0, { if (!preempt_trace() && irq_trace()) start_critical_timing(a0, a1); @@ -1746,7 +1777,7 @@ index 99d20e9..384f603 100644 } #else /* !CONFIG_PROVE_LOCKING */ -@@ -484,6 +489,7 @@ inline void print_irqtrace_events(struct task_struct *curr) +@@ -484,6 +489,7 @@ inline void print_irqtrace_events(struct */ void trace_hardirqs_on(void) { @@ -1768,7 +1799,7 @@ index 99d20e9..384f603 100644 if (!preempt_trace() && irq_trace()) stop_critical_timing(CALLER_ADDR0, caller_addr); } -@@ -507,6 +515,7 @@ void trace_hardirqs_off_caller(unsigned long caller_addr) +@@ -507,6 +515,7 @@ void trace_hardirqs_off_caller(unsigned { if (!preempt_trace() && irq_trace()) start_critical_timing(CALLER_ADDR0, caller_addr); @@ -1776,7 +1807,7 @@ index 99d20e9..384f603 100644 } EXPORT_SYMBOL(trace_hardirqs_off_caller); -@@ -516,12 +525,14 @@ EXPORT_SYMBOL(trace_hardirqs_off_caller); +@@ -516,12 +525,14 @@ EXPORT_SYMBOL(trace_hardirqs_off_caller) #ifdef CONFIG_PREEMPT_TRACER void trace_preempt_on(unsigned long a0, unsigned long a1) { diff --git a/debian/patches/features/all/rt/lglocks-rt.patch b/debian/patches/features/all/rt/lglocks-rt.patch new file mode 100644 index 000000000..9f1969642 --- /dev/null +++ b/debian/patches/features/all/rt/lglocks-rt.patch @@ -0,0 +1,168 @@ +Subject: lglocks-rt.patch +From: Thomas Gleixner +Date: Wed, 15 Jun 2011 11:02:21 +0200 + +Signed-off-by: Thomas Gleixner +--- + include/linux/lglock.h | 13 ++++++++++- + kernel/lglock.c | 54 ++++++++++++++++++++++++++++++++----------------- + 2 files changed, 48 insertions(+), 19 deletions(-) + +Index: linux-stable/include/linux/lglock.h +=================================================================== +--- linux-stable.orig/include/linux/lglock.h ++++ linux-stable/include/linux/lglock.h +@@ -49,18 +49,29 @@ + #endif + + struct lglock { ++#ifndef CONFIG_PREEMPT_RT_FULL + arch_spinlock_t __percpu *lock; ++#else ++ struct rt_mutex __percpu *lock; ++#endif + #ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lock_class_key lock_key; + struct lockdep_map lock_dep_map; + #endif + }; + +-#define DEFINE_LGLOCK(name) \ ++#ifndef CONFIG_PREEMPT_RT_FULL ++# define DEFINE_LGLOCK(name) \ + DEFINE_LGLOCK_LOCKDEP(name); \ + DEFINE_PER_CPU(arch_spinlock_t, name ## _lock) \ + = __ARCH_SPIN_LOCK_UNLOCKED; \ + struct lglock name = { .lock = &name ## _lock } ++#else ++# define DEFINE_LGLOCK(name) \ ++ DEFINE_LGLOCK_LOCKDEP(name); \ ++ DEFINE_PER_CPU(struct rt_mutex, name ## _lock); \ ++ struct lglock name = { .lock = &name ## _lock } ++#endif + + void lg_lock_init(struct lglock *lg, char *name); + void lg_local_lock(struct lglock *lg); +Index: linux-stable/kernel/lglock.c +=================================================================== +--- linux-stable.orig/kernel/lglock.c ++++ linux-stable/kernel/lglock.c +@@ -4,6 +4,15 @@ + #include + #include + ++#ifndef CONFIG_PREEMPT_RT_FULL ++# define lg_lock_ptr arch_spinlock_t ++# define lg_do_lock(l) arch_spin_lock(l) ++# define lg_do_unlock(l) arch_spin_unlock(l) ++#else ++# define lg_lock_ptr struct rt_mutex ++# define lg_do_lock(l) __rt_spin_lock(l) ++# define lg_do_unlock(l) __rt_spin_unlock(l) ++#endif + /* + * Note there is no uninit, so lglocks cannot be defined in + * modules (but it's fine to use them from there) +@@ -12,51 +21,60 @@ + + void lg_lock_init(struct lglock *lg, char *name) + { ++#ifdef CONFIG_PREEMPT_RT_FULL ++ int i; ++ ++ for_each_possible_cpu(i) { ++ struct rt_mutex *lock = per_cpu_ptr(lg->lock, i); ++ ++ rt_mutex_init(lock); ++ } ++#endif + LOCKDEP_INIT_MAP(&lg->lock_dep_map, name, &lg->lock_key, 0); + } + EXPORT_SYMBOL(lg_lock_init); + + void lg_local_lock(struct lglock *lg) + { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + +- preempt_disable(); ++ migrate_disable(); + rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_); + lock = this_cpu_ptr(lg->lock); +- arch_spin_lock(lock); ++ lg_do_lock(lock); + } + EXPORT_SYMBOL(lg_local_lock); + + void lg_local_unlock(struct lglock *lg) + { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + + rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); + lock = this_cpu_ptr(lg->lock); +- arch_spin_unlock(lock); +- preempt_enable(); ++ lg_do_unlock(lock); ++ migrate_enable(); + } + EXPORT_SYMBOL(lg_local_unlock); + + void lg_local_lock_cpu(struct lglock *lg, int cpu) + { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + +- preempt_disable(); ++ preempt_disable_nort(); + rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_); + lock = per_cpu_ptr(lg->lock, cpu); +- arch_spin_lock(lock); ++ lg_do_lock(lock); + } + EXPORT_SYMBOL(lg_local_lock_cpu); + + void lg_local_unlock_cpu(struct lglock *lg, int cpu) + { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + + rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); + lock = per_cpu_ptr(lg->lock, cpu); +- arch_spin_unlock(lock); +- preempt_enable(); ++ lg_do_unlock(lock); ++ preempt_enable_nort(); + } + EXPORT_SYMBOL(lg_local_unlock_cpu); + +@@ -64,12 +82,12 @@ void lg_global_lock(struct lglock *lg) + { + int i; + +- preempt_disable(); ++ preempt_disable_nort(); + rwlock_acquire(&lg->lock_dep_map, 0, 0, _RET_IP_); + for_each_possible_cpu(i) { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + lock = per_cpu_ptr(lg->lock, i); +- arch_spin_lock(lock); ++ lg_do_lock(lock); + } + } + EXPORT_SYMBOL(lg_global_lock); +@@ -80,10 +98,10 @@ void lg_global_unlock(struct lglock *lg) + + rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); + for_each_possible_cpu(i) { +- arch_spinlock_t *lock; ++ lg_lock_ptr *lock; + lock = per_cpu_ptr(lg->lock, i); +- arch_spin_unlock(lock); ++ lg_do_unlock(lock); + } +- preempt_enable(); ++ preempt_enable_nort(); + } + EXPORT_SYMBOL(lg_global_unlock); diff --git a/debian/patches/features/all/rt/0042-list-add-list-last-entry.patch.patch b/debian/patches/features/all/rt/list-add-list-last-entry.patch similarity index 68% rename from debian/patches/features/all/rt/0042-list-add-list-last-entry.patch.patch rename to debian/patches/features/all/rt/list-add-list-last-entry.patch index b95c692a0..173928146 100644 --- a/debian/patches/features/all/rt/0042-list-add-list-last-entry.patch.patch +++ b/debian/patches/features/all/rt/list-add-list-last-entry.patch @@ -1,18 +1,17 @@ -From 94ad3dcec7e5a27500e28453ff4e56f36d0b7f59 Mon Sep 17 00:00:00 2001 +Subject: list-add-list-last-entry.patch From: Peter Zijlstra Date: Tue, 21 Jun 2011 11:22:36 +0200 -Subject: [042/256] list-add-list-last-entry.patch Signed-off-by: Thomas Gleixner --- include/linux/list.h | 11 +++++++++++ 1 file changed, 11 insertions(+) -diff --git a/include/linux/list.h b/include/linux/list.h -index cc6d2aa..7a9851b 100644 ---- a/include/linux/list.h -+++ b/include/linux/list.h -@@ -362,6 +362,17 @@ static inline void list_splice_tail_init(struct list_head *list, +Index: linux-stable/include/linux/list.h +=================================================================== +--- linux-stable.orig/include/linux/list.h ++++ linux-stable/include/linux/list.h +@@ -362,6 +362,17 @@ static inline void list_splice_tail_init list_entry((ptr)->next, type, member) /** diff --git a/debian/patches/features/all/rt/0062-rt-local_irq_-variants-depending-on-RT-RT.patch b/debian/patches/features/all/rt/local-irq-rt-depending-variants.patch similarity index 74% rename from debian/patches/features/all/rt/0062-rt-local_irq_-variants-depending-on-RT-RT.patch rename to debian/patches/features/all/rt/local-irq-rt-depending-variants.patch index 8d9762e83..406559fcf 100644 --- a/debian/patches/features/all/rt/0062-rt-local_irq_-variants-depending-on-RT-RT.patch +++ b/debian/patches/features/all/rt/local-irq-rt-depending-variants.patch @@ -1,23 +1,23 @@ -From cdee38a4db2ab8e78e70a2e7fab7a381e9a1c19b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 21 Jul 2009 22:34:14 +0200 -Subject: [062/256] rt: local_irq_* variants depending on RT/!RT +Subject: rt: local_irq_* variants depending on RT/!RT Add local_irq_*_(no)rt variant which are mainly used to break interrupt disabled sections on PREEMPT_RT or to explicitely disable interrupts on PREEMPT_RT. Signed-off-by: Thomas Gleixner + --- include/linux/interrupt.h | 2 +- include/linux/irqflags.h | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 02c3c4f..d2cc272 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -217,7 +217,7 @@ extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -211,7 +211,7 @@ extern void devm_free_irq(struct device #ifdef CONFIG_LOCKDEP # define local_irq_enable_in_hardirq() do { } while (0) #else @@ -26,10 +26,10 @@ index 02c3c4f..d2cc272 100644 #endif extern void disable_irq_nosync(unsigned int irq); -diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h -index d176d65..37b13c4 100644 ---- a/include/linux/irqflags.h -+++ b/include/linux/irqflags.h +Index: linux-stable/include/linux/irqflags.h +=================================================================== +--- linux-stable.orig/include/linux/irqflags.h ++++ linux-stable/include/linux/irqflags.h @@ -147,4 +147,23 @@ #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ diff --git a/debian/patches/features/all/rt/0087-local-var.patch.patch b/debian/patches/features/all/rt/local-var.patch similarity index 69% rename from debian/patches/features/all/rt/0087-local-var.patch.patch rename to debian/patches/features/all/rt/local-var.patch index 92f303005..f4496db27 100644 --- a/debian/patches/features/all/rt/0087-local-var.patch.patch +++ b/debian/patches/features/all/rt/local-var.patch @@ -1,17 +1,16 @@ -From 837bb14712ddecfcbb5f97570c5f1fac911f487c Mon Sep 17 00:00:00 2001 +Subject: local-var.patch From: Thomas Gleixner Date: Fri, 24 Jun 2011 18:40:37 +0200 -Subject: [087/256] local-var.patch Signed-off-by: Thomas Gleixner --- include/linux/percpu.h | 5 +++++ 1 file changed, 5 insertions(+) -diff --git a/include/linux/percpu.h b/include/linux/percpu.h -index 21638ae..3d13ce0 100644 ---- a/include/linux/percpu.h -+++ b/include/linux/percpu.h +Index: linux-stable/include/linux/percpu.h +=================================================================== +--- linux-stable.orig/include/linux/percpu.h ++++ linux-stable/include/linux/percpu.h @@ -48,6 +48,11 @@ preempt_enable(); \ } while (0) diff --git a/debian/patches/features/all/rt/0169-local-vars-migrate-disable.patch.patch b/debian/patches/features/all/rt/local-vars-migrate-disable.patch similarity index 81% rename from debian/patches/features/all/rt/0169-local-vars-migrate-disable.patch.patch rename to debian/patches/features/all/rt/local-vars-migrate-disable.patch index 62337179d..99f6827a3 100644 --- a/debian/patches/features/all/rt/0169-local-vars-migrate-disable.patch.patch +++ b/debian/patches/features/all/rt/local-vars-migrate-disable.patch @@ -1,17 +1,16 @@ -From 33500c174f6780a82e62ac6067e4590e0206cdb5 Mon Sep 17 00:00:00 2001 +Subject: local-vars-migrate-disable.patch From: Thomas Gleixner Date: Tue, 28 Jun 2011 20:42:16 +0200 -Subject: [169/256] local-vars-migrate-disable.patch Signed-off-by: Thomas Gleixner --- include/linux/percpu.h | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) -diff --git a/include/linux/percpu.h b/include/linux/percpu.h -index 3d13ce0..5a56f183 100644 ---- a/include/linux/percpu.h -+++ b/include/linux/percpu.h +Index: linux-stable/include/linux/percpu.h +=================================================================== +--- linux-stable.orig/include/linux/percpu.h ++++ linux-stable/include/linux/percpu.h @@ -48,10 +48,30 @@ preempt_enable(); \ } while (0) diff --git a/debian/patches/features/all/rt/0056-localversion.patch.patch b/debian/patches/features/all/rt/localversion.patch similarity index 51% rename from debian/patches/features/all/rt/0056-localversion.patch.patch rename to debian/patches/features/all/rt/localversion.patch index a215dee4b..04bbef2a4 100644 --- a/debian/patches/features/all/rt/0056-localversion.patch.patch +++ b/debian/patches/features/all/rt/localversion.patch @@ -1,7 +1,6 @@ -From baf31d140dfceb0b856805d9b715efddc084054d Mon Sep 17 00:00:00 2001 +Subject: localversion.patch From: Thomas Gleixner -Date: Fri, 8 Jul 2011 20:25:16 +0200 -Subject: [056/256] localversion.patch +Date: Fri, 08 Jul 2011 20:25:16 +0200 Signed-off-by: Thomas Gleixner Signed-off-by: Peter Zijlstra @@ -9,12 +8,10 @@ Link: http://lkml.kernel.org/n/tip-8vdw4bfcsds27cvox6rpb334@git.kernel.org --- localversion-rt | 1 + 1 file changed, 1 insertion(+) - create mode 100644 localversion-rt -diff --git a/localversion-rt b/localversion-rt -new file mode 100644 -index 0000000..700c857 +Index: linux-stable/localversion-rt +=================================================================== --- /dev/null -+++ b/localversion-rt ++++ linux-stable/localversion-rt @@ -0,0 +1 @@ -+-rt8 ++-rt6 diff --git a/debian/patches/features/all/rt/0159-lockdep-rt.patch.patch b/debian/patches/features/all/rt/lockdep-no-softirq-accounting-on-rt.patch similarity index 75% rename from debian/patches/features/all/rt/0159-lockdep-rt.patch.patch rename to debian/patches/features/all/rt/lockdep-no-softirq-accounting-on-rt.patch index d1f1e49e0..7ae3423a9 100644 --- a/debian/patches/features/all/rt/0159-lockdep-rt.patch.patch +++ b/debian/patches/features/all/rt/lockdep-no-softirq-accounting-on-rt.patch @@ -1,7 +1,6 @@ -From 029ada8a8245ee5fdb3124448b95f7114f8cb2b6 Mon Sep 17 00:00:00 2001 +Subject: lockdep-rt.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 18:51:23 +0200 -Subject: [159/256] lockdep-rt.patch Signed-off-by: Thomas Gleixner --- @@ -9,10 +8,10 @@ Signed-off-by: Thomas Gleixner kernel/lockdep.c | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) -diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h -index 37b13c4..a52b35d 100644 ---- a/include/linux/irqflags.h -+++ b/include/linux/irqflags.h +Index: linux-stable/include/linux/irqflags.h +=================================================================== +--- linux-stable.orig/include/linux/irqflags.h ++++ linux-stable/include/linux/irqflags.h @@ -25,8 +25,6 @@ # define trace_softirqs_enabled(p) ((p)->softirqs_enabled) # define trace_hardirq_enter() do { current->hardirq_context++; } while (0) @@ -39,11 +38,11 @@ index 37b13c4..a52b35d 100644 #endif #if defined(CONFIG_IRQSOFF_TRACER) || \ -diff --git a/kernel/lockdep.c b/kernel/lockdep.c -index ea9ee45..6537c1c 100644 ---- a/kernel/lockdep.c -+++ b/kernel/lockdep.c -@@ -3495,6 +3495,7 @@ static void check_flags(unsigned long flags) +Index: linux-stable/kernel/lockdep.c +=================================================================== +--- linux-stable.orig/kernel/lockdep.c ++++ linux-stable/kernel/lockdep.c +@@ -3495,6 +3495,7 @@ static void check_flags(unsigned long fl } } @@ -51,7 +50,7 @@ index ea9ee45..6537c1c 100644 /* * We dont accurately track softirq state in e.g. * hardirq contexts (such as on 4KSTACKS), so only -@@ -3509,6 +3510,7 @@ static void check_flags(unsigned long flags) +@@ -3509,6 +3510,7 @@ static void check_flags(unsigned long fl DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); } } diff --git a/debian/patches/features/all/rt/0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch b/debian/patches/features/all/rt/lockdep-selftest-convert-spinlock-to-raw-spinlock.patch similarity index 86% rename from debian/patches/features/all/rt/0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch rename to debian/patches/features/all/rt/lockdep-selftest-convert-spinlock-to-raw-spinlock.patch index 0b76b2222..734a9da83 100644 --- a/debian/patches/features/all/rt/0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch +++ b/debian/patches/features/all/rt/lockdep-selftest-convert-spinlock-to-raw-spinlock.patch @@ -1,7 +1,8 @@ -From 396350c9bf8c577fc3b8ca8009ad73bfa720380a Mon Sep 17 00:00:00 2001 -From: Yong Zhang +Subject: lockdep: Selftest: convert spinlock to raw spinlock +From: Yong Zhang Date: Mon, 16 Apr 2012 15:01:55 +0800 -Subject: [249/256] lockdep: Selftest: convert spinlock to raw spinlock + +From: Yong Zhang spinlock is sleepable on -rt and can not be used in interrupt context. @@ -14,11 +15,11 @@ Signed-off-by: Thomas Gleixner lib/locking-selftest.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) -diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c -index 7aae0f2..c3eb261 100644 ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c -@@ -47,10 +47,10 @@ __setup("debug_locks_verbose=", setup_debug_locks_verbose); +Index: linux-stable/lib/locking-selftest.c +=================================================================== +--- linux-stable.orig/lib/locking-selftest.c ++++ linux-stable/lib/locking-selftest.c +@@ -47,10 +47,10 @@ __setup("debug_locks_verbose=", setup_de * Normal standalone locks, for the circular and irq-context * dependency tests: */ @@ -80,7 +81,7 @@ index 7aae0f2..c3eb261 100644 #define WL(x) write_lock(&rwlock_##x) #define WU(x) write_unlock(&rwlock_##x) -@@ -911,7 +911,7 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft) +@@ -911,7 +911,7 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_ #define I2(x) \ do { \ diff --git a/debian/patches/features/all/rt/0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch b/debian/patches/features/all/rt/lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch similarity index 88% rename from debian/patches/features/all/rt/0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch rename to debian/patches/features/all/rt/lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch index 817c15a4d..fece3d4f6 100644 --- a/debian/patches/features/all/rt/0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch +++ b/debian/patches/features/all/rt/lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch @@ -1,8 +1,8 @@ -From ddaed6a3e4ed4924642d2ca42cc21011f0c4a2a8 Mon Sep 17 00:00:00 2001 -From: Yong Zhang +Subject: lockdep: Selftest: Only do hardirq context test for raw spinlock +From: Yong Zhang Date: Mon, 16 Apr 2012 15:01:56 +0800 -Subject: [250/256] lockdep: Selftest: Only do hardirq context test for raw - spinlock + +From: Yong Zhang On -rt there is no softirq context any more and rwlock is sleepable, disable softirq context test and rwlock+irq test. @@ -15,10 +15,10 @@ Signed-off-by: Thomas Gleixner lib/locking-selftest.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) -diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c -index c3eb261..23b8564 100644 ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c +Index: linux-stable/lib/locking-selftest.c +=================================================================== +--- linux-stable.orig/lib/locking-selftest.c ++++ linux-stable/lib/locking-selftest.c @@ -1175,6 +1175,7 @@ void locking_selftest(void) printk(" --------------------------------------------------------------------------\n"); diff --git a/debian/patches/features/all/rt/0052-locking-various-init-fixes.patch.patch b/debian/patches/features/all/rt/locking-various-init-fixes.patch similarity index 56% rename from debian/patches/features/all/rt/0052-locking-various-init-fixes.patch.patch rename to debian/patches/features/all/rt/locking-various-init-fixes.patch index 4b8a32577..f18974d50 100644 --- a/debian/patches/features/all/rt/0052-locking-various-init-fixes.patch.patch +++ b/debian/patches/features/all/rt/locking-various-init-fixes.patch @@ -1,22 +1,21 @@ -From 7532d53febc3ff8b396d8c78a76c52ce99461b19 Mon Sep 17 00:00:00 2001 +Subject: locking-various-init-fixes.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:25:03 +0200 -Subject: [052/256] locking-various-init-fixes.patch Signed-off-by: Thomas Gleixner --- - drivers/char/random.c | 6 +++--- - drivers/usb/gadget/ci13xxx_udc.c | 2 +- - fs/file.c | 2 +- - include/linux/idr.h | 2 +- - kernel/cred.c | 2 +- + drivers/char/random.c | 6 +++--- + drivers/usb/chipidea/debug.c | 2 +- + fs/file.c | 2 +- + include/linux/idr.h | 2 +- + kernel/cred.c | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) -diff --git a/drivers/char/random.c b/drivers/char/random.c -index 1e37cf4..85b9419b1 100644 ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -433,7 +433,7 @@ static struct entropy_store input_pool = { +Index: linux-stable/drivers/char/random.c +=================================================================== +--- linux-stable.orig/drivers/char/random.c ++++ linux-stable/drivers/char/random.c +@@ -448,7 +448,7 @@ static struct entropy_store input_pool = .poolinfo = &poolinfo_table[0], .name = "input", .limit = 1, @@ -25,7 +24,7 @@ index 1e37cf4..85b9419b1 100644 .pool = input_pool_data }; -@@ -442,7 +442,7 @@ static struct entropy_store blocking_pool = { +@@ -457,7 +457,7 @@ static struct entropy_store blocking_poo .name = "blocking", .limit = 1, .pull = &input_pool, @@ -34,7 +33,7 @@ index 1e37cf4..85b9419b1 100644 .pool = blocking_pool_data }; -@@ -450,7 +450,7 @@ static struct entropy_store nonblocking_pool = { +@@ -465,7 +465,7 @@ static struct entropy_store nonblocking_ .poolinfo = &poolinfo_table[1], .name = "nonblocking", .pull = &input_pool, @@ -43,11 +42,11 @@ index 1e37cf4..85b9419b1 100644 .pool = nonblocking_pool_data }; -diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c -index 243ef1a..238372e 100644 ---- a/drivers/usb/gadget/ci13xxx_udc.c -+++ b/drivers/usb/gadget/ci13xxx_udc.c -@@ -834,7 +834,7 @@ static struct { +Index: linux-stable/drivers/usb/chipidea/debug.c +=================================================================== +--- linux-stable.orig/drivers/usb/chipidea/debug.c ++++ linux-stable/drivers/usb/chipidea/debug.c +@@ -225,7 +225,7 @@ static struct { } dbg_data = { .idx = 0, .tty = 0, @@ -56,10 +55,10 @@ index 243ef1a..238372e 100644 }; /** -diff --git a/fs/file.c b/fs/file.c -index ba3f605..6f176f5 100644 ---- a/fs/file.c -+++ b/fs/file.c +Index: linux-stable/fs/file.c +=================================================================== +--- linux-stable.orig/fs/file.c ++++ linux-stable/fs/file.c @@ -421,7 +421,7 @@ struct files_struct init_files = { .close_on_exec = init_files.close_on_exec_init, .open_fds = init_files.open_fds_init, @@ -69,10 +68,10 @@ index ba3f605..6f176f5 100644 }; /* -diff --git a/include/linux/idr.h b/include/linux/idr.h -index 255491c..4eaacf0 100644 ---- a/include/linux/idr.h -+++ b/include/linux/idr.h +Index: linux-stable/include/linux/idr.h +=================================================================== +--- linux-stable.orig/include/linux/idr.h ++++ linux-stable/include/linux/idr.h @@ -136,7 +136,7 @@ struct ida { struct ida_bitmap *free_bitmap; }; @@ -82,10 +81,10 @@ index 255491c..4eaacf0 100644 #define DEFINE_IDA(name) struct ida name = IDA_INIT(name) int ida_pre_get(struct ida *ida, gfp_t gfp_mask); -diff --git a/kernel/cred.c b/kernel/cred.c -index e70683d..fed7c3f 100644 ---- a/kernel/cred.c -+++ b/kernel/cred.c +Index: linux-stable/kernel/cred.c +=================================================================== +--- linux-stable.orig/kernel/cred.c ++++ linux-stable/kernel/cred.c @@ -36,7 +36,7 @@ static struct kmem_cache *cred_jar; static struct thread_group_cred init_tgcred = { .usage = ATOMIC_INIT(2), diff --git a/debian/patches/features/all/rt/0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch b/debian/patches/features/all/rt/md-raid5-percpu-handling-rt-aware.patch similarity index 68% rename from debian/patches/features/all/rt/0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch rename to debian/patches/features/all/rt/md-raid5-percpu-handling-rt-aware.patch index 70936096d..e354e7025 100644 --- a/debian/patches/features/all/rt/0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch +++ b/debian/patches/features/all/rt/md-raid5-percpu-handling-rt-aware.patch @@ -1,7 +1,6 @@ -From 0b38a99846981f3d58096100972ae9f2003737d8 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 6 Apr 2010 16:51:31 +0200 -Subject: [170/256] md: raid5: Make raid5_percpu handling RT aware +Subject: md: raid5: Make raid5_percpu handling RT aware __raid_run_ops() disables preemption with get_cpu() around the access to the raid5_percpu variables. That causes scheduling while atomic @@ -13,16 +12,17 @@ preemptible. Reported-by: Udo van den Heuvel Signed-off-by: Thomas Gleixner Tested-by: Udo van den Heuvel + --- drivers/md/raid5.c | 7 +++++-- drivers/md/raid5.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) -diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c -index f351422..02e2ea3 100644 ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -1309,8 +1309,9 @@ static void __raid_run_ops(struct stripe_head *sh, unsigned long ops_request) +Index: linux-stable/drivers/md/raid5.c +=================================================================== +--- linux-stable.orig/drivers/md/raid5.c ++++ linux-stable/drivers/md/raid5.c +@@ -1373,8 +1373,9 @@ static void __raid_run_ops(struct stripe struct raid5_percpu *percpu; unsigned long cpu; @@ -33,7 +33,7 @@ index f351422..02e2ea3 100644 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { ops_run_biofill(sh); overlap_clear++; -@@ -1362,7 +1363,8 @@ static void __raid_run_ops(struct stripe_head *sh, unsigned long ops_request) +@@ -1426,7 +1427,8 @@ static void __raid_run_ops(struct stripe if (test_and_clear_bit(R5_Overlap, &dev->flags)) wake_up(&sh->raid_conf->wait_for_overlap); } @@ -43,7 +43,7 @@ index f351422..02e2ea3 100644 } #ifdef CONFIG_MULTICORE_RAID456 -@@ -4758,6 +4760,7 @@ static int raid5_alloc_percpu(struct r5conf *conf) +@@ -4925,6 +4927,7 @@ static int raid5_alloc_percpu(struct r5c break; } per_cpu_ptr(conf->percpu, cpu)->scribble = scribble; @@ -51,11 +51,11 @@ index f351422..02e2ea3 100644 } #ifdef CONFIG_HOTPLUG_CPU conf->cpu_notify.notifier_call = raid456_cpu_notify; -diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h -index 8d8e139..a784311 100644 ---- a/drivers/md/raid5.h -+++ b/drivers/md/raid5.h -@@ -417,6 +417,7 @@ struct r5conf { +Index: linux-stable/drivers/md/raid5.h +=================================================================== +--- linux-stable.orig/drivers/md/raid5.h ++++ linux-stable/drivers/md/raid5.h +@@ -427,6 +427,7 @@ struct r5conf { int recovery_disabled; /* per cpu variables */ struct raid5_percpu { diff --git a/debian/patches/features/all/rt/0146-migrate-disable-rt-variant.patch.patch b/debian/patches/features/all/rt/migrate-disable-rt-variant.patch similarity index 75% rename from debian/patches/features/all/rt/0146-migrate-disable-rt-variant.patch.patch rename to debian/patches/features/all/rt/migrate-disable-rt-variant.patch index 8d84cecab..0c73a6fb1 100644 --- a/debian/patches/features/all/rt/0146-migrate-disable-rt-variant.patch.patch +++ b/debian/patches/features/all/rt/migrate-disable-rt-variant.patch @@ -1,17 +1,16 @@ -From a9b8647d496680f8dea9ab039593d1903cc12d54 Mon Sep 17 00:00:00 2001 +Subject: migrate-disable-rt-variant.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 19:48:20 +0200 -Subject: [146/256] migrate-disable-rt-variant.patch Signed-off-by: Thomas Gleixner --- include/linux/preempt.h | 4 ++++ 1 file changed, 4 insertions(+) -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index c5d2a36..714a08c 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h +Index: linux-stable/include/linux/preempt.h +=================================================================== +--- linux-stable.orig/include/linux/preempt.h ++++ linux-stable/include/linux/preempt.h @@ -121,11 +121,15 @@ extern void migrate_enable(void); # define preempt_enable_rt() preempt_enable() # define preempt_disable_nort() do { } while (0) diff --git a/debian/patches/features/all/rt/0222-mips-disable-highmem-on-rt.patch.patch b/debian/patches/features/all/rt/mips-disable-highmem-on-rt.patch similarity index 60% rename from debian/patches/features/all/rt/0222-mips-disable-highmem-on-rt.patch.patch rename to debian/patches/features/all/rt/mips-disable-highmem-on-rt.patch index 5f585e835..177a7a031 100644 --- a/debian/patches/features/all/rt/0222-mips-disable-highmem-on-rt.patch.patch +++ b/debian/patches/features/all/rt/mips-disable-highmem-on-rt.patch @@ -1,18 +1,17 @@ -From 51c704a93041eb2ec8f017736454fc28aeeb316f Mon Sep 17 00:00:00 2001 +Subject: mips-disable-highmem-on-rt.patch From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:10:12 +0200 -Subject: [222/256] mips-disable-highmem-on-rt.patch Signed-off-by: Thomas Gleixner --- arch/mips/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig -index ce30e2f..f0bc185 100644 ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -2081,7 +2081,7 @@ config CPU_R4400_WORKAROUNDS +Index: linux-stable/arch/mips/Kconfig +=================================================================== +--- linux-stable.orig/arch/mips/Kconfig ++++ linux-stable/arch/mips/Kconfig +@@ -2119,7 +2119,7 @@ config CPU_R4400_WORKAROUNDS # config HIGHMEM bool "High Memory Support" diff --git a/debian/patches/features/all/rt/mips-enable-interrupts-in-signal.patch b/debian/patches/features/all/rt/mips-enable-interrupts-in-signal.patch new file mode 100644 index 000000000..21d0b984e --- /dev/null +++ b/debian/patches/features/all/rt/mips-enable-interrupts-in-signal.patch @@ -0,0 +1,21 @@ +Subject: mips-enable-interrupts-in-signal.patch +From: Thomas Gleixner +Date: Mon, 18 Jul 2011 21:32:10 +0200 + +Signed-off-by: Thomas Gleixner +--- + arch/mips/kernel/signal.c | 1 + + 1 file changed, 1 insertion(+) + +Index: linux-stable/arch/mips/kernel/signal.c +=================================================================== +--- linux-stable.orig/arch/mips/kernel/signal.c ++++ linux-stable/arch/mips/kernel/signal.c +@@ -606,6 +606,7 @@ asmlinkage void do_notify_resume(struct + __u32 thread_info_flags) + { + local_irq_enable(); ++ preempt_check_resched(); + + /* deal with pending signal delivery */ + if (thread_info_flags & _TIF_SIGPENDING) diff --git a/debian/patches/features/all/rt/0100-mm-Allow-only-slab-on-RT.patch b/debian/patches/features/all/rt/mm-allow-slab-rt.patch similarity index 69% rename from debian/patches/features/all/rt/0100-mm-Allow-only-slab-on-RT.patch rename to debian/patches/features/all/rt/mm-allow-slab-rt.patch index bc59cc6da..fd8366d61 100644 --- a/debian/patches/features/all/rt/0100-mm-Allow-only-slab-on-RT.patch +++ b/debian/patches/features/all/rt/mm-allow-slab-rt.patch @@ -1,19 +1,19 @@ -From 401ea3678872166ee1015195db7fd631e9c56192 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:44:03 -0500 -Subject: [100/256] mm: Allow only slab on RT +Subject: mm: Allow only slab on RT Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- init/Kconfig | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/init/Kconfig b/init/Kconfig -index 6cfd71d..7c0b369 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1265,6 +1265,7 @@ config SLAB +Index: linux-stable/init/Kconfig +=================================================================== +--- linux-stable.orig/init/Kconfig ++++ linux-stable/init/Kconfig +@@ -1441,6 +1441,7 @@ config SLAB config SLUB bool "SLUB (Unqueued Allocator)" @@ -21,7 +21,7 @@ index 6cfd71d..7c0b369 100644 help SLUB is a slab allocator that minimizes cache line usage instead of managing queues of cached objects (SLAB approach). -@@ -1276,6 +1277,7 @@ config SLUB +@@ -1452,6 +1453,7 @@ config SLUB config SLOB depends on EXPERT bool "SLOB (Simple Allocator)" diff --git a/debian/patches/features/all/rt/0076-mm-Replace-cgroup_page-bit-spinlock.patch b/debian/patches/features/all/rt/mm-cgroup-page-bit-spinlock.patch similarity index 66% rename from debian/patches/features/all/rt/0076-mm-Replace-cgroup_page-bit-spinlock.patch rename to debian/patches/features/all/rt/mm-cgroup-page-bit-spinlock.patch index 84dadd509..e814d8482 100644 --- a/debian/patches/features/all/rt/0076-mm-Replace-cgroup_page-bit-spinlock.patch +++ b/debian/patches/features/all/rt/mm-cgroup-page-bit-spinlock.patch @@ -1,20 +1,20 @@ -From 12aee8794ad4dc4aa3132329f9b57d2248c4def9 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 19 Aug 2009 09:56:42 +0200 -Subject: [076/256] mm: Replace cgroup_page bit spinlock +Subject: mm: Replace cgroup_page bit spinlock Bit spinlocks are not working on RT. Replace them. Signed-off-by: Thomas Gleixner + --- include/linux/page_cgroup.h | 15 +++++++++++++++ mm/page_cgroup.c | 11 +++++++++++ 2 files changed, 26 insertions(+) -diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h -index a88cdba..5f0fe2d 100644 ---- a/include/linux/page_cgroup.h -+++ b/include/linux/page_cgroup.h +Index: linux-stable/include/linux/page_cgroup.h +=================================================================== +--- linux-stable.orig/include/linux/page_cgroup.h ++++ linux-stable/include/linux/page_cgroup.h @@ -24,6 +24,9 @@ enum { */ struct page_cgroup { @@ -25,7 +25,7 @@ index a88cdba..5f0fe2d 100644 struct mem_cgroup *mem_cgroup; }; -@@ -74,12 +77,20 @@ static inline void lock_page_cgroup(struct page_cgroup *pc) +@@ -74,12 +77,20 @@ static inline void lock_page_cgroup(stru * Don't take this lock in IRQ context. * This lock is for pc->mem_cgroup, USED, MIGRATION */ @@ -45,8 +45,8 @@ index a88cdba..5f0fe2d 100644 +#endif } - #else /* CONFIG_CGROUP_MEM_RES_CTLR */ -@@ -102,6 +113,10 @@ static inline void __init page_cgroup_init_flatmem(void) + #else /* CONFIG_MEMCG */ +@@ -102,6 +113,10 @@ static inline void __init page_cgroup_in { } @@ -54,13 +54,13 @@ index a88cdba..5f0fe2d 100644 +{ +} + - #endif /* CONFIG_CGROUP_MEM_RES_CTLR */ + #endif /* CONFIG_MEMCG */ #include -diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c -index 1ccbd71..84f3ce8 100644 ---- a/mm/page_cgroup.c -+++ b/mm/page_cgroup.c +Index: linux-stable/mm/page_cgroup.c +=================================================================== +--- linux-stable.orig/mm/page_cgroup.c ++++ linux-stable/mm/page_cgroup.c @@ -13,6 +13,14 @@ static unsigned long total_usage; @@ -76,7 +76,7 @@ index 1ccbd71..84f3ce8 100644 #if !defined(CONFIG_SPARSEMEM) -@@ -60,6 +68,7 @@ static int __init alloc_node_page_cgroup(int nid) +@@ -60,6 +68,7 @@ static int __init alloc_node_page_cgroup return -ENOMEM; NODE_DATA(nid)->node_page_cgroup = base; total_usage += table_size; @@ -84,7 +84,7 @@ index 1ccbd71..84f3ce8 100644 return 0; } -@@ -150,6 +159,8 @@ static int __meminit init_section_page_cgroup(unsigned long pfn, int nid) +@@ -150,6 +159,8 @@ static int __meminit init_section_page_c return -ENOMEM; } diff --git a/debian/patches/features/all/rt/0096-mm-convert-swap-to-percpu-locked.patch b/debian/patches/features/all/rt/mm-convert-swap-to-percpu-locked.patch similarity index 82% rename from debian/patches/features/all/rt/0096-mm-convert-swap-to-percpu-locked.patch rename to debian/patches/features/all/rt/mm-convert-swap-to-percpu-locked.patch index 46dc13bb6..303054c9d 100644 --- a/debian/patches/features/all/rt/0096-mm-convert-swap-to-percpu-locked.patch +++ b/debian/patches/features/all/rt/mm-convert-swap-to-percpu-locked.patch @@ -1,18 +1,18 @@ -From bc50ce006d4e6a76038c1ac504a219c4a4fd3b09 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:51 -0500 -Subject: [096/256] mm: convert swap to percpu locked +Subject: mm: convert swap to percpu locked Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- mm/swap.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) -diff --git a/mm/swap.c b/mm/swap.c -index 5c13f13..2051da9 100644 ---- a/mm/swap.c -+++ b/mm/swap.c +Index: linux-stable/mm/swap.c +=================================================================== +--- linux-stable.orig/mm/swap.c ++++ linux-stable/mm/swap.c @@ -30,6 +30,7 @@ #include #include @@ -21,7 +21,7 @@ index 5c13f13..2051da9 100644 #include "internal.h" -@@ -40,6 +41,9 @@ static DEFINE_PER_CPU(struct pagevec[NR_LRU_LISTS], lru_add_pvecs); +@@ -40,6 +41,9 @@ static DEFINE_PER_CPU(struct pagevec[NR_ static DEFINE_PER_CPU(struct pagevec, lru_rotate_pvecs); static DEFINE_PER_CPU(struct pagevec, lru_deactivate_pvecs); @@ -31,7 +31,7 @@ index 5c13f13..2051da9 100644 /* * This path almost never happens for VM activity - pages are normally * freed via pagevecs. But it gets used by networking. -@@ -268,11 +272,11 @@ void rotate_reclaimable_page(struct page *page) +@@ -354,11 +358,11 @@ void rotate_reclaimable_page(struct page unsigned long flags; page_cache_get(page); @@ -45,7 +45,7 @@ index 5c13f13..2051da9 100644 } } -@@ -328,12 +332,13 @@ static void activate_page_drain(int cpu) +@@ -403,12 +407,13 @@ static void activate_page_drain(int cpu) void activate_page(struct page *page) { if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { @@ -61,7 +61,7 @@ index 5c13f13..2051da9 100644 } } -@@ -373,12 +378,12 @@ EXPORT_SYMBOL(mark_page_accessed); +@@ -448,12 +453,12 @@ EXPORT_SYMBOL(mark_page_accessed); void __lru_cache_add(struct page *page, enum lru_list lru) { @@ -76,7 +76,7 @@ index 5c13f13..2051da9 100644 } EXPORT_SYMBOL(__lru_cache_add); -@@ -513,9 +518,9 @@ void lru_add_drain_cpu(int cpu) +@@ -588,9 +593,9 @@ void lru_add_drain_cpu(int cpu) unsigned long flags; /* No harm done if a racing interrupt already did this */ @@ -88,7 +88,7 @@ index 5c13f13..2051da9 100644 } pvec = &per_cpu(lru_deactivate_pvecs, cpu); -@@ -543,18 +548,19 @@ void deactivate_page(struct page *page) +@@ -618,18 +623,19 @@ void deactivate_page(struct page *page) return; if (likely(get_page_unless_zero(page))) { @@ -112,7 +112,7 @@ index 5c13f13..2051da9 100644 } static void lru_add_drain_per_cpu(struct work_struct *dummy) -@@ -768,6 +774,9 @@ void __init swap_setup(void) +@@ -847,6 +853,9 @@ void __init swap_setup(void) { unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT); diff --git a/debian/patches/features/all/rt/0097-mm-make-vmstat-rt-aware.patch b/debian/patches/features/all/rt/mm-make-vmstat-rt-aware.patch similarity index 62% rename from debian/patches/features/all/rt/0097-mm-make-vmstat-rt-aware.patch rename to debian/patches/features/all/rt/mm-make-vmstat-rt-aware.patch index f373c0937..be91dcb1b 100644 --- a/debian/patches/features/all/rt/0097-mm-make-vmstat-rt-aware.patch +++ b/debian/patches/features/all/rt/mm-make-vmstat-rt-aware.patch @@ -1,20 +1,20 @@ -From f48741aeb7f4257bf0ab2f95e7468dcf293f4e65 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:13 -0500 -Subject: [097/256] mm: make vmstat -rt aware +Subject: [PATCH] mm: make vmstat -rt aware Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- include/linux/vmstat.h | 4 ++++ mm/vmstat.c | 6 ++++++ 2 files changed, 10 insertions(+) -diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h -index 65efb92..1b3f2ef 100644 ---- a/include/linux/vmstat.h -+++ b/include/linux/vmstat.h -@@ -29,7 +29,9 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states); +Index: linux-stable/include/linux/vmstat.h +=================================================================== +--- linux-stable.orig/include/linux/vmstat.h ++++ linux-stable/include/linux/vmstat.h +@@ -29,7 +29,9 @@ DECLARE_PER_CPU(struct vm_event_state, v static inline void __count_vm_event(enum vm_event_item item) { @@ -24,7 +24,7 @@ index 65efb92..1b3f2ef 100644 } static inline void count_vm_event(enum vm_event_item item) -@@ -39,7 +41,9 @@ static inline void count_vm_event(enum vm_event_item item) +@@ -39,7 +41,9 @@ static inline void count_vm_event(enum v static inline void __count_vm_events(enum vm_event_item item, long delta) { @@ -34,11 +34,11 @@ index 65efb92..1b3f2ef 100644 } static inline void count_vm_events(enum vm_event_item item, long delta) -diff --git a/mm/vmstat.c b/mm/vmstat.c -index 7db1b9b..172212f 100644 ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -216,6 +216,7 @@ void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, +Index: linux-stable/mm/vmstat.c +=================================================================== +--- linux-stable.orig/mm/vmstat.c ++++ linux-stable/mm/vmstat.c +@@ -216,6 +216,7 @@ void __mod_zone_page_state(struct zone * long x; long t; @@ -46,7 +46,7 @@ index 7db1b9b..172212f 100644 x = delta + __this_cpu_read(*p); t = __this_cpu_read(pcp->stat_threshold); -@@ -225,6 +226,7 @@ void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, +@@ -225,6 +226,7 @@ void __mod_zone_page_state(struct zone * x = 0; } __this_cpu_write(*p, x); @@ -54,7 +54,7 @@ index 7db1b9b..172212f 100644 } EXPORT_SYMBOL(__mod_zone_page_state); -@@ -257,6 +259,7 @@ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) +@@ -257,6 +259,7 @@ void __inc_zone_state(struct zone *zone, s8 __percpu *p = pcp->vm_stat_diff + item; s8 v, t; @@ -62,7 +62,7 @@ index 7db1b9b..172212f 100644 v = __this_cpu_inc_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v > t)) { -@@ -265,6 +268,7 @@ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) +@@ -265,6 +268,7 @@ void __inc_zone_state(struct zone *zone, zone_page_state_add(v + overstep, zone, item); __this_cpu_write(*p, -overstep); } @@ -70,7 +70,7 @@ index 7db1b9b..172212f 100644 } void __inc_zone_page_state(struct page *page, enum zone_stat_item item) -@@ -279,6 +283,7 @@ void __dec_zone_state(struct zone *zone, enum zone_stat_item item) +@@ -279,6 +283,7 @@ void __dec_zone_state(struct zone *zone, s8 __percpu *p = pcp->vm_stat_diff + item; s8 v, t; @@ -78,7 +78,7 @@ index 7db1b9b..172212f 100644 v = __this_cpu_dec_return(*p); t = __this_cpu_read(pcp->stat_threshold); if (unlikely(v < - t)) { -@@ -287,6 +292,7 @@ void __dec_zone_state(struct zone *zone, enum zone_stat_item item) +@@ -287,6 +292,7 @@ void __dec_zone_state(struct zone *zone, zone_page_state_add(v - overstep, zone, item); __this_cpu_write(*p, overstep); } diff --git a/debian/patches/features/all/rt/0095-mm-page-alloc-fix.patch.patch b/debian/patches/features/all/rt/mm-page-alloc-fix.patch similarity index 61% rename from debian/patches/features/all/rt/0095-mm-page-alloc-fix.patch.patch rename to debian/patches/features/all/rt/mm-page-alloc-fix.patch index 435bbba8a..a6ef431d2 100644 --- a/debian/patches/features/all/rt/0095-mm-page-alloc-fix.patch.patch +++ b/debian/patches/features/all/rt/mm-page-alloc-fix.patch @@ -1,18 +1,17 @@ -From ca7cb6af82a59552dc519e7b1dde7084d6fa928c Mon Sep 17 00:00:00 2001 +Subject: mm-page-alloc-fix.patch From: Thomas Gleixner Date: Thu, 21 Jul 2011 16:47:49 +0200 -Subject: [095/256] mm-page-alloc-fix.patch Signed-off-by: Thomas Gleixner --- mm/page_alloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 2edd044..4a68c8f 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -2095,8 +2095,8 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, +Index: linux-stable/mm/page_alloc.c +=================================================================== +--- linux-stable.orig/mm/page_alloc.c ++++ linux-stable/mm/page_alloc.c +@@ -2180,8 +2180,8 @@ __alloc_pages_direct_compact(gfp_t gfp_m if (*did_some_progress != COMPACT_SKIPPED) { /* Page migration frees to the PCP lists but we want merging */ diff --git a/debian/patches/features/all/rt/0043-mm-page-alloc-use-list-last-entry.patch.patch b/debian/patches/features/all/rt/mm-page-alloc-use-list-last-entry.patch similarity index 60% rename from debian/patches/features/all/rt/0043-mm-page-alloc-use-list-last-entry.patch.patch rename to debian/patches/features/all/rt/mm-page-alloc-use-list-last-entry.patch index dadd40766..77d7268d0 100644 --- a/debian/patches/features/all/rt/0043-mm-page-alloc-use-list-last-entry.patch.patch +++ b/debian/patches/features/all/rt/mm-page-alloc-use-list-last-entry.patch @@ -1,18 +1,17 @@ -From feb16311a9c91515ef2b12f9d98c93df62a01c65 Mon Sep 17 00:00:00 2001 +Subject: mm-page-alloc-use-list-last-entry.patch From: Peter Zijlstra Date: Tue, 21 Jun 2011 11:24:35 +0200 -Subject: [043/256] mm-page-alloc-use-list-last-entry.patch Signed-off-by: Thomas Gleixner --- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 918330f..b27e8cb 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -663,7 +663,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, +Index: linux-stable/mm/page_alloc.c +=================================================================== +--- linux-stable.orig/mm/page_alloc.c ++++ linux-stable/mm/page_alloc.c +@@ -668,7 +668,7 @@ static void free_pcppages_bulk(struct zo batch_free = to_free; do { diff --git a/debian/patches/features/all/rt/mm-page-alloc-use-local-lock-on-target-cpu.patch b/debian/patches/features/all/rt/mm-page-alloc-use-local-lock-on-target-cpu.patch new file mode 100644 index 000000000..c2266935e --- /dev/null +++ b/debian/patches/features/all/rt/mm-page-alloc-use-local-lock-on-target-cpu.patch @@ -0,0 +1,59 @@ +Subject: mm: page_alloc: Use local_lock_on() instead of plain spinlock +From: Thomas Gleixner +Date: Thu, 27 Sep 2012 11:11:46 +0200 + +The plain spinlock while sufficient does not update the local_lock +internals. Use a proper local_lock function instead to ease debugging. + +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +--- + include/linux/locallock.h | 11 +++++++++++ + mm/page_alloc.c | 4 ++-- + 2 files changed, 13 insertions(+), 2 deletions(-) + +Index: linux-stable/include/linux/locallock.h +=================================================================== +--- linux-stable.orig/include/linux/locallock.h ++++ linux-stable/include/linux/locallock.h +@@ -137,6 +137,12 @@ static inline int __local_lock_irqsave(s + _flags = __get_cpu_var(lvar).flags; \ + } while (0) + ++#define local_lock_irqsave_on(lvar, _flags, cpu) \ ++ do { \ ++ __local_lock_irqsave(&per_cpu(lvar, cpu)); \ ++ _flags = per_cpu(lvar, cpu).flags; \ ++ } while (0) ++ + static inline int __local_unlock_irqrestore(struct local_irq_lock *lv, + unsigned long flags) + { +@@ -156,6 +162,11 @@ static inline int __local_unlock_irqrest + put_local_var(lvar); \ + } while (0) + ++#define local_unlock_irqrestore_on(lvar, flags, cpu) \ ++ do { \ ++ __local_unlock_irqrestore(&per_cpu(lvar, cpu), flags); \ ++ } while (0) ++ + #define local_spin_trylock_irq(lvar, lock) \ + ({ \ + int __locked; \ +Index: linux-stable/mm/page_alloc.c +=================================================================== +--- linux-stable.orig/mm/page_alloc.c ++++ linux-stable/mm/page_alloc.c +@@ -221,9 +221,9 @@ static DEFINE_LOCAL_IRQ_LOCK(pa_lock); + + #ifdef CONFIG_PREEMPT_RT_BASE + # define cpu_lock_irqsave(cpu, flags) \ +- spin_lock_irqsave(&per_cpu(pa_lock, cpu).lock, flags) ++ local_lock_irqsave_on(pa_lock, flags, cpu) + # define cpu_unlock_irqrestore(cpu, flags) \ +- spin_unlock_irqrestore(&per_cpu(pa_lock, cpu).lock, flags) ++ local_unlock_irqrestore_on(pa_lock, flags, cpu) + #else + # define cpu_lock_irqsave(cpu, flags) local_irq_save(flags) + # define cpu_unlock_irqrestore(cpu, flags) local_irq_restore(flags) diff --git a/debian/patches/features/all/rt/0094-mm-page_alloc-reduce-lock-sections-further.patch b/debian/patches/features/all/rt/mm-page_alloc-reduce-lock-sections-further.patch similarity index 76% rename from debian/patches/features/all/rt/0094-mm-page_alloc-reduce-lock-sections-further.patch rename to debian/patches/features/all/rt/mm-page_alloc-reduce-lock-sections-further.patch index efc5c7449..6d9f67936 100644 --- a/debian/patches/features/all/rt/0094-mm-page_alloc-reduce-lock-sections-further.patch +++ b/debian/patches/features/all/rt/mm-page_alloc-reduce-lock-sections-further.patch @@ -1,7 +1,6 @@ -From 486036f250d0c976bdee08f7ed718aa80c2913c7 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 3 Jul 2009 08:44:37 -0500 -Subject: [094/256] mm: page_alloc reduce lock sections further +Subject: mm: page_alloc reduce lock sections further Split out the pages which are to be freed into a separate list and call free_pages_bulk() outside of the percpu page allocator locks. @@ -9,14 +8,14 @@ call free_pages_bulk() outside of the percpu page allocator locks. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner --- - mm/page_alloc.c | 77 +++++++++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 58 insertions(+), 19 deletions(-) + mm/page_alloc.c | 81 +++++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 60 insertions(+), 21 deletions(-) -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index dbe4146..2edd044 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -632,7 +632,7 @@ static inline int free_pages_check(struct page *page) +Index: linux-stable/mm/page_alloc.c +=================================================================== +--- linux-stable.orig/mm/page_alloc.c ++++ linux-stable/mm/page_alloc.c +@@ -637,7 +637,7 @@ static inline int free_pages_check(struc } /* @@ -25,7 +24,7 @@ index dbe4146..2edd044 100644 * Assumes all pages on list are in same zone, and of same order. * count is the number of pages to free. * -@@ -643,16 +643,42 @@ static inline int free_pages_check(struct page *page) +@@ -648,16 +648,42 @@ static inline int free_pages_check(struc * pinned" detection logic. */ static void free_pcppages_bulk(struct zone *zone, int count, @@ -72,7 +71,7 @@ index dbe4146..2edd044 100644 while (to_free) { struct page *page; struct list_head *list; -@@ -668,7 +694,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, +@@ -673,7 +699,7 @@ static void free_pcppages_bulk(struct zo batch_free++; if (++migratetype == MIGRATE_PCPTYPES) migratetype = 0; @@ -81,7 +80,7 @@ index dbe4146..2edd044 100644 } while (list_empty(list)); /* This is the only non-empty list. Free them all. */ -@@ -677,27 +703,24 @@ static void free_pcppages_bulk(struct zone *zone, int count, +@@ -682,27 +708,24 @@ static void free_pcppages_bulk(struct zo do { page = list_last_entry(list, struct page, lru); @@ -114,7 +113,7 @@ index dbe4146..2edd044 100644 } static bool free_pages_prepare(struct page *page, unsigned int order) -@@ -1124,6 +1147,7 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, +@@ -1168,6 +1191,7 @@ static int rmqueue_bulk(struct zone *zon void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) { unsigned long flags; @@ -122,19 +121,20 @@ index dbe4146..2edd044 100644 int to_drain; local_lock_irqsave(pa_lock, flags); -@@ -1131,9 +1155,10 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) - to_drain = pcp->batch; +@@ -1176,10 +1200,11 @@ void drain_zone_pages(struct zone *zone, else to_drain = pcp->count; -- free_pcppages_bulk(zone, to_drain, pcp); -+ isolate_pcp_pages(to_drain, pcp, &dst); - pcp->count -= to_drain; + if (to_drain > 0) { +- free_pcppages_bulk(zone, to_drain, pcp); ++ isolate_pcp_pages(to_drain, pcp, &dst); + pcp->count -= to_drain; + } local_unlock_irqrestore(pa_lock, flags); + free_pcppages_bulk(zone, to_drain, &dst); } #endif -@@ -1152,16 +1177,21 @@ static void drain_pages(unsigned int cpu) +@@ -1198,16 +1223,21 @@ static void drain_pages(unsigned int cpu for_each_populated_zone(zone) { struct per_cpu_pageset *pset; struct per_cpu_pages *pcp; @@ -158,7 +158,7 @@ index dbe4146..2edd044 100644 } } -@@ -1302,8 +1332,15 @@ void free_hot_cold_page(struct page *page, int cold) +@@ -1348,8 +1378,15 @@ void free_hot_cold_page(struct page *pag list_add(&page->lru, &pcp->lists[migratetype]); pcp->count++; if (pcp->count >= pcp->high) { @@ -175,7 +175,7 @@ index dbe4146..2edd044 100644 } out: -@@ -3874,12 +3911,14 @@ static int __zone_pcp_update(void *data) +@@ -5888,14 +5925,16 @@ static int __meminit __zone_pcp_update(v for_each_possible_cpu(cpu) { struct per_cpu_pageset *pset; struct per_cpu_pages *pcp; @@ -185,9 +185,13 @@ index dbe4146..2edd044 100644 pcp = &pset->pcp; cpu_lock_irqsave(cpu, flags); -- free_pcppages_bulk(zone, pcp->count, pcp); -+ isolate_pcp_pages(pcp->count, pcp, &dst); -+ free_pcppages_bulk(zone, pcp->count, &dst); - setup_pageset(pset, batch); +- if (pcp->count > 0) +- free_pcppages_bulk(zone, pcp->count, pcp); +- setup_pageset(pset, batch); ++ if (pcp->count > 0) { ++ isolate_pcp_pages(pcp->count, pcp, &dst); ++ free_pcppages_bulk(zone, pcp->count, &dst); ++ } cpu_unlock_irqrestore(cpu, flags); } + return 0; diff --git a/debian/patches/features/all/rt/0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch b/debian/patches/features/all/rt/mm-page_alloc-rt-friendly-per-cpu-pages.patch similarity index 71% rename from debian/patches/features/all/rt/0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch rename to debian/patches/features/all/rt/mm-page_alloc-rt-friendly-per-cpu-pages.patch index 14f3c01fa..d915106a2 100644 --- a/debian/patches/features/all/rt/0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch +++ b/debian/patches/features/all/rt/mm-page_alloc-rt-friendly-per-cpu-pages.patch @@ -1,7 +1,6 @@ -From a422a5e6bef77e77648b2847565f4f62898664cb Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:37 -0500 -Subject: [093/256] mm: page_alloc: rt-friendly per-cpu pages +Subject: mm: page_alloc: rt-friendly per-cpu pages rt-friendly per-cpu pages: convert the irqs-off per-cpu locking method into a preemptible, explicit-per-cpu-locks method. @@ -12,22 +11,23 @@ Contains fixes from: Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner ---- - mm/page_alloc.c | 53 +++++++++++++++++++++++++++++++++++++---------------- - 1 file changed, 37 insertions(+), 16 deletions(-) -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index b27e8cb..dbe4146 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -57,6 +57,7 @@ - #include - #include +--- + mm/page_alloc.c | 57 ++++++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 39 insertions(+), 18 deletions(-) + +Index: linux-stable/mm/page_alloc.c +=================================================================== +--- linux-stable.orig/mm/page_alloc.c ++++ linux-stable/mm/page_alloc.c +@@ -58,6 +58,7 @@ #include -+#include + #include #include ++#include #include + #include @@ -216,6 +217,18 @@ EXPORT_SYMBOL(nr_node_ids); EXPORT_SYMBOL(nr_online_nodes); #endif @@ -46,8 +46,8 @@ index b27e8cb..dbe4146 100644 + int page_group_by_mobility_disabled __read_mostly; - static void set_pageblock_migratetype(struct page *page, int migratetype) -@@ -721,13 +734,13 @@ static void __free_pages_ok(struct page *page, unsigned int order) + /* +@@ -726,13 +739,13 @@ static void __free_pages_ok(struct page if (!free_pages_prepare(page, order)) return; @@ -63,7 +63,7 @@ index b27e8cb..dbe4146 100644 } void __meminit __free_pages_bootmem(struct page *page, unsigned int order) -@@ -1113,14 +1126,14 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) +@@ -1157,7 +1170,7 @@ void drain_zone_pages(struct zone *zone, unsigned long flags; int to_drain; @@ -72,15 +72,16 @@ index b27e8cb..dbe4146 100644 if (pcp->count >= pcp->batch) to_drain = pcp->batch; else - to_drain = pcp->count; - free_pcppages_bulk(zone, to_drain, pcp); - pcp->count -= to_drain; +@@ -1166,7 +1179,7 @@ void drain_zone_pages(struct zone *zone, + free_pcppages_bulk(zone, to_drain, pcp); + pcp->count -= to_drain; + } - local_irq_restore(flags); + local_unlock_irqrestore(pa_lock, flags); } #endif -@@ -1140,7 +1153,7 @@ static void drain_pages(unsigned int cpu) +@@ -1186,7 +1199,7 @@ static void drain_pages(unsigned int cpu struct per_cpu_pageset *pset; struct per_cpu_pages *pcp; @@ -89,7 +90,7 @@ index b27e8cb..dbe4146 100644 pset = per_cpu_ptr(zone->pageset, cpu); pcp = &pset->pcp; -@@ -1148,7 +1161,7 @@ static void drain_pages(unsigned int cpu) +@@ -1194,7 +1207,7 @@ static void drain_pages(unsigned int cpu free_pcppages_bulk(zone, pcp->count, pcp); pcp->count = 0; } @@ -98,7 +99,7 @@ index b27e8cb..dbe4146 100644 } } -@@ -1201,7 +1214,12 @@ void drain_all_pages(void) +@@ -1247,7 +1260,12 @@ void drain_all_pages(void) else cpumask_clear_cpu(cpu, &cpus_with_pcps); } @@ -111,7 +112,7 @@ index b27e8cb..dbe4146 100644 } #ifdef CONFIG_HIBERNATION -@@ -1257,7 +1275,7 @@ void free_hot_cold_page(struct page *page, int cold) +@@ -1303,7 +1321,7 @@ void free_hot_cold_page(struct page *pag migratetype = get_pageblock_migratetype(page); set_page_private(page, migratetype); @@ -120,7 +121,7 @@ index b27e8cb..dbe4146 100644 if (unlikely(wasMlocked)) free_page_mlock(page); __count_vm_event(PGFREE); -@@ -1289,7 +1307,7 @@ void free_hot_cold_page(struct page *page, int cold) +@@ -1335,7 +1353,7 @@ void free_hot_cold_page(struct page *pag } out: @@ -129,7 +130,7 @@ index b27e8cb..dbe4146 100644 } /* -@@ -1397,7 +1415,7 @@ again: +@@ -1447,7 +1465,7 @@ again: struct per_cpu_pages *pcp; struct list_head *list; @@ -138,7 +139,7 @@ index b27e8cb..dbe4146 100644 pcp = &this_cpu_ptr(zone->pageset)->pcp; list = &pcp->lists[migratetype]; if (list_empty(list)) { -@@ -1429,17 +1447,19 @@ again: +@@ -1479,17 +1497,19 @@ again: */ WARN_ON_ONCE(order > 1); } @@ -162,7 +163,7 @@ index b27e8cb..dbe4146 100644 VM_BUG_ON(bad_range(zone, page)); if (prep_new_page(page, order, gfp_flags)) -@@ -1447,7 +1467,7 @@ again: +@@ -1497,7 +1517,7 @@ again: return page; failed: @@ -171,24 +172,40 @@ index b27e8cb..dbe4146 100644 return NULL; } -@@ -3858,10 +3878,10 @@ static int __zone_pcp_update(void *data) - pset = per_cpu_ptr(zone->pageset, cpu); - pcp = &pset->pcp; - -- local_irq_save(flags); -+ cpu_lock_irqsave(cpu, flags); - free_pcppages_bulk(zone, pcp->count, pcp); - setup_pageset(pset, batch); -- local_irq_restore(flags); -+ cpu_unlock_irqrestore(cpu, flags); - } - return 0; - } -@@ -4892,6 +4912,7 @@ static int page_alloc_cpu_notify(struct notifier_block *self, +@@ -4992,6 +5012,7 @@ static int page_alloc_cpu_notify(struct void __init page_alloc_init(void) { hotcpu_notifier(page_alloc_cpu_notify, 0); + local_irq_lock_init(pa_lock); } + /* +@@ -5871,11 +5892,11 @@ static int __meminit __zone_pcp_update(v + pset = per_cpu_ptr(zone->pageset, cpu); + pcp = &pset->pcp; + +- local_irq_save(flags); ++ cpu_lock_irqsave(cpu, flags); + if (pcp->count > 0) + free_pcppages_bulk(zone, pcp->count, pcp); + setup_pageset(pset, batch); +- local_irq_restore(flags); ++ cpu_unlock_irqrestore(cpu, flags); + } + return 0; + } +@@ -5892,12 +5913,12 @@ void zone_pcp_reset(struct zone *zone) + unsigned long flags; + + /* avoid races with drain_pages() */ +- local_irq_save(flags); ++ local_lock_irqsave(pa_lock, flags); + if (zone->pageset != &boot_pageset) { + free_percpu(zone->pageset); + zone->pageset = &boot_pageset; + } +- local_irq_restore(flags); ++ local_unlock_irqrestore(pa_lock, flags); + } + /* diff --git a/debian/patches/features/all/rt/0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch b/debian/patches/features/all/rt/mm-prepare-pf-disable-discoupling.patch similarity index 73% rename from debian/patches/features/all/rt/0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch rename to debian/patches/features/all/rt/mm-prepare-pf-disable-discoupling.patch index 42e870724..7df71070b 100644 --- a/debian/patches/features/all/rt/0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch +++ b/debian/patches/features/all/rt/mm-prepare-pf-disable-discoupling.patch @@ -1,13 +1,13 @@ -From d3010bc0bc13e844bc58c96da28f481604988e28 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:37 -0500 -Subject: [032/256] mm: Prepare decoupling the page fault disabling logic +Subject: mm: Prepare decoupling the page fault disabling logic Add a pagefault_disabled variable to task_struct to allow decoupling the pagefault-disabled logic from the preempt count. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- include/linux/sched.h | 1 + include/linux/uaccess.h | 33 +++------------------------------ @@ -15,11 +15,11 @@ Signed-off-by: Thomas Gleixner mm/memory.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 30 deletions(-) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index bd5caa1..f0ee37f 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1478,6 +1478,7 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1448,6 +1448,7 @@ struct task_struct { /* mutex deadlock detection */ struct mutex_waiter *blocked_on; #endif @@ -27,10 +27,10 @@ index bd5caa1..f0ee37f 100644 #ifdef CONFIG_TRACE_IRQFLAGS unsigned int irq_events; unsigned long hardirq_enable_ip; -diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h -index 5ca0951..9414a1b 100644 ---- a/include/linux/uaccess.h -+++ b/include/linux/uaccess.h +Index: linux-stable/include/linux/uaccess.h +=================================================================== +--- linux-stable.orig/include/linux/uaccess.h ++++ linux-stable/include/linux/uaccess.h @@ -6,37 +6,10 @@ /* @@ -72,11 +72,11 @@ index 5ca0951..9414a1b 100644 #ifndef ARCH_HAS_NOCACHE_UACCESS -diff --git a/kernel/fork.c b/kernel/fork.c -index b767e68..fdf0795 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1265,6 +1265,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -1298,6 +1298,7 @@ static struct task_struct *copy_process( p->hardirq_context = 0; p->softirq_context = 0; #endif @@ -84,11 +84,11 @@ index b767e68..fdf0795 100644 #ifdef CONFIG_LOCKDEP p->lockdep_depth = 0; /* no locks held yet */ p->curr_chain_key = 0; -diff --git a/mm/memory.c b/mm/memory.c -index 6105f47..c3b9c80 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -3467,6 +3467,35 @@ unlock: +Index: linux-stable/mm/memory.c +=================================================================== +--- linux-stable.orig/mm/memory.c ++++ linux-stable/mm/memory.c +@@ -3484,6 +3484,35 @@ unlock: return 0; } diff --git a/debian/patches/features/all/rt/0197-mm-protect-activate-switch-mm.patch.patch b/debian/patches/features/all/rt/mm-protect-activate-switch-mm.patch similarity index 63% rename from debian/patches/features/all/rt/0197-mm-protect-activate-switch-mm.patch.patch rename to debian/patches/features/all/rt/mm-protect-activate-switch-mm.patch index 55ebd4085..8dd324a46 100644 --- a/debian/patches/features/all/rt/0197-mm-protect-activate-switch-mm.patch.patch +++ b/debian/patches/features/all/rt/mm-protect-activate-switch-mm.patch @@ -1,7 +1,6 @@ -From cdcb2a340e5ba784a9b7531ba1f5963076025b4b Mon Sep 17 00:00:00 2001 +Subject: mm-protect-activate-switch-mm.patch From: Thomas Gleixner -Date: Mon, 4 Jul 2011 09:48:40 +0200 -Subject: [197/256] mm-protect-activate-switch-mm.patch +Date: Mon, 04 Jul 2011 09:48:40 +0200 Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner mm/mmu_context.c | 2 ++ 2 files changed, 4 insertions(+) -diff --git a/fs/exec.c b/fs/exec.c -index b1fd202..db02d76 100644 ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -840,10 +840,12 @@ static int exec_mmap(struct mm_struct *mm) +Index: linux-stable/fs/exec.c +=================================================================== +--- linux-stable.orig/fs/exec.c ++++ linux-stable/fs/exec.c +@@ -836,10 +836,12 @@ static int exec_mmap(struct mm_struct *m } } task_lock(tsk); @@ -26,10 +25,10 @@ index b1fd202..db02d76 100644 task_unlock(tsk); arch_pick_mmap_layout(mm); if (old_mm) { -diff --git a/mm/mmu_context.c b/mm/mmu_context.c -index 3dcfaf4..8ca7e6b 100644 ---- a/mm/mmu_context.c -+++ b/mm/mmu_context.c +Index: linux-stable/mm/mmu_context.c +=================================================================== +--- linux-stable.orig/mm/mmu_context.c ++++ linux-stable/mm/mmu_context.c @@ -26,6 +26,7 @@ void use_mm(struct mm_struct *mm) struct task_struct *tsk = current; diff --git a/debian/patches/features/all/rt/0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch b/debian/patches/features/all/rt/mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch similarity index 83% rename from debian/patches/features/all/rt/0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch rename to debian/patches/features/all/rt/mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch index b7e9ee1e1..cf7879551 100644 --- a/debian/patches/features/all/rt/0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch +++ b/debian/patches/features/all/rt/mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch @@ -1,8 +1,8 @@ -From 2c67da76777adecd1e2957e2e723f7c2981ea699 Mon Sep 17 00:00:00 2001 -From: Yong Zhang +Subject: mm: Protect activate_mm() by preempt_[disable%7Cenable]_rt() +From: Yong Zhang Date: Tue, 15 May 2012 13:53:56 +0800 -Subject: [198/256] mm: Protect activate_mm() by - preempt_[disable%7Cenable]_rt() + +From: Yong Zhang Otherwise there will be warning on ARM like below: @@ -37,11 +37,11 @@ Cc: Thomas Gleixner mm/mmu_context.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) -diff --git a/fs/exec.c b/fs/exec.c -index db02d76..9384953 100644 ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -840,12 +840,12 @@ static int exec_mmap(struct mm_struct *mm) +Index: linux-stable/fs/exec.c +=================================================================== +--- linux-stable.orig/fs/exec.c ++++ linux-stable/fs/exec.c +@@ -836,12 +836,12 @@ static int exec_mmap(struct mm_struct *m } } task_lock(tsk); @@ -56,10 +56,10 @@ index db02d76..9384953 100644 task_unlock(tsk); arch_pick_mmap_layout(mm); if (old_mm) { -diff --git a/mm/mmu_context.c b/mm/mmu_context.c -index 8ca7e6b..1385e48 100644 ---- a/mm/mmu_context.c -+++ b/mm/mmu_context.c +Index: linux-stable/mm/mmu_context.c +=================================================================== +--- linux-stable.orig/mm/mmu_context.c ++++ linux-stable/mm/mmu_context.c @@ -26,7 +26,7 @@ void use_mm(struct mm_struct *mm) struct task_struct *tsk = current; diff --git a/debian/patches/features/all/rt/0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch b/debian/patches/features/all/rt/mm-remove-preempt-count-from-pf.patch similarity index 66% rename from debian/patches/features/all/rt/0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch rename to debian/patches/features/all/rt/mm-remove-preempt-count-from-pf.patch index 3e8ddc944..5ba03dc2a 100644 --- a/debian/patches/features/all/rt/0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch +++ b/debian/patches/features/all/rt/mm-remove-preempt-count-from-pf.patch @@ -1,7 +1,6 @@ -From 8f56a24ee5c838e77eca3bafae7c3219123f6375 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sat, 25 Jul 2009 22:06:27 +0200 -Subject: [037/256] mm: Remove preempt count from pagefault disable/enable +Subject: mm: Remove preempt count from pagefault disable/enable Now that all users are cleaned up, we can remove the preemption count. @@ -10,11 +9,11 @@ Signed-off-by: Thomas Gleixner mm/memory.c | 7 ------- 1 file changed, 7 deletions(-) -diff --git a/mm/memory.c b/mm/memory.c -index e996afe..346246c 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -3470,7 +3470,6 @@ unlock: +Index: linux-stable/mm/memory.c +=================================================================== +--- linux-stable.orig/mm/memory.c ++++ linux-stable/mm/memory.c +@@ -3487,7 +3487,6 @@ unlock: #ifdef CONFIG_PREEMPT_RT_FULL void pagefault_disable(void) { @@ -22,7 +21,7 @@ index e996afe..346246c 100644 current->pagefault_disabled++; /* * make sure to have issued the store before a pagefault -@@ -3488,12 +3487,6 @@ void pagefault_enable(void) +@@ -3505,12 +3504,6 @@ void pagefault_enable(void) */ barrier(); current->pagefault_disabled--; diff --git a/debian/patches/features/all/rt/0227-mm-rt-kmap_atomic-scheduling.patch b/debian/patches/features/all/rt/mm-rt-kmap-atomic-scheduling.patch similarity index 77% rename from debian/patches/features/all/rt/0227-mm-rt-kmap_atomic-scheduling.patch rename to debian/patches/features/all/rt/mm-rt-kmap-atomic-scheduling.patch index b6b0ca16d..84a6f070d 100644 --- a/debian/patches/features/all/rt/0227-mm-rt-kmap_atomic-scheduling.patch +++ b/debian/patches/features/all/rt/mm-rt-kmap-atomic-scheduling.patch @@ -1,7 +1,6 @@ -From f7c2456d5d8fa2dfc1b2e91fb6e9a750472c168a Mon Sep 17 00:00:00 2001 +Subject: mm, rt: kmap_atomic scheduling From: Peter Zijlstra Date: Thu, 28 Jul 2011 10:43:51 +0200 -Subject: [227/256] mm, rt: kmap_atomic scheduling In fact, with migrate_disable() existing one could play games with kmap_atomic. You could save/restore the kmap_atomic slots on context @@ -21,10 +20,10 @@ Link: http://lkml.kernel.org/r/1311842631.5890.208.camel@twins mm/memory.c | 2 ++ 3 files changed, 43 insertions(+) -diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c -index ae68473..2b0882a 100644 ---- a/arch/x86/kernel/process_32.c -+++ b/arch/x86/kernel/process_32.c +Index: linux-stable/arch/x86/kernel/process_32.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/process_32.c ++++ linux-stable/arch/x86/kernel/process_32.c @@ -36,6 +36,7 @@ #include #include @@ -33,7 +32,7 @@ index ae68473..2b0882a 100644 #include #include -@@ -285,6 +286,41 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) +@@ -276,6 +277,41 @@ __switch_to(struct task_struct *prev_p, task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT)) __switch_to_xtra(prev_p, next_p, tss); @@ -75,10 +74,10 @@ index ae68473..2b0882a 100644 /* * Leave lazy mode, flushing any hypercalls made here. * This must be done before restoring TLS segments so -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 372c15d..7fc8321 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h @@ -63,6 +63,7 @@ struct sched_param { #include #include @@ -87,7 +86,7 @@ index 372c15d..7fc8321 100644 #include #include #include -@@ -1647,6 +1648,10 @@ struct task_struct { +@@ -1619,6 +1620,10 @@ struct task_struct { struct rcu_head put_rcu; int softirq_nestcnt; #endif @@ -98,11 +97,11 @@ index 372c15d..7fc8321 100644 }; #ifdef CONFIG_PREEMPT_RT_FULL -diff --git a/mm/memory.c b/mm/memory.c -index 68676fd..c63016b 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -3470,6 +3470,7 @@ unlock: +Index: linux-stable/mm/memory.c +=================================================================== +--- linux-stable.orig/mm/memory.c ++++ linux-stable/mm/memory.c +@@ -3487,6 +3487,7 @@ unlock: #ifdef CONFIG_PREEMPT_RT_FULL void pagefault_disable(void) { @@ -110,7 +109,7 @@ index 68676fd..c63016b 100644 current->pagefault_disabled++; /* * make sure to have issued the store before a pagefault -@@ -3487,6 +3488,7 @@ void pagefault_enable(void) +@@ -3504,6 +3505,7 @@ void pagefault_enable(void) */ barrier(); current->pagefault_disabled--; diff --git a/debian/patches/features/all/rt/0073-mm-scatterlist-dont-disable-irqs-on-RT.patch b/debian/patches/features/all/rt/mm-scatterlist-dont-disable-irqs-on-RT.patch similarity index 58% rename from debian/patches/features/all/rt/0073-mm-scatterlist-dont-disable-irqs-on-RT.patch rename to debian/patches/features/all/rt/mm-scatterlist-dont-disable-irqs-on-RT.patch index 78ad07327..cc45e7ab1 100644 --- a/debian/patches/features/all/rt/0073-mm-scatterlist-dont-disable-irqs-on-RT.patch +++ b/debian/patches/features/all/rt/mm-scatterlist-dont-disable-irqs-on-RT.patch @@ -1,18 +1,17 @@ -From 10363e4d2e1b02b302153afcf3d80b2cbe953efa Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:34 -0500 -Subject: [073/256] mm: scatterlist dont disable irqs on RT +Subject: mm: scatterlist dont disable irqs on RT Signed-off-by: Thomas Gleixner --- lib/scatterlist.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/lib/scatterlist.c b/lib/scatterlist.c -index 6096e89..4becb6d 100644 ---- a/lib/scatterlist.c -+++ b/lib/scatterlist.c -@@ -423,7 +423,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) +Index: linux-stable/lib/scatterlist.c +=================================================================== +--- linux-stable.orig/lib/scatterlist.c ++++ linux-stable/lib/scatterlist.c +@@ -479,7 +479,7 @@ void sg_miter_stop(struct sg_mapping_ite flush_kernel_dcache_page(miter->page); if (miter->__flags & SG_MITER_ATOMIC) { @@ -21,7 +20,7 @@ index 6096e89..4becb6d 100644 kunmap_atomic(miter->addr); } else kunmap(miter->page); -@@ -463,7 +463,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, +@@ -519,7 +519,7 @@ static size_t sg_copy_buffer(struct scat sg_miter_start(&miter, sgl, nents, sg_flags); @@ -30,7 +29,7 @@ index 6096e89..4becb6d 100644 while (sg_miter_next(&miter) && offset < buflen) { unsigned int len; -@@ -480,7 +480,7 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents, +@@ -536,7 +536,7 @@ static size_t sg_copy_buffer(struct scat sg_miter_stop(&miter); diff --git a/debian/patches/features/all/rt/0098-mm-shrink-the-page-frame-to-rt-size.patch b/debian/patches/features/all/rt/mm-shrink-the-page-frame-to-rt-size.patch similarity index 82% rename from debian/patches/features/all/rt/0098-mm-shrink-the-page-frame-to-rt-size.patch rename to debian/patches/features/all/rt/mm-shrink-the-page-frame-to-rt-size.patch index 842e4f41e..2f6279302 100644 --- a/debian/patches/features/all/rt/0098-mm-shrink-the-page-frame-to-rt-size.patch +++ b/debian/patches/features/all/rt/mm-shrink-the-page-frame-to-rt-size.patch @@ -1,7 +1,6 @@ -From 897fe5d6334572eb8c79adf32823f0b602b53f27 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 3 Jul 2009 08:44:54 -0500 -Subject: [098/256] mm: shrink the page frame to !-rt size +Subject: mm: shrink the page frame to !-rt size He below is a boot-tested hack to shrink the page frame size back to normal. @@ -11,17 +10,18 @@ page-frames. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner + --- include/linux/mm.h | 46 +++++++++++++++++++++++++++++++++++++++------- include/linux/mm_types.h | 6 +++++- mm/memory.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 8 deletions(-) -diff --git a/include/linux/mm.h b/include/linux/mm.h -index 74aa71b..7e11734 100644 ---- a/include/linux/mm.h -+++ b/include/linux/mm.h -@@ -1200,27 +1200,59 @@ static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long a +Index: linux-stable/include/linux/mm.h +=================================================================== +--- linux-stable.orig/include/linux/mm.h ++++ linux-stable/include/linux/mm.h +@@ -1225,27 +1225,59 @@ static inline pmd_t *pmd_alloc(struct mm * overflow into the next struct page (as it might with DEBUG_SPINLOCK). * When freeing, reset page->mapping so free_pages_check won't complain. */ @@ -88,11 +88,11 @@ index 74aa71b..7e11734 100644 static inline void pgtable_page_dtor(struct page *page) { pte_lock_deinit(page); -diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h -index 3cc3062..e70ea9b 100644 ---- a/include/linux/mm_types.h -+++ b/include/linux/mm_types.h -@@ -118,7 +118,11 @@ struct page { +Index: linux-stable/include/linux/mm_types.h +=================================================================== +--- linux-stable.orig/include/linux/mm_types.h ++++ linux-stable/include/linux/mm_types.h +@@ -145,7 +145,11 @@ struct page { * system if PG_buddy is set. */ #if USE_SPLIT_PTLOCKS @@ -105,11 +105,11 @@ index 3cc3062..e70ea9b 100644 #endif struct kmem_cache *slab; /* SLUB: Pointer to slab */ struct page *first_page; /* Compound tail pages */ -diff --git a/mm/memory.c b/mm/memory.c -index 346246c..68676fd 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -4033,3 +4033,35 @@ void copy_user_huge_page(struct page *dst, struct page *src, +Index: linux-stable/mm/memory.c +=================================================================== +--- linux-stable.orig/mm/memory.c ++++ linux-stable/mm/memory.c +@@ -4062,3 +4062,35 @@ void copy_user_huge_page(struct page *ds } } #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */ diff --git a/debian/patches/features/all/rt/mm-slab-fix-potential-deadlock.patch b/debian/patches/features/all/rt/mm-slab-fix-potential-deadlock.patch new file mode 100644 index 000000000..80e926842 --- /dev/null +++ b/debian/patches/features/all/rt/mm-slab-fix-potential-deadlock.patch @@ -0,0 +1,122 @@ +Subject: mm: slab: Fix potential deadlock +From: Thomas Gleixner +Date: Wed, 26 Sep 2012 16:20:00 +0200 + + ============================================= +[ INFO: possible recursive locking detected ] + 3.6.0-rt1+ #49 Not tainted + --------------------------------------------- + swapper/0/1 is trying to acquire lock: + lock_slab_on+0x72/0x77 + + but task is already holding lock: + __local_lock_irq+0x24/0x77 + + other info that might help us debug this: + Possible unsafe locking scenario: + + CPU0 + ---- + lock(&per_cpu(slab_lock, __cpu).lock); + lock(&per_cpu(slab_lock, __cpu).lock); + + *** DEADLOCK *** + + May be due to missing lock nesting notation + + 2 locks held by swapper/0/1: + kmem_cache_create+0x33/0x89 + __local_lock_irq+0x24/0x77 + + stack backtrace: + Pid: 1, comm: swapper/0 Not tainted 3.6.0-rt1+ #49 + Call Trace: + __lock_acquire+0x9a4/0xdc4 + ? __local_lock_irq+0x24/0x77 + ? lock_slab_on+0x72/0x77 + lock_acquire+0xc4/0x108 + ? lock_slab_on+0x72/0x77 + ? unlock_slab_on+0x5b/0x5b + rt_spin_lock+0x36/0x3d + ? lock_slab_on+0x72/0x77 + ? migrate_disable+0x85/0x93 + lock_slab_on+0x72/0x77 + do_ccupdate_local+0x19/0x44 + slab_on_each_cpu+0x36/0x5a + do_tune_cpucache+0xc1/0x305 + enable_cpucache+0x8c/0xb5 + setup_cpu_cache+0x28/0x182 + __kmem_cache_create+0x34b/0x380 + ? shmem_mount+0x1a/0x1a + kmem_cache_create+0x4a/0x89 + ? shmem_mount+0x1a/0x1a + shmem_init+0x3e/0xd4 + kernel_init+0x11c/0x214 + kernel_thread_helper+0x4/0x10 + ? retint_restore_args+0x13/0x13 + ? start_kernel+0x3bc/0x3bc + ? gs_change+0x13/0x13 + +It's not a missing annotation. It's simply wrong code and needs to be +fixed. Instead of nesting the local and the remote cpu lock simply +acquire only the remote cpu lock, which is sufficient protection for +this procedure. + +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +--- + include/linux/locallock.h | 8 ++++++++ + mm/slab.c | 10 ++-------- + 2 files changed, 10 insertions(+), 8 deletions(-) + +Index: linux-stable/include/linux/locallock.h +=================================================================== +--- linux-stable.orig/include/linux/locallock.h ++++ linux-stable/include/linux/locallock.h +@@ -96,6 +96,9 @@ static inline void __local_lock_irq(stru + #define local_lock_irq(lvar) \ + do { __local_lock_irq(&get_local_var(lvar)); } while (0) + ++#define local_lock_irq_on(lvar, cpu) \ ++ do { __local_lock_irq(&per_cpu(lvar, cpu)); } while (0) ++ + static inline void __local_unlock_irq(struct local_irq_lock *lv) + { + LL_WARN(!lv->nestcnt); +@@ -111,6 +114,11 @@ static inline void __local_unlock_irq(st + put_local_var(lvar); \ + } while (0) + ++#define local_unlock_irq_on(lvar, cpu) \ ++ do { \ ++ __local_unlock_irq(&per_cpu(lvar, cpu)); \ ++ } while (0) ++ + static inline int __local_lock_irqsave(struct local_irq_lock *lv) + { + if (lv->owner != current) { +Index: linux-stable/mm/slab.c +=================================================================== +--- linux-stable.orig/mm/slab.c ++++ linux-stable/mm/slab.c +@@ -728,18 +728,12 @@ slab_on_each_cpu(void (*func)(void *arg, + + static void lock_slab_on(unsigned int cpu) + { +- if (cpu == smp_processor_id()) +- local_lock_irq(slab_lock); +- else +- local_spin_lock_irq(slab_lock, &per_cpu(slab_lock, cpu).lock); ++ local_lock_irq_on(slab_lock, cpu); + } + + static void unlock_slab_on(unsigned int cpu) + { +- if (cpu == smp_processor_id()) +- local_unlock_irq(slab_lock); +- else +- local_spin_unlock_irq(slab_lock, &per_cpu(slab_lock, cpu).lock); ++ local_unlock_irq_on(slab_lock, cpu); + } + #endif + diff --git a/debian/patches/features/all/rt/0092-mm-More-lock-breaks-in-slab.c.patch b/debian/patches/features/all/rt/mm-slab-more-lock-breaks.patch similarity index 73% rename from debian/patches/features/all/rt/0092-mm-More-lock-breaks-in-slab.c.patch rename to debian/patches/features/all/rt/mm-slab-more-lock-breaks.patch index 989586e68..77efcc095 100644 --- a/debian/patches/features/all/rt/0092-mm-More-lock-breaks-in-slab.c.patch +++ b/debian/patches/features/all/rt/mm-slab-more-lock-breaks.patch @@ -1,22 +1,22 @@ -From bddd60cbc825f7aefb1e62101b454d0410cb47c6 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 3 Jul 2009 08:44:43 -0500 -Subject: [092/256] mm: More lock breaks in slab.c +Subject: mm: More lock breaks in slab.c Handle __free_pages outside of the locked regions. This reduces the lock contention on the percpu slab locks in -rt significantly. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner ---- - mm/slab.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 68 insertions(+), 22 deletions(-) -diff --git a/mm/slab.c b/mm/slab.c -index 341748b..15bce6b 100644 ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -727,6 +727,7 @@ static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) +--- + mm/slab.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 86 insertions(+), 22 deletions(-) + +Index: linux-stable/mm/slab.c +=================================================================== +--- linux-stable.orig/mm/slab.c ++++ linux-stable/mm/slab.c +@@ -704,6 +704,7 @@ static void slab_set_debugobj_lock_class #endif static DEFINE_PER_CPU(struct delayed_work, slab_reap_work); @@ -24,16 +24,34 @@ index 341748b..15bce6b 100644 static DEFINE_LOCAL_IRQ_LOCK(slab_lock); #ifndef CONFIG_PREEMPT_RT_BASE -@@ -742,14 +743,39 @@ slab_on_each_cpu(void (*func)(void *arg, int this_cpu), void *arg) +@@ -719,14 +720,57 @@ slab_on_each_cpu(void (*func)(void *arg, { unsigned int i; - for_each_online_cpu(i) { - spin_lock_irq(&per_cpu(slab_lock, i).lock); ++ get_cpu_light(); + for_each_online_cpu(i) func(arg, i); - spin_unlock_irq(&per_cpu(slab_lock, i).lock); - } ++ put_cpu_light(); ++} ++ ++static void lock_slab_on(unsigned int cpu) ++{ ++ if (cpu == smp_processor_id()) ++ local_lock_irq(slab_lock); ++ else ++ local_spin_lock_irq(slab_lock, &per_cpu(slab_lock, cpu).lock); ++} ++ ++static void unlock_slab_on(unsigned int cpu) ++{ ++ if (cpu == smp_processor_id()) ++ local_unlock_irq(slab_lock); ++ else ++ local_spin_unlock_irq(slab_lock, &per_cpu(slab_lock, cpu).lock); } #endif @@ -68,7 +86,7 @@ index 341748b..15bce6b 100644 static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep) { return cachep->array[smp_processor_id()]; -@@ -1245,7 +1271,7 @@ static void __cpuinit cpuup_canceled(long cpu) +@@ -1340,7 +1384,7 @@ static void __cpuinit cpuup_canceled(lon free_block(cachep, nc->entry, nc->avail, node); if (!cpumask_empty(mask)) { @@ -77,7 +95,7 @@ index 341748b..15bce6b 100644 goto free_array_cache; } -@@ -1259,7 +1285,7 @@ static void __cpuinit cpuup_canceled(long cpu) +@@ -1354,7 +1398,7 @@ static void __cpuinit cpuup_canceled(lon alien = l3->alien; l3->alien = NULL; @@ -86,7 +104,7 @@ index 341748b..15bce6b 100644 kfree(shared); if (alien) { -@@ -1540,6 +1566,8 @@ void __init kmem_cache_init(void) +@@ -1635,6 +1679,8 @@ void __init kmem_cache_init(void) use_alien_caches = 0; local_irq_lock_init(slab_lock); @@ -95,7 +113,7 @@ index 341748b..15bce6b 100644 for (i = 0; i < NUM_INIT_LISTS; i++) { kmem_list3_init(&initkmem_list3[i]); -@@ -1868,12 +1896,14 @@ static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid) +@@ -1973,12 +2019,14 @@ static void *kmem_getpages(struct kmem_c /* * Interface to system's page release. */ @@ -112,7 +130,7 @@ index 341748b..15bce6b 100644 kmemcheck_free_shadow(page, cachep->gfporder); if (cachep->flags & SLAB_RECLAIM_ACCOUNT) -@@ -1889,7 +1919,13 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr) +@@ -1995,7 +2043,13 @@ static void kmem_freepages(struct kmem_c } if (current->reclaim_state) current->reclaim_state->reclaimed_slab += nr_freed; @@ -127,7 +145,7 @@ index 341748b..15bce6b 100644 } static void kmem_rcu_free(struct rcu_head *head) -@@ -1897,7 +1933,7 @@ static void kmem_rcu_free(struct rcu_head *head) +@@ -2003,7 +2057,7 @@ static void kmem_rcu_free(struct rcu_hea struct slab_rcu *slab_rcu = (struct slab_rcu *)head; struct kmem_cache *cachep = slab_rcu->cachep; @@ -136,7 +154,7 @@ index 341748b..15bce6b 100644 if (OFF_SLAB(cachep)) kmem_cache_free(cachep->slabp_cache, slab_rcu); } -@@ -2116,7 +2152,8 @@ static void slab_destroy_debugcheck(struct kmem_cache *cachep, struct slab *slab +@@ -2222,7 +2276,8 @@ static void slab_destroy_debugcheck(stru * Before calling the slab must have been unlinked from the cache. The * cache-lock is not held/needed. */ @@ -146,7 +164,7 @@ index 341748b..15bce6b 100644 { void *addr = slabp->s_mem - slabp->colouroff; -@@ -2129,7 +2166,7 @@ static void slab_destroy(struct kmem_cache *cachep, struct slab *slabp) +@@ -2235,7 +2290,7 @@ static void slab_destroy(struct kmem_cac slab_rcu->addr = addr; call_rcu(&slab_rcu->head, kmem_rcu_free); } else { @@ -155,7 +173,7 @@ index 341748b..15bce6b 100644 if (OFF_SLAB(cachep)) kmem_cache_free(cachep->slabp_cache, slabp); } -@@ -2651,9 +2688,15 @@ static void do_drain(void *arg) +@@ -2700,9 +2755,15 @@ static void do_drain(void *arg) __do_drain(arg, smp_processor_id()); } #else @@ -165,15 +183,15 @@ index 341748b..15bce6b 100644 - __do_drain(arg, this_cpu); + LIST_HEAD(tmp); + -+ spin_lock_irq(&per_cpu(slab_lock, cpu).lock); ++ lock_slab_on(cpu); + __do_drain(arg, cpu); + list_splice_init(&per_cpu(slab_free_list, cpu), &tmp); -+ spin_unlock_irq(&per_cpu(slab_lock, cpu).lock); ++ unlock_slab_on(cpu); + free_delayed(&tmp); } #endif -@@ -2711,7 +2754,7 @@ static int drain_freelist(struct kmem_cache *cache, +@@ -2760,7 +2821,7 @@ static int drain_freelist(struct kmem_ca */ l3->free_objects -= cache->num; local_spin_unlock_irq(slab_lock, &l3->list_lock); @@ -182,7 +200,7 @@ index 341748b..15bce6b 100644 nr_freed++; } out: -@@ -3046,7 +3089,7 @@ static int cache_grow(struct kmem_cache *cachep, +@@ -3095,7 +3156,7 @@ static int cache_grow(struct kmem_cache spin_unlock(&l3->list_lock); return 1; opps1: @@ -191,7 +209,7 @@ index 341748b..15bce6b 100644 failed: if (local_flags & __GFP_WAIT) local_lock_irq(slab_lock); -@@ -3700,7 +3743,7 @@ static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects, +@@ -3772,7 +3833,7 @@ static void free_block(struct kmem_cache * a different cache, refer to comments before * alloc_slabmgmt. */ @@ -200,8 +218,8 @@ index 341748b..15bce6b 100644 } else { list_add(&slabp->list, &l3->slabs_free); } -@@ -3967,7 +4010,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp) - debug_check_no_obj_freed(objp, obj_size(cachep)); +@@ -4039,7 +4100,7 @@ void kmem_cache_free(struct kmem_cache * + debug_check_no_obj_freed(objp, cachep->object_size); local_lock_irqsave(slab_lock, flags); __cache_free(cachep, objp, __builtin_return_address(0)); - local_unlock_irqrestore(slab_lock, flags); @@ -209,8 +227,8 @@ index 341748b..15bce6b 100644 trace_kmem_cache_free(_RET_IP_, objp); } -@@ -3997,7 +4040,7 @@ void kfree(const void *objp) - debug_check_no_obj_freed(objp, obj_size(c)); +@@ -4070,7 +4131,7 @@ void kfree(const void *objp) + debug_check_no_obj_freed(objp, c->object_size); local_lock_irqsave(slab_lock, flags); __cache_free(c, (void *)objp, __builtin_return_address(0)); - local_unlock_irqrestore(slab_lock, flags); @@ -218,7 +236,7 @@ index 341748b..15bce6b 100644 } EXPORT_SYMBOL(kfree); -@@ -4053,7 +4096,8 @@ static int alloc_kmemlist(struct kmem_cache *cachep, gfp_t gfp) +@@ -4126,7 +4187,8 @@ static int alloc_kmemlist(struct kmem_ca } l3->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + cachep->num; @@ -228,17 +246,17 @@ index 341748b..15bce6b 100644 kfree(shared); free_alien_cache(new_alien); continue; -@@ -4119,7 +4163,9 @@ static void do_ccupdate_local(void *info) +@@ -4192,7 +4254,9 @@ static void do_ccupdate_local(void *info #else static void do_ccupdate_local(void *info, int cpu) { -+ spin_lock_irq(&per_cpu(slab_lock, cpu).lock); ++ lock_slab_on(cpu); __do_ccupdate_local(info, cpu); -+ spin_unlock_irq(&per_cpu(slab_lock, cpu).lock); ++ unlock_slab_on(cpu); } #endif -@@ -4161,8 +4207,8 @@ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, +@@ -4234,8 +4298,8 @@ static int do_tune_cpucache(struct kmem_ local_spin_lock_irq(slab_lock, &cachep->nodelists[cpu_to_mem(i)]->list_lock); free_block(cachep, ccold->entry, ccold->avail, cpu_to_mem(i)); diff --git a/debian/patches/features/all/rt/0044-mm-slab-move-debug-out.patch.patch b/debian/patches/features/all/rt/mm-slab-move-debug-out.patch similarity index 54% rename from debian/patches/features/all/rt/0044-mm-slab-move-debug-out.patch.patch rename to debian/patches/features/all/rt/mm-slab-move-debug-out.patch index 472094b27..6fc8444cd 100644 --- a/debian/patches/features/all/rt/0044-mm-slab-move-debug-out.patch.patch +++ b/debian/patches/features/all/rt/mm-slab-move-debug-out.patch @@ -1,38 +1,38 @@ -From 9fb211972c1f2b363434b729fbea6e2d0c6958da Mon Sep 17 00:00:00 2001 +Subject: mm-slab-move-debug-out.patch From: Thomas Gleixner Date: Mon, 20 Jun 2011 10:42:04 +0200 -Subject: [044/256] mm-slab-move-debug-out.patch Signed-off-by: Thomas Gleixner --- mm/slab.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/mm/slab.c b/mm/slab.c -index 1fd4b4d..80c57f9 100644 ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -3919,10 +3919,10 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp) +Index: linux-stable/mm/slab.c +=================================================================== +--- linux-stable.orig/mm/slab.c ++++ linux-stable/mm/slab.c +@@ -3991,10 +3991,10 @@ void kmem_cache_free(struct kmem_cache * { unsigned long flags; - local_irq_save(flags); - debug_check_no_locks_freed(objp, obj_size(cachep)); + debug_check_no_locks_freed(objp, cachep->object_size); if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) - debug_check_no_obj_freed(objp, obj_size(cachep)); + debug_check_no_obj_freed(objp, cachep->object_size); + local_irq_save(flags); __cache_free(cachep, objp, __builtin_return_address(0)); local_irq_restore(flags); -@@ -3948,11 +3948,11 @@ void kfree(const void *objp) +@@ -4020,12 +4020,12 @@ void kfree(const void *objp) if (unlikely(ZERO_OR_NULL_PTR(objp))) return; - local_irq_save(flags); kfree_debugcheck(objp); c = virt_to_cache(objp); - debug_check_no_locks_freed(objp, obj_size(c)); - debug_check_no_obj_freed(objp, obj_size(c)); + debug_check_no_locks_freed(objp, c->object_size); + + debug_check_no_obj_freed(objp, c->object_size); + local_irq_save(flags); __cache_free(c, (void *)objp, __builtin_return_address(0)); local_irq_restore(flags); diff --git a/debian/patches/features/all/rt/0090-mm-slab-wrap-functions.patch.patch b/debian/patches/features/all/rt/mm-slab-wrap-functions.patch similarity index 75% rename from debian/patches/features/all/rt/0090-mm-slab-wrap-functions.patch.patch rename to debian/patches/features/all/rt/mm-slab-wrap-functions.patch index f6d174494..1758e6214 100644 --- a/debian/patches/features/all/rt/0090-mm-slab-wrap-functions.patch.patch +++ b/debian/patches/features/all/rt/mm-slab-wrap-functions.patch @@ -1,26 +1,25 @@ -From 001bf667d6da07247e9095511873be13551328a2 Mon Sep 17 00:00:00 2001 +Subject: mm-slab-wrap-functions.patch From: Thomas Gleixner Date: Sat, 18 Jun 2011 19:44:43 +0200 -Subject: [090/256] mm-slab-wrap-functions.patch Signed-off-by: Thomas Gleixner --- - mm/slab.c | 152 ++++++++++++++++++++++++++++++++++++++++++------------------- - 1 file changed, 104 insertions(+), 48 deletions(-) + mm/slab.c | 154 ++++++++++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 105 insertions(+), 49 deletions(-) -diff --git a/mm/slab.c b/mm/slab.c -index 80c57f9..dc84364 100644 ---- a/mm/slab.c -+++ b/mm/slab.c -@@ -116,6 +116,7 @@ +Index: linux-stable/mm/slab.c +=================================================================== +--- linux-stable.orig/mm/slab.c ++++ linux-stable/mm/slab.c +@@ -117,6 +117,7 @@ #include #include #include +#include - #include - #include -@@ -726,12 +727,40 @@ static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) + #include + +@@ -703,12 +704,40 @@ static void slab_set_debugobj_lock_class #endif static DEFINE_PER_CPU(struct delayed_work, slab_reap_work); @@ -61,7 +60,7 @@ index 80c57f9..dc84364 100644 static inline struct kmem_cache *__find_general_cachep(size_t size, gfp_t gfpflags) { -@@ -1080,9 +1109,10 @@ static void reap_alien(struct kmem_cache *cachep, struct kmem_list3 *l3) +@@ -1175,9 +1204,10 @@ static void reap_alien(struct kmem_cache if (l3->alien) { struct array_cache *ac = l3->alien[node]; @@ -74,7 +73,7 @@ index 80c57f9..dc84364 100644 } } } -@@ -1097,9 +1127,9 @@ static void drain_alien_cache(struct kmem_cache *cachep, +@@ -1192,9 +1222,9 @@ static void drain_alien_cache(struct kme for_each_online_node(i) { ac = alien[i]; if (ac) { @@ -86,7 +85,7 @@ index 80c57f9..dc84364 100644 } } } -@@ -1178,11 +1208,11 @@ static int init_cache_nodelists_node(int node) +@@ -1273,11 +1303,11 @@ static int init_cache_nodelists_node(int cachep->nodelists[node] = l3; } @@ -100,7 +99,7 @@ index 80c57f9..dc84364 100644 } return 0; } -@@ -1207,7 +1237,7 @@ static void __cpuinit cpuup_canceled(long cpu) +@@ -1302,7 +1332,7 @@ static void __cpuinit cpuup_canceled(lon if (!l3) goto free_array_cache; @@ -109,7 +108,7 @@ index 80c57f9..dc84364 100644 /* Free limit for this kmem_list3 */ l3->free_limit -= cachep->batchcount; -@@ -1215,7 +1245,7 @@ static void __cpuinit cpuup_canceled(long cpu) +@@ -1310,7 +1340,7 @@ static void __cpuinit cpuup_canceled(lon free_block(cachep, nc->entry, nc->avail, node); if (!cpumask_empty(mask)) { @@ -118,7 +117,7 @@ index 80c57f9..dc84364 100644 goto free_array_cache; } -@@ -1229,7 +1259,7 @@ static void __cpuinit cpuup_canceled(long cpu) +@@ -1324,7 +1354,7 @@ static void __cpuinit cpuup_canceled(lon alien = l3->alien; l3->alien = NULL; @@ -127,7 +126,7 @@ index 80c57f9..dc84364 100644 kfree(shared); if (alien) { -@@ -1303,7 +1333,7 @@ static int __cpuinit cpuup_prepare(long cpu) +@@ -1398,7 +1428,7 @@ static int __cpuinit cpuup_prepare(long l3 = cachep->nodelists[node]; BUG_ON(!l3); @@ -136,7 +135,7 @@ index 80c57f9..dc84364 100644 if (!l3->shared) { /* * We are serialised from CPU_DEAD or -@@ -1318,7 +1348,7 @@ static int __cpuinit cpuup_prepare(long cpu) +@@ -1413,7 +1443,7 @@ static int __cpuinit cpuup_prepare(long alien = NULL; } #endif @@ -145,7 +144,7 @@ index 80c57f9..dc84364 100644 kfree(shared); free_alien_cache(alien); if (cachep->flags & SLAB_DEBUG_OBJECTS) -@@ -1509,6 +1539,8 @@ void __init kmem_cache_init(void) +@@ -1604,6 +1634,8 @@ void __init kmem_cache_init(void) if (num_possible_nodes() == 1) use_alien_caches = 0; @@ -154,7 +153,7 @@ index 80c57f9..dc84364 100644 for (i = 0; i < NUM_INIT_LISTS; i++) { kmem_list3_init(&initkmem_list3[i]); if (i < MAX_NUMNODES) -@@ -2565,7 +2597,7 @@ EXPORT_SYMBOL(kmem_cache_create); +@@ -2614,7 +2646,7 @@ __kmem_cache_create (const char *name, s #if DEBUG static void check_irq_off(void) { @@ -163,7 +162,7 @@ index 80c57f9..dc84364 100644 } static void check_irq_on(void) -@@ -2600,13 +2632,12 @@ static void drain_array(struct kmem_cache *cachep, struct kmem_list3 *l3, +@@ -2649,26 +2681,37 @@ static void drain_array(struct kmem_cach struct array_cache *ac, int force, int node); @@ -176,10 +175,11 @@ index 80c57f9..dc84364 100644 + int node = cpu_to_mem(cpu); - check_irq_off(); - ac = cpu_cache_get(cachep); +- ac = cpu_cache_get(cachep); ++ ac = cpu_cache_get_on_cpu(cachep, cpu); spin_lock(&cachep->nodelists[node]->list_lock); free_block(cachep, ac->entry, ac->avail, node); -@@ -2614,12 +2645,24 @@ static void do_drain(void *arg) + spin_unlock(&cachep->nodelists[node]->list_lock); ac->avail = 0; } @@ -205,7 +205,7 @@ index 80c57f9..dc84364 100644 check_irq_on(); for_each_online_node(node) { l3 = cachep->nodelists[node]; -@@ -2650,10 +2693,10 @@ static int drain_freelist(struct kmem_cache *cache, +@@ -2699,10 +2742,10 @@ static int drain_freelist(struct kmem_ca nr_freed = 0; while (nr_freed < tofree && !list_empty(&l3->slabs_free)) { @@ -218,7 +218,7 @@ index 80c57f9..dc84364 100644 goto out; } -@@ -2667,7 +2710,7 @@ static int drain_freelist(struct kmem_cache *cache, +@@ -2716,7 +2759,7 @@ static int drain_freelist(struct kmem_ca * to the cache. */ l3->free_objects -= cache->num; @@ -227,7 +227,7 @@ index 80c57f9..dc84364 100644 slab_destroy(cache, slabp); nr_freed++; } -@@ -2962,7 +3005,7 @@ static int cache_grow(struct kmem_cache *cachep, +@@ -3011,7 +3054,7 @@ static int cache_grow(struct kmem_cache offset *= cachep->colour_off; if (local_flags & __GFP_WAIT) @@ -236,7 +236,7 @@ index 80c57f9..dc84364 100644 /* * The test for missing atomic flag is performed here, rather than -@@ -2992,7 +3035,7 @@ static int cache_grow(struct kmem_cache *cachep, +@@ -3041,7 +3084,7 @@ static int cache_grow(struct kmem_cache cache_init_objs(cachep, slabp); if (local_flags & __GFP_WAIT) @@ -245,7 +245,7 @@ index 80c57f9..dc84364 100644 check_irq_off(); spin_lock(&l3->list_lock); -@@ -3006,7 +3049,7 @@ opps1: +@@ -3055,7 +3098,7 @@ opps1: kmem_freepages(cachep, objp); failed: if (local_flags & __GFP_WAIT) @@ -254,7 +254,7 @@ index 80c57f9..dc84364 100644 return 0; } -@@ -3400,11 +3443,11 @@ retry: +@@ -3469,11 +3512,11 @@ retry: * set and go into memory reserves if necessary. */ if (local_flags & __GFP_WAIT) @@ -268,7 +268,7 @@ index 80c57f9..dc84364 100644 if (obj) { /* * Insert into the appropriate per node queues -@@ -3522,7 +3565,7 @@ __cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid, +@@ -3591,7 +3634,7 @@ __cache_alloc_node(struct kmem_cache *ca return NULL; cache_alloc_debugcheck_before(cachep, flags); @@ -277,16 +277,16 @@ index 80c57f9..dc84364 100644 if (nodeid == NUMA_NO_NODE) nodeid = slab_node; -@@ -3547,7 +3590,7 @@ __cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid, +@@ -3616,7 +3659,7 @@ __cache_alloc_node(struct kmem_cache *ca /* ___cache_alloc_node can fall back to other nodes */ ptr = ____cache_alloc_node(cachep, flags, nodeid); out: - local_irq_restore(save_flags); + local_unlock_irqrestore(slab_lock, save_flags); ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, caller); - kmemleak_alloc_recursive(ptr, obj_size(cachep), 1, cachep->flags, + kmemleak_alloc_recursive(ptr, cachep->object_size, 1, cachep->flags, flags); -@@ -3607,9 +3650,9 @@ __cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller) +@@ -3676,9 +3719,9 @@ __cache_alloc(struct kmem_cache *cachep, return NULL; cache_alloc_debugcheck_before(cachep, flags); @@ -296,12 +296,12 @@ index 80c57f9..dc84364 100644 - local_irq_restore(save_flags); + local_unlock_irqrestore(slab_lock, save_flags); objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller); - kmemleak_alloc_recursive(objp, obj_size(cachep), 1, cachep->flags, + kmemleak_alloc_recursive(objp, cachep->object_size, 1, cachep->flags, flags); -@@ -3922,9 +3965,9 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp) - debug_check_no_locks_freed(objp, obj_size(cachep)); +@@ -3994,9 +4037,9 @@ void kmem_cache_free(struct kmem_cache * + debug_check_no_locks_freed(objp, cachep->object_size); if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) - debug_check_no_obj_freed(objp, obj_size(cachep)); + debug_check_no_obj_freed(objp, cachep->object_size); - local_irq_save(flags); + local_lock_irqsave(slab_lock, flags); __cache_free(cachep, objp, __builtin_return_address(0)); @@ -310,10 +310,10 @@ index 80c57f9..dc84364 100644 trace_kmem_cache_free(_RET_IP_, objp); } -@@ -3952,9 +3995,9 @@ void kfree(const void *objp) - c = virt_to_cache(objp); - debug_check_no_locks_freed(objp, obj_size(c)); - debug_check_no_obj_freed(objp, obj_size(c)); +@@ -4025,9 +4068,9 @@ void kfree(const void *objp) + debug_check_no_locks_freed(objp, c->object_size); + + debug_check_no_obj_freed(objp, c->object_size); - local_irq_save(flags); + local_lock_irqsave(slab_lock, flags); __cache_free(c, (void *)objp, __builtin_return_address(0)); @@ -322,7 +322,7 @@ index 80c57f9..dc84364 100644 } EXPORT_SYMBOL(kfree); -@@ -3997,7 +4040,7 @@ static int alloc_kmemlist(struct kmem_cache *cachep, gfp_t gfp) +@@ -4070,7 +4113,7 @@ static int alloc_kmemlist(struct kmem_ca if (l3) { struct array_cache *shared = l3->shared; @@ -331,7 +331,7 @@ index 80c57f9..dc84364 100644 if (shared) free_block(cachep, shared->entry, -@@ -4010,7 +4053,7 @@ static int alloc_kmemlist(struct kmem_cache *cachep, gfp_t gfp) +@@ -4083,7 +4126,7 @@ static int alloc_kmemlist(struct kmem_ca } l3->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + cachep->num; @@ -340,7 +340,7 @@ index 80c57f9..dc84364 100644 kfree(shared); free_alien_cache(new_alien); continue; -@@ -4057,17 +4100,28 @@ struct ccupdate_struct { +@@ -4130,17 +4173,28 @@ struct ccupdate_struct { struct array_cache *new[0]; }; @@ -372,9 +372,9 @@ index 80c57f9..dc84364 100644 +} +#endif - /* Always called with the cache_chain_mutex held */ + /* Always called with the slab_mutex held */ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, -@@ -4093,7 +4147,7 @@ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, +@@ -4166,7 +4220,7 @@ static int do_tune_cpucache(struct kmem_ } new->cachep = cachep; @@ -383,7 +383,7 @@ index 80c57f9..dc84364 100644 check_irq_on(); cachep->batchcount = batchcount; -@@ -4104,9 +4158,11 @@ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, +@@ -4177,9 +4231,11 @@ static int do_tune_cpucache(struct kmem_ struct array_cache *ccold = new->new[i]; if (!ccold) continue; @@ -397,7 +397,7 @@ index 80c57f9..dc84364 100644 kfree(ccold); } kfree(new); -@@ -4182,7 +4238,7 @@ static void drain_array(struct kmem_cache *cachep, struct kmem_list3 *l3, +@@ -4255,7 +4311,7 @@ static void drain_array(struct kmem_cach if (ac->touched && !force) { ac->touched = 0; } else { @@ -406,7 +406,7 @@ index 80c57f9..dc84364 100644 if (ac->avail) { tofree = force ? ac->avail : (ac->limit + 4) / 5; if (tofree > ac->avail) -@@ -4192,7 +4248,7 @@ static void drain_array(struct kmem_cache *cachep, struct kmem_list3 *l3, +@@ -4265,7 +4321,7 @@ static void drain_array(struct kmem_cach memmove(ac->entry, &(ac->entry[tofree]), sizeof(void *) * ac->avail); } @@ -415,7 +415,7 @@ index 80c57f9..dc84364 100644 } } -@@ -4331,7 +4387,7 @@ static int s_show(struct seq_file *m, void *p) +@@ -4404,7 +4460,7 @@ static int s_show(struct seq_file *m, vo continue; check_irq_on(); @@ -424,7 +424,7 @@ index 80c57f9..dc84364 100644 list_for_each_entry(slabp, &l3->slabs_full, list) { if (slabp->inuse != cachep->num && !error) -@@ -4356,7 +4412,7 @@ static int s_show(struct seq_file *m, void *p) +@@ -4429,7 +4485,7 @@ static int s_show(struct seq_file *m, vo if (l3->shared) shared_avail += l3->shared->avail; @@ -433,7 +433,7 @@ index 80c57f9..dc84364 100644 } num_slabs += active_slabs; num_objs = num_slabs * cachep->num; -@@ -4585,13 +4641,13 @@ static int leaks_show(struct seq_file *m, void *p) +@@ -4658,13 +4714,13 @@ static int leaks_show(struct seq_file *m continue; check_irq_on(); diff --git a/debian/patches/features/all/rt/0207-mm-vmalloc.patch.patch b/debian/patches/features/all/rt/mm-vmalloc-use-get-cpu-light.patch similarity index 68% rename from debian/patches/features/all/rt/0207-mm-vmalloc.patch.patch rename to debian/patches/features/all/rt/mm-vmalloc-use-get-cpu-light.patch index 16211e4d6..59d9bf44f 100644 --- a/debian/patches/features/all/rt/0207-mm-vmalloc.patch.patch +++ b/debian/patches/features/all/rt/mm-vmalloc-use-get-cpu-light.patch @@ -1,18 +1,17 @@ -From 05db36ad1189931deb244e393d42c684af76ef5e Mon Sep 17 00:00:00 2001 +Subject: mm-vmalloc.patch From: Thomas Gleixner Date: Tue, 12 Jul 2011 11:39:36 +0200 -Subject: [207/256] mm-vmalloc.patch Signed-off-by: Thomas Gleixner --- mm/vmalloc.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) -diff --git a/mm/vmalloc.c b/mm/vmalloc.c -index 1196c77..d049fbd 100644 ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -782,7 +782,7 @@ static struct vmap_block *new_vmap_block(gfp_t gfp_mask) +Index: linux-stable/mm/vmalloc.c +=================================================================== +--- linux-stable.orig/mm/vmalloc.c ++++ linux-stable/mm/vmalloc.c +@@ -782,7 +782,7 @@ static struct vmap_block *new_vmap_block struct vmap_block *vb; struct vmap_area *va; unsigned long vb_idx; @@ -21,7 +20,7 @@ index 1196c77..d049fbd 100644 node = numa_node_id(); -@@ -821,12 +821,13 @@ static struct vmap_block *new_vmap_block(gfp_t gfp_mask) +@@ -821,12 +821,13 @@ static struct vmap_block *new_vmap_block BUG_ON(err); radix_tree_preload_end(); @@ -37,7 +36,7 @@ index 1196c77..d049fbd 100644 return vb; } -@@ -900,7 +901,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) +@@ -900,7 +901,7 @@ static void *vb_alloc(unsigned long size struct vmap_block *vb; unsigned long addr = 0; unsigned int order; @@ -46,7 +45,7 @@ index 1196c77..d049fbd 100644 BUG_ON(size & ~PAGE_MASK); BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); -@@ -908,7 +909,8 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) +@@ -916,7 +917,8 @@ static void *vb_alloc(unsigned long size again: rcu_read_lock(); @@ -56,7 +55,7 @@ index 1196c77..d049fbd 100644 list_for_each_entry_rcu(vb, &vbq->free, free_list) { int i; -@@ -945,7 +947,7 @@ next: +@@ -953,7 +955,7 @@ next: if (purge) purge_fragmented_blocks_thiscpu(); diff --git a/debian/patches/features/all/rt/0160-mutex-no-spin-on-rt.patch.patch b/debian/patches/features/all/rt/mutex-no-spin-on-rt.patch similarity index 64% rename from debian/patches/features/all/rt/0160-mutex-no-spin-on-rt.patch.patch rename to debian/patches/features/all/rt/mutex-no-spin-on-rt.patch index 88b8e7e41..4294d9c92 100644 --- a/debian/patches/features/all/rt/0160-mutex-no-spin-on-rt.patch.patch +++ b/debian/patches/features/all/rt/mutex-no-spin-on-rt.patch @@ -1,17 +1,16 @@ -From 849852b9d17acef199af44494634fbdd677179b7 Mon Sep 17 00:00:00 2001 +Subject: mutex-no-spin-on-rt.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:51:45 +0200 -Subject: [160/256] mutex-no-spin-on-rt.patch Signed-off-by: Thomas Gleixner --- kernel/Kconfig.locks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks -index 2251882..033ebc0 100644 ---- a/kernel/Kconfig.locks -+++ b/kernel/Kconfig.locks +Index: linux-stable/kernel/Kconfig.locks +=================================================================== +--- linux-stable.orig/kernel/Kconfig.locks ++++ linux-stable/kernel/Kconfig.locks @@ -199,4 +199,4 @@ config INLINE_WRITE_UNLOCK_IRQRESTORE def_bool !DEBUG_SPINLOCK && ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE diff --git a/debian/patches/features/all/rt/net-another-local-irq-disable-alloc-atomic-headache.patch b/debian/patches/features/all/rt/net-another-local-irq-disable-alloc-atomic-headache.patch new file mode 100644 index 000000000..f6f222600 --- /dev/null +++ b/debian/patches/features/all/rt/net-another-local-irq-disable-alloc-atomic-headache.patch @@ -0,0 +1,49 @@ +Subject: net: Another local_irq_disable/kmalloc headache +From: Thomas Gleixner +Date: Wed, 26 Sep 2012 16:21:08 +0200 + +Replace it by a local lock. Though that's pretty inefficient :( + +Signed-off-by: Thomas Gleixner +--- + net/core/skbuff.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +Index: linux-stable/net/core/skbuff.c +=================================================================== +--- linux-stable.orig/net/core/skbuff.c ++++ linux-stable/net/core/skbuff.c +@@ -60,6 +60,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -345,6 +346,7 @@ struct netdev_alloc_cache { + unsigned int pagecnt_bias; + }; + static DEFINE_PER_CPU(struct netdev_alloc_cache, netdev_alloc_cache); ++static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); + + #define NETDEV_PAGECNT_BIAS (PAGE_SIZE / SMP_CACHE_BYTES) + +@@ -354,7 +356,7 @@ static void *__netdev_alloc_frag(unsigne + void *data = NULL; + unsigned long flags; + +- local_irq_save(flags); ++ local_lock_irqsave(netdev_alloc_lock, flags); + nc = &__get_cpu_var(netdev_alloc_cache); + if (unlikely(!nc->page)) { + refill: +@@ -379,7 +381,7 @@ recycle: + nc->offset += fragsz; + nc->pagecnt_bias--; + end: +- local_irq_restore(flags); ++ local_unlock_irqrestore(netdev_alloc_lock, flags); + return data; + } + diff --git a/debian/patches/features/all/rt/0047-net-flip-lock-dep-thingy.patch.patch b/debian/patches/features/all/rt/net-flip-lock-dep-thingy.patch similarity index 92% rename from debian/patches/features/all/rt/0047-net-flip-lock-dep-thingy.patch.patch rename to debian/patches/features/all/rt/net-flip-lock-dep-thingy.patch index 86f3f27b6..aa2628a0a 100644 --- a/debian/patches/features/all/rt/0047-net-flip-lock-dep-thingy.patch.patch +++ b/debian/patches/features/all/rt/net-flip-lock-dep-thingy.patch @@ -1,7 +1,6 @@ -From edb592814fb3b5dde0b37237e9a4f1e209228597 Mon Sep 17 00:00:00 2001 +Subject: net-flip-lock-dep-thingy.patch From: Thomas Gleixner Date: Tue, 28 Jun 2011 10:59:58 +0200 -Subject: [047/256] net-flip-lock-dep-thingy.patch ======================================================= [ INFO: possible circular locking dependency detected ] @@ -15,6 +14,7 @@ but task is already holding lock: which lock already depends on the new lock. + the existing dependency chain (in reverse order) is: -> #1 (sk_lock-AF_INET){+.+...}: @@ -87,16 +87,17 @@ Call Trace: [] sys_close+0xf8/0x13d [] system_call_fastpath+0x16/0x1b + Signed-off-by: Thomas Gleixner --- net/core/sock.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) -diff --git a/net/core/sock.c b/net/core/sock.c -index b2e14c0..5cd7df1 100644 ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -2139,12 +2139,11 @@ void lock_sock_nested(struct sock *sk, int subclass) +Index: linux-stable/net/core/sock.c +=================================================================== +--- linux-stable.orig/net/core/sock.c ++++ linux-stable/net/core/sock.c +@@ -2204,12 +2204,11 @@ void lock_sock_nested(struct sock *sk, i if (sk->sk_lock.owned) __lock_sock(sk); sk->sk_lock.owned = 1; diff --git a/debian/patches/features/all/rt/0157-net-netif_rx_ni-migrate-disable.patch.patch b/debian/patches/features/all/rt/net-netif_rx_ni-migrate-disable.patch similarity index 57% rename from debian/patches/features/all/rt/0157-net-netif_rx_ni-migrate-disable.patch.patch rename to debian/patches/features/all/rt/net-netif_rx_ni-migrate-disable.patch index 485aa7c72..c14891347 100644 --- a/debian/patches/features/all/rt/0157-net-netif_rx_ni-migrate-disable.patch.patch +++ b/debian/patches/features/all/rt/net-netif_rx_ni-migrate-disable.patch @@ -1,18 +1,17 @@ -From 7ccd0a2f82ac5101bbcfa58cc1d616a7e171aed8 Mon Sep 17 00:00:00 2001 +Subject: net-netif_rx_ni-migrate-disable.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 16:29:27 +0200 -Subject: [157/256] net-netif_rx_ni-migrate-disable.patch Signed-off-by: Thomas Gleixner --- net/core/dev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/net/core/dev.c b/net/core/dev.c -index ca7a845..8b645be 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -2960,11 +2960,11 @@ int netif_rx_ni(struct sk_buff *skb) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -2990,11 +2990,11 @@ int netif_rx_ni(struct sk_buff *skb) { int err; diff --git a/debian/patches/features/all/rt/0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch b/debian/patches/features/all/rt/net-tx-action-avoid-livelock-on-rt.patch similarity index 88% rename from debian/patches/features/all/rt/0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch rename to debian/patches/features/all/rt/net-tx-action-avoid-livelock-on-rt.patch index 7d3cd75c9..38eadcd6f 100644 --- a/debian/patches/features/all/rt/0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch +++ b/debian/patches/features/all/rt/net-tx-action-avoid-livelock-on-rt.patch @@ -1,7 +1,6 @@ -From 844cc03c2ba864198fb326f63e8b3c8ec288f8ef Mon Sep 17 00:00:00 2001 +Subject: net: Avoid livelock in net_tx_action() on RT From: Steven Rostedt -Date: Thu, 6 Oct 2011 10:48:39 -0400 -Subject: [223/256] net: Avoid livelock in net_tx_action() on RT +Date: Thu, 06 Oct 2011 10:48:39 -0400 qdisc_lock is taken w/o disabling interrupts or bottom halfs. So code holding a qdisc_lock() can be interrupted and softirqs can run on the @@ -38,15 +37,16 @@ Cc: Clark Williams Cc: John Kacur Cc: Luis Claudio R. Goncalves Signed-off-by: Thomas Gleixner + --- net/core/dev.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) -diff --git a/net/core/dev.c b/net/core/dev.c -index 4e15710..252c15a 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -2970,6 +2970,36 @@ int netif_rx_ni(struct sk_buff *skb) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -3000,6 +3000,36 @@ int netif_rx_ni(struct sk_buff *skb) } EXPORT_SYMBOL(netif_rx_ni); @@ -83,7 +83,7 @@ index 4e15710..252c15a 100644 static void net_tx_action(struct softirq_action *h) { struct softnet_data *sd = &__get_cpu_var(softnet_data); -@@ -3008,7 +3038,7 @@ static void net_tx_action(struct softirq_action *h) +@@ -3038,7 +3068,7 @@ static void net_tx_action(struct softirq head = head->next_sched; root_lock = qdisc_lock(q); diff --git a/debian/patches/features/all/rt/0246-net-Use-cpu_chill-instead-of-cpu_relax.patch b/debian/patches/features/all/rt/net-use-cpu-chill.patch similarity index 65% rename from debian/patches/features/all/rt/0246-net-Use-cpu_chill-instead-of-cpu_relax.patch rename to debian/patches/features/all/rt/net-use-cpu-chill.patch index 3b3fe9865..14565a92f 100644 --- a/debian/patches/features/all/rt/0246-net-Use-cpu_chill-instead-of-cpu_relax.patch +++ b/debian/patches/features/all/rt/net-use-cpu-chill.patch @@ -1,7 +1,6 @@ -From 1ed32db89bcd77937d60536a72e83830aee5ae00 Mon Sep 17 00:00:00 2001 +Subject: net: Use cpu_chill() instead of cpu_relax() From: Thomas Gleixner -Date: Wed, 7 Mar 2012 21:10:04 +0100 -Subject: [246/256] net: Use cpu_chill() instead of cpu_relax() +Date: Wed, 07 Mar 2012 21:10:04 +0100 Retry loops on RT might loop forever when the modifying side was preempted. Use cpu_chill() instead of cpu_relax() to let the system @@ -14,10 +13,10 @@ Cc: stable-rt@vger.kernel.org net/rds/ib_rdma.c | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index 4f2c0df..8194092 100644 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c +Index: linux-stable/net/packet/af_packet.c +=================================================================== +--- linux-stable.orig/net/packet/af_packet.c ++++ linux-stable/net/packet/af_packet.c @@ -88,6 +88,7 @@ #include #include @@ -26,7 +25,7 @@ index 4f2c0df..8194092 100644 #ifdef CONFIG_INET #include -@@ -672,7 +673,7 @@ static void prb_retire_rx_blk_timer_expired(unsigned long data) +@@ -666,7 +667,7 @@ static void prb_retire_rx_blk_timer_expi if (BLOCK_NUM_PKTS(pbd)) { while (atomic_read(&pkc->blk_fill_in_prog)) { /* Waiting for skb_copy_bits to finish... */ @@ -35,7 +34,7 @@ index 4f2c0df..8194092 100644 } } -@@ -927,7 +928,7 @@ static void prb_retire_current_block(struct tpacket_kbdq_core *pkc, +@@ -920,7 +921,7 @@ static void prb_retire_current_block(str if (!(status & TP_STATUS_BLK_TMO)) { while (atomic_read(&pkc->blk_fill_in_prog)) { /* Waiting for skb_copy_bits to finish... */ @@ -44,10 +43,10 @@ index 4f2c0df..8194092 100644 } } prb_close_block(pkc, pbd, po, status); -diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c -index e8fdb17..5a44c6e 100644 ---- a/net/rds/ib_rdma.c -+++ b/net/rds/ib_rdma.c +Index: linux-stable/net/rds/ib_rdma.c +=================================================================== +--- linux-stable.orig/net/rds/ib_rdma.c ++++ linux-stable/net/rds/ib_rdma.c @@ -34,6 +34,7 @@ #include #include @@ -56,7 +55,7 @@ index e8fdb17..5a44c6e 100644 #include "rds.h" #include "ib.h" -@@ -286,7 +287,7 @@ static inline void wait_clean_list_grace(void) +@@ -286,7 +287,7 @@ static inline void wait_clean_list_grace for_each_online_cpu(cpu) { flag = &per_cpu(clean_list_grace, cpu); while (test_bit(CLEAN_LIST_BUSY_BIT, flag)) diff --git a/debian/patches/features/all/rt/net-use-cpu-light-in-ip-send-unicast-reply.patch b/debian/patches/features/all/rt/net-use-cpu-light-in-ip-send-unicast-reply.patch new file mode 100644 index 000000000..438028250 --- /dev/null +++ b/debian/patches/features/all/rt/net-use-cpu-light-in-ip-send-unicast-reply.patch @@ -0,0 +1,32 @@ +Subject: net: Use get_cpu_light() in ip_send_unicast_reply() +From: Thomas Gleixner +Date: Mon, 01 Oct 2012 17:12:35 +0100 + +Signed-off-by: Thomas Gleixner +--- + net/ipv4/ip_output.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +Index: linux-stable/net/ipv4/ip_output.c +=================================================================== +--- linux-stable.orig/net/ipv4/ip_output.c ++++ linux-stable/net/ipv4/ip_output.c +@@ -1516,7 +1516,8 @@ void ip_send_unicast_reply(struct net *n + if (IS_ERR(rt)) + return; + +- inet = &get_cpu_var(unicast_sock); ++ get_cpu_light(); ++ inet = &__get_cpu_var(unicast_sock); + + inet->tos = arg->tos; + sk = &inet->sk; +@@ -1540,7 +1541,7 @@ void ip_send_unicast_reply(struct net *n + ip_push_pending_frames(sk, &fl4); + } + +- put_cpu_var(unicast_sock); ++ put_cpu_light(); + + ip_rt_put(rt); + } diff --git a/debian/patches/features/all/rt/0075-net-wireless-warn-nort.patch.patch b/debian/patches/features/all/rt/net-wireless-warn-nort.patch similarity index 59% rename from debian/patches/features/all/rt/0075-net-wireless-warn-nort.patch.patch rename to debian/patches/features/all/rt/net-wireless-warn-nort.patch index 2386647a6..3cdda5446 100644 --- a/debian/patches/features/all/rt/0075-net-wireless-warn-nort.patch.patch +++ b/debian/patches/features/all/rt/net-wireless-warn-nort.patch @@ -1,18 +1,17 @@ -From 7b41e15ee57890d7282e1fb04c296ae546068502 Mon Sep 17 00:00:00 2001 +Subject: net-wireless-warn-nort.patch From: Thomas Gleixner Date: Thu, 21 Jul 2011 21:05:33 +0200 -Subject: [075/256] net-wireless-warn-nort.patch Signed-off-by: Thomas Gleixner --- net/mac80211/rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c -index d64e285..5ddd808 100644 ---- a/net/mac80211/rx.c -+++ b/net/mac80211/rx.c -@@ -3015,7 +3015,7 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) +Index: linux-stable/net/mac80211/rx.c +=================================================================== +--- linux-stable.orig/net/mac80211/rx.c ++++ linux-stable/net/mac80211/rx.c +@@ -2960,7 +2960,7 @@ void ieee80211_rx(struct ieee80211_hw *h struct ieee80211_supported_band *sband; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); diff --git a/debian/patches/features/all/rt/0247-ntp-Make-ntp_lock-raw.patch b/debian/patches/features/all/rt/ntp-make-ntp-lock-raw-sigh.patch similarity index 78% rename from debian/patches/features/all/rt/0247-ntp-Make-ntp_lock-raw.patch rename to debian/patches/features/all/rt/ntp-make-ntp-lock-raw-sigh.patch index e449a3832..72d9875e1 100644 --- a/debian/patches/features/all/rt/0247-ntp-Make-ntp_lock-raw.patch +++ b/debian/patches/features/all/rt/ntp-make-ntp-lock-raw-sigh.patch @@ -1,7 +1,6 @@ -From 4bfe9cdf14057a0abeabc1bf86ad5b51f61d4ae8 Mon Sep 17 00:00:00 2001 +Subject: ntp: Make ntp_lock raw. From: Thomas Gleixner Date: Tue, 10 Apr 2012 11:14:55 +0200 -Subject: [247/256] ntp: Make ntp_lock raw. This needs to be revisited. Not sure whether we can avoid to make this lock raw, but it'd really like to. @@ -11,10 +10,10 @@ Signed-off-by: Thomas Gleixner kernel/time/ntp.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) -diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c -index e8c8671..85b3bbc 100644 ---- a/kernel/time/ntp.c -+++ b/kernel/time/ntp.c +Index: linux-stable/kernel/time/ntp.c +=================================================================== +--- linux-stable.orig/kernel/time/ntp.c ++++ linux-stable/kernel/time/ntp.c @@ -22,7 +22,7 @@ * NTP timekeeping variables: */ @@ -63,8 +62,8 @@ index e8c8671..85b3bbc 100644 /* * Leap second processing. If in leap-insert state at the end of the -@@ -476,7 +476,7 @@ int second_overflow(unsigned long secs) - +@@ -478,7 +478,7 @@ int second_overflow(unsigned long secs) + time_adjust = 0; out: - spin_unlock_irqrestore(&ntp_lock, flags); @@ -72,7 +71,7 @@ index e8c8671..85b3bbc 100644 return leap; } -@@ -658,7 +658,7 @@ int do_adjtimex(struct timex *txc) +@@ -660,7 +660,7 @@ int do_adjtimex(struct timex *txc) getnstimeofday(&ts); @@ -81,7 +80,7 @@ index e8c8671..85b3bbc 100644 if (txc->modes & ADJ_ADJTIME) { long save_adjust = time_adjust; -@@ -700,7 +700,7 @@ int do_adjtimex(struct timex *txc) +@@ -702,7 +702,7 @@ int do_adjtimex(struct timex *txc) /* fill PPS status fields */ pps_fill_timex(txc); @@ -90,7 +89,7 @@ index e8c8671..85b3bbc 100644 txc->time.tv_sec = ts.tv_sec; txc->time.tv_usec = ts.tv_nsec; -@@ -898,7 +898,7 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) +@@ -900,7 +900,7 @@ void hardpps(const struct timespec *phas pts_norm = pps_normalize_ts(*phase_ts); @@ -99,7 +98,7 @@ index e8c8671..85b3bbc 100644 /* clear the error bits, they will be set again if needed */ time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR); -@@ -911,7 +911,7 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) +@@ -913,7 +913,7 @@ void hardpps(const struct timespec *phas * just start the frequency interval */ if (unlikely(pps_fbase.tv_sec == 0)) { pps_fbase = *raw_ts; @@ -108,7 +107,7 @@ index e8c8671..85b3bbc 100644 return; } -@@ -926,7 +926,7 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) +@@ -928,7 +928,7 @@ void hardpps(const struct timespec *phas time_status |= STA_PPSJITTER; /* restart the frequency calibration interval */ pps_fbase = *raw_ts; @@ -117,7 +116,7 @@ index e8c8671..85b3bbc 100644 pr_err("hardpps: PPSJITTER: bad pulse\n"); return; } -@@ -943,7 +943,7 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) +@@ -945,7 +945,7 @@ void hardpps(const struct timespec *phas hardpps_update_phase(pts_norm.nsec); diff --git a/debian/patches/features/all/rt/0041-of-convert-devtree-lock.patch.patch b/debian/patches/features/all/rt/of-convert-devtree-lock.patch similarity index 75% rename from debian/patches/features/all/rt/0041-of-convert-devtree-lock.patch.patch rename to debian/patches/features/all/rt/of-convert-devtree-lock.patch index 17e766319..4d901b5af 100644 --- a/debian/patches/features/all/rt/0041-of-convert-devtree-lock.patch.patch +++ b/debian/patches/features/all/rt/of-convert-devtree-lock.patch @@ -1,20 +1,19 @@ -From a42b5d896edfab5e9608b3c64d711a6ffddde966 Mon Sep 17 00:00:00 2001 +Subject: of-convert-devtree-lock.patch From: Thomas Gleixner Date: Mon, 21 Mar 2011 14:35:34 +0100 -Subject: [041/256] of-convert-devtree-lock.patch Signed-off-by: Thomas Gleixner --- - arch/sparc/kernel/prom_common.c | 4 +- - drivers/of/base.c | 92 ++++++++++++++++++++++----------------- - include/linux/of.h | 2 +- + arch/sparc/kernel/prom_common.c | 4 - + drivers/of/base.c | 92 ++++++++++++++++++++++------------------ + include/linux/of.h | 2 3 files changed, 55 insertions(+), 43 deletions(-) -diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c -index 741df91..ca73a28 100644 ---- a/arch/sparc/kernel/prom_common.c -+++ b/arch/sparc/kernel/prom_common.c -@@ -65,7 +65,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len +Index: linux-stable/arch/sparc/kernel/prom_common.c +=================================================================== +--- linux-stable.orig/arch/sparc/kernel/prom_common.c ++++ linux-stable/arch/sparc/kernel/prom_common.c +@@ -64,7 +64,7 @@ int of_set_property(struct device_node * err = -ENODEV; mutex_lock(&of_set_property_mutex); @@ -23,7 +22,7 @@ index 741df91..ca73a28 100644 prevp = &dp->properties; while (*prevp) { struct property *prop = *prevp; -@@ -92,7 +92,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len +@@ -91,7 +91,7 @@ int of_set_property(struct device_node * } prevp = &(*prevp)->next; } @@ -32,10 +31,10 @@ index 741df91..ca73a28 100644 mutex_unlock(&of_set_property_mutex); /* XXX Upate procfs if necessary... */ -diff --git a/drivers/of/base.c b/drivers/of/base.c -index 043ab4d..b385c39 100644 ---- a/drivers/of/base.c -+++ b/drivers/of/base.c +Index: linux-stable/drivers/of/base.c +=================================================================== +--- linux-stable.orig/drivers/of/base.c ++++ linux-stable/drivers/of/base.c @@ -54,7 +54,7 @@ static DEFINE_MUTEX(of_aliases_mutex); /* use when traversing tree through the allnext, child, sibling, * or parent members of struct device_node. @@ -45,7 +44,7 @@ index 043ab4d..b385c39 100644 int of_n_addr_cells(struct device_node *np) { -@@ -187,10 +187,11 @@ struct property *of_find_property(const struct device_node *np, +@@ -187,10 +187,11 @@ struct property *of_find_property(const int *lenp) { struct property *pp; @@ -59,7 +58,7 @@ index 043ab4d..b385c39 100644 return pp; } -@@ -208,13 +209,13 @@ struct device_node *of_find_all_nodes(struct device_node *prev) +@@ -208,13 +209,13 @@ struct device_node *of_find_all_nodes(st { struct device_node *np; @@ -75,7 +74,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_all_nodes); -@@ -273,11 +274,12 @@ static int __of_device_is_compatible(const struct device_node *device, +@@ -273,11 +274,12 @@ static int __of_device_is_compatible(con int of_device_is_compatible(const struct device_node *device, const char *compat) { @@ -125,7 +124,7 @@ index 043ab4d..b385c39 100644 return parent; } -@@ -387,14 +391,15 @@ struct device_node *of_get_next_child(const struct device_node *node, +@@ -387,14 +391,15 @@ struct device_node *of_get_next_child(co struct device_node *prev) { struct device_node *next; @@ -143,7 +142,7 @@ index 043ab4d..b385c39 100644 return next; } EXPORT_SYMBOL(of_get_next_child); -@@ -409,14 +414,15 @@ EXPORT_SYMBOL(of_get_next_child); +@@ -436,14 +441,15 @@ EXPORT_SYMBOL(of_get_next_available_chil struct device_node *of_find_node_by_path(const char *path) { struct device_node *np = allnodes; @@ -161,7 +160,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_node_by_path); -@@ -436,15 +442,16 @@ struct device_node *of_find_node_by_name(struct device_node *from, +@@ -463,15 +469,16 @@ struct device_node *of_find_node_by_name const char *name) { struct device_node *np; @@ -180,7 +179,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_node_by_name); -@@ -465,15 +472,16 @@ struct device_node *of_find_node_by_type(struct device_node *from, +@@ -492,15 +499,16 @@ struct device_node *of_find_node_by_type const char *type) { struct device_node *np; @@ -199,7 +198,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_node_by_type); -@@ -496,8 +504,9 @@ struct device_node *of_find_compatible_node(struct device_node *from, +@@ -523,8 +531,9 @@ struct device_node *of_find_compatible_n const char *type, const char *compatible) { struct device_node *np; @@ -210,7 +209,7 @@ index 043ab4d..b385c39 100644 np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { if (type -@@ -508,7 +517,7 @@ struct device_node *of_find_compatible_node(struct device_node *from, +@@ -535,7 +544,7 @@ struct device_node *of_find_compatible_n break; } of_node_put(from); @@ -219,7 +218,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_compatible_node); -@@ -530,8 +539,9 @@ struct device_node *of_find_node_with_property(struct device_node *from, +@@ -557,8 +566,9 @@ struct device_node *of_find_node_with_pr { struct device_node *np; struct property *pp; @@ -229,8 +228,8 @@ index 043ab4d..b385c39 100644 + raw_spin_lock_irqsave(&devtree_lock, flags); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { - for (pp = np->properties; pp != 0; pp = pp->next) { -@@ -543,7 +553,7 @@ struct device_node *of_find_node_with_property(struct device_node *from, + for (pp = np->properties; pp; pp = pp->next) { +@@ -570,7 +580,7 @@ struct device_node *of_find_node_with_pr } out: of_node_put(from); @@ -239,7 +238,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_node_with_property); -@@ -584,10 +594,11 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches, +@@ -611,10 +621,11 @@ const struct of_device_id *of_match_node const struct device_node *node) { const struct of_device_id *match; @@ -253,7 +252,7 @@ index 043ab4d..b385c39 100644 return match; } EXPORT_SYMBOL(of_match_node); -@@ -608,15 +619,16 @@ struct device_node *of_find_matching_node(struct device_node *from, +@@ -635,15 +646,16 @@ struct device_node *of_find_matching_nod const struct of_device_id *matches) { struct device_node *np; @@ -272,7 +271,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_matching_node); -@@ -659,12 +671,12 @@ struct device_node *of_find_node_by_phandle(phandle handle) +@@ -686,12 +698,12 @@ struct device_node *of_find_node_by_phan { struct device_node *np; @@ -287,7 +286,7 @@ index 043ab4d..b385c39 100644 return np; } EXPORT_SYMBOL(of_find_node_by_phandle); -@@ -1036,18 +1048,18 @@ int prom_add_property(struct device_node *np, struct property *prop) +@@ -1063,18 +1075,18 @@ int prom_add_property(struct device_node unsigned long flags; prop->next = NULL; @@ -309,7 +308,7 @@ index 043ab4d..b385c39 100644 #ifdef CONFIG_PROC_DEVICETREE /* try to add to proc as well if it was initialized */ -@@ -1072,7 +1084,7 @@ int prom_remove_property(struct device_node *np, struct property *prop) +@@ -1099,7 +1111,7 @@ int prom_remove_property(struct device_n unsigned long flags; int found = 0; @@ -318,7 +317,7 @@ index 043ab4d..b385c39 100644 next = &np->properties; while (*next) { if (*next == prop) { -@@ -1085,7 +1097,7 @@ int prom_remove_property(struct device_node *np, struct property *prop) +@@ -1112,7 +1124,7 @@ int prom_remove_property(struct device_n } next = &(*next)->next; } @@ -327,16 +326,16 @@ index 043ab4d..b385c39 100644 if (!found) return -ENODEV; -@@ -1115,7 +1127,7 @@ int prom_update_property(struct device_node *np, - unsigned long flags; - int found = 0; +@@ -1149,7 +1161,7 @@ int prom_update_property(struct device_n + if (!oldprop) + return prom_add_property(np, newprop); - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (*next == oldprop) { -@@ -1129,7 +1141,7 @@ int prom_update_property(struct device_node *np, +@@ -1163,7 +1175,7 @@ int prom_update_property(struct device_n } next = &(*next)->next; } @@ -345,7 +344,7 @@ index 043ab4d..b385c39 100644 if (!found) return -ENODEV; -@@ -1159,12 +1171,12 @@ void of_attach_node(struct device_node *np) +@@ -1193,12 +1205,12 @@ void of_attach_node(struct device_node * { unsigned long flags; @@ -360,7 +359,7 @@ index 043ab4d..b385c39 100644 } /** -@@ -1178,7 +1190,7 @@ void of_detach_node(struct device_node *np) +@@ -1212,7 +1224,7 @@ void of_detach_node(struct device_node * struct device_node *parent; unsigned long flags; @@ -369,7 +368,7 @@ index 043ab4d..b385c39 100644 parent = np->parent; if (!parent) -@@ -1209,7 +1221,7 @@ void of_detach_node(struct device_node *np) +@@ -1243,7 +1255,7 @@ void of_detach_node(struct device_node * of_node_set_flag(np, OF_DETACHED); out_unlock: @@ -378,11 +377,11 @@ index 043ab4d..b385c39 100644 } #endif /* defined(CONFIG_OF_DYNAMIC) */ -diff --git a/include/linux/of.h b/include/linux/of.h -index fa7fb1d..a7a948f 100644 ---- a/include/linux/of.h -+++ b/include/linux/of.h -@@ -90,7 +90,7 @@ static inline void of_node_put(struct device_node *node) { } +Index: linux-stable/include/linux/of.h +=================================================================== +--- linux-stable.orig/include/linux/of.h ++++ linux-stable/include/linux/of.h +@@ -91,7 +91,7 @@ static inline void of_node_put(struct de extern struct device_node *allnodes; extern struct device_node *of_chosen; extern struct device_node *of_aliases; diff --git a/debian/patches/features/all/rt/0040-OF-Fixup-resursive-locking-code-paths.patch b/debian/patches/features/all/rt/of-fixup-recursive-locking.patch similarity index 84% rename from debian/patches/features/all/rt/0040-OF-Fixup-resursive-locking-code-paths.patch rename to debian/patches/features/all/rt/of-fixup-recursive-locking.patch index 7f60a0e92..29cd9aff7 100644 --- a/debian/patches/features/all/rt/0040-OF-Fixup-resursive-locking-code-paths.patch +++ b/debian/patches/features/all/rt/of-fixup-recursive-locking.patch @@ -1,7 +1,6 @@ -From 981491fea2c93f05bf8fd0548c5b85f587f22ef7 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 13 Aug 2009 09:04:10 +0200 -Subject: [040/256] OF: Fixup resursive locking code paths +Subject: OF: Fixup resursive locking code paths There is no real reason to use a rwlock for devtree_lock. It even could be a mutex, but unfortunately it's locked from cpu hotplug @@ -13,15 +12,16 @@ recursive locking pathes which allows us to convert devtree_lock to a read_lock. Signed-off-by: Thomas Gleixner + --- - drivers/of/base.c | 93 ++++++++++++++++++++++++++++++++++++++++------------- + drivers/of/base.c | 93 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 22 deletions(-) -diff --git a/drivers/of/base.c b/drivers/of/base.c -index 5806449..043ab4d 100644 ---- a/drivers/of/base.c -+++ b/drivers/of/base.c -@@ -163,16 +163,14 @@ void of_node_put(struct device_node *node) +Index: linux-stable/drivers/of/base.c +=================================================================== +--- linux-stable.orig/drivers/of/base.c ++++ linux-stable/drivers/of/base.c +@@ -163,16 +163,14 @@ void of_node_put(struct device_node *nod EXPORT_SYMBOL(of_node_put); #endif /* CONFIG_OF_DYNAMIC */ @@ -37,10 +37,10 @@ index 5806449..043ab4d 100644 return NULL; - read_lock(&devtree_lock); - for (pp = np->properties; pp != 0; pp = pp->next) { + for (pp = np->properties; pp; pp = pp->next) { if (of_prop_cmp(pp->name, name) == 0) { - if (lenp != 0) -@@ -180,6 +178,18 @@ struct property *of_find_property(const struct device_node *np, + if (lenp) +@@ -180,6 +178,18 @@ struct property *of_find_property(const break; } } @@ -99,7 +99,7 @@ index 5806449..043ab4d 100644 if (cp == NULL) return 0; while (cplen > 0) { -@@ -244,6 +266,20 @@ int of_device_is_compatible(const struct device_node *device, +@@ -244,6 +266,20 @@ int of_device_is_compatible(const struct return 0; } @@ -120,7 +120,7 @@ index 5806449..043ab4d 100644 EXPORT_SYMBOL(of_device_is_compatible); /** -@@ -467,7 +503,8 @@ struct device_node *of_find_compatible_node(struct device_node *from, +@@ -494,7 +530,8 @@ struct device_node *of_find_compatible_n if (type && !(np->type && (of_node_cmp(np->type, type) == 0))) continue; @@ -130,7 +130,7 @@ index 5806449..043ab4d 100644 break; } of_node_put(from); -@@ -511,15 +548,9 @@ out: +@@ -538,15 +575,9 @@ out: } EXPORT_SYMBOL(of_find_node_with_property); @@ -149,7 +149,7 @@ index 5806449..043ab4d 100644 { if (!matches) return NULL; -@@ -533,14 +564,32 @@ const struct of_device_id *of_match_node(const struct of_device_id *matches, +@@ -560,14 +591,32 @@ const struct of_device_id *of_match_node match &= node->type && !strcmp(matches->type, node->type); if (matches->compatible[0]) @@ -184,7 +184,7 @@ index 5806449..043ab4d 100644 EXPORT_SYMBOL(of_match_node); /** -@@ -563,7 +612,7 @@ struct device_node *of_find_matching_node(struct device_node *from, +@@ -590,7 +639,7 @@ struct device_node *of_find_matching_nod read_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { diff --git a/debian/patches/features/all/rt/0023-signal-x86-Delay-calling-signals-in-atomic.patch b/debian/patches/features/all/rt/oleg-signal-rt-fix.patch similarity index 74% rename from debian/patches/features/all/rt/0023-signal-x86-Delay-calling-signals-in-atomic.patch rename to debian/patches/features/all/rt/oleg-signal-rt-fix.patch index feac63aa9..d849453c2 100644 --- a/debian/patches/features/all/rt/0023-signal-x86-Delay-calling-signals-in-atomic.patch +++ b/debian/patches/features/all/rt/oleg-signal-rt-fix.patch @@ -1,7 +1,5 @@ -From 99d55f84be1b0a85165bfce70267e4e83780cca3 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov -Date: Thu, 7 Jun 2012 07:46:44 -0400 -Subject: [023/256] signal/x86: Delay calling signals in atomic +Subject: signal/x86: Delay calling signals in atomic On x86_64 we must disable preemption before we enable interrupts for stack faults, int3 and debugging, because the current task is using @@ -30,16 +28,17 @@ Signed-off-by: Oleg Nesterov Signed-off-by: Steven Rostedt Signed-off-by: Thomas Gleixner --- + arch/x86/include/asm/signal.h | 13 +++++++++++++ - arch/x86/kernel/signal.c | 9 +++++++++ + arch/x86/kernel/signal.c | 8 ++++++++ include/linux/sched.h | 4 ++++ kernel/signal.c | 37 +++++++++++++++++++++++++++++++++++-- - 4 files changed, 61 insertions(+), 2 deletions(-) + 4 files changed, 60 insertions(+), 2 deletions(-) -diff --git a/arch/x86/include/asm/signal.h b/arch/x86/include/asm/signal.h -index 598457c..1213ebd 100644 ---- a/arch/x86/include/asm/signal.h -+++ b/arch/x86/include/asm/signal.h +Index: linux-stable/arch/x86/include/asm/signal.h +=================================================================== +--- linux-stable.orig/arch/x86/include/asm/signal.h ++++ linux-stable/arch/x86/include/asm/signal.h @@ -31,6 +31,19 @@ typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t; @@ -60,31 +59,30 @@ index 598457c..1213ebd 100644 #else /* Here we must cater to libcs that poke about in kernel headers. */ -diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c -index 115eac4..c67d83f 100644 ---- a/arch/x86/kernel/signal.c -+++ b/arch/x86/kernel/signal.c -@@ -824,6 +824,15 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) +Index: linux-stable/arch/x86/kernel/signal.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/signal.c ++++ linux-stable/arch/x86/kernel/signal.c +@@ -785,6 +785,14 @@ do_notify_resume(struct pt_regs *regs, v mce_notify_process(); #endif /* CONFIG_X86_64 && CONFIG_X86_MCE */ +#ifdef ARCH_RT_DELAYS_SIGNAL_SEND + if (unlikely(current->forced_info.si_signo)) { + struct task_struct *t = current; -+ force_sig_info(t->forced_info.si_signo, -+ &t->forced_info, t); ++ force_sig_info(t->forced_info.si_signo, &t->forced_info, t); + t->forced_info.si_signo = 0; + } +#endif + - /* deal with pending signal delivery */ - if (thread_info_flags & _TIF_SIGPENDING) - do_signal(regs); -diff --git a/include/linux/sched.h b/include/linux/sched.h -index b546194..bd5caa1 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1440,6 +1440,10 @@ struct task_struct { + if (thread_info_flags & _TIF_UPROBE) { + clear_thread_flag(TIF_UPROBE); + uprobe_notify_resume(regs); +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1408,6 +1408,10 @@ struct task_struct { sigset_t blocked, real_blocked; sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ struct sigpending pending; @@ -95,11 +93,11 @@ index b546194..bd5caa1 100644 unsigned long sas_ss_sp; size_t sas_ss_size; -diff --git a/kernel/signal.c b/kernel/signal.c -index a05a4db..65cb5b4 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1312,8 +1312,8 @@ int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, +Index: linux-stable/kernel/signal.c +=================================================================== +--- linux-stable.orig/kernel/signal.c ++++ linux-stable/kernel/signal.c +@@ -1305,8 +1305,8 @@ int do_send_sig_info(int sig, struct sig * We don't want to have recursive SIGSEGV's etc, for example, * that is why we also clear SIGNAL_UNKILLABLE. */ @@ -110,7 +108,7 @@ index a05a4db..65cb5b4 100644 { unsigned long int flags; int ret, blocked, ignored; -@@ -1338,6 +1338,39 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) +@@ -1331,6 +1331,39 @@ force_sig_info(int sig, struct siginfo * return ret; } diff --git a/debian/patches/features/all/rt/panic-disable-random-on-rt.patch b/debian/patches/features/all/rt/panic-disable-random-on-rt.patch new file mode 100644 index 000000000..6aba7d767 --- /dev/null +++ b/debian/patches/features/all/rt/panic-disable-random-on-rt.patch @@ -0,0 +1,23 @@ +From: Thomas Gleixner +Subject: panic: skip get_random_bytes for RT_FULL in init_oops_id + +--- + kernel/panic.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: linux-stable/kernel/panic.c +=================================================================== +--- linux-stable.orig/kernel/panic.c ++++ linux-stable/kernel/panic.c +@@ -371,9 +371,11 @@ static u64 oops_id; + + static int init_oops_id(void) + { ++#ifndef CONFIG_PREEMPT_RT_FULL + if (!oops_id) + get_random_bytes(&oops_id, sizeof(oops_id)); + else ++#endif + oops_id++; + + return 0; diff --git a/debian/patches/features/all/rt/0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch b/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch similarity index 73% rename from debian/patches/features/all/rt/0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch rename to debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch index c8d47494d..cbbb61cd2 100644 --- a/debian/patches/features/all/rt/0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch +++ b/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch @@ -1,7 +1,6 @@ -From 54c5b37a9fe006fec148f43d3cbdcc2d8221b2ee Mon Sep 17 00:00:00 2001 +Subject: rcu: Make ksoftirqd do RCU quiescent states From: "Paul E. McKenney" Date: Wed, 5 Oct 2011 11:45:18 -0700 -Subject: [188/256] rcu: Make ksoftirqd do RCU quiescent states Implementing RCU-bh in terms of RCU-preempt makes the system vulnerable to network-based denial-of-service attacks. This patch therefore @@ -22,6 +21,7 @@ in cases where __do_softirq() is invoked directly from ksoftirqd. Signed-off-by: Paul E. McKenney Link: http://lkml.kernel.org/r/20111005184518.GA21601@linux.vnet.ibm.com Signed-off-by: Thomas Gleixner + --- include/linux/rcupdate.h | 6 ------ kernel/rcutree.c | 7 ++++++- @@ -30,11 +30,11 @@ Signed-off-by: Thomas Gleixner kernel/softirq.c | 20 +++++++++++++------- 5 files changed, 21 insertions(+), 15 deletions(-) -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index 888d24a..aaf8b7d 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -194,13 +194,7 @@ static inline int rcu_preempt_depth(void) +Index: linux-stable/include/linux/rcupdate.h +=================================================================== +--- linux-stable.orig/include/linux/rcupdate.h ++++ linux-stable/include/linux/rcupdate.h +@@ -195,13 +195,7 @@ static inline int rcu_preempt_depth(void /* Internal to kernel */ extern void rcu_sched_qs(int cpu); @@ -48,11 +48,11 @@ index 888d24a..aaf8b7d 100644 extern void rcu_check_callbacks(int cpu, int user); struct notifier_block; extern void rcu_idle_enter(void); -diff --git a/kernel/rcutree.c b/kernel/rcutree.c -index 69e959e..a9ca0e0 100644 ---- a/kernel/rcutree.c -+++ b/kernel/rcutree.c -@@ -172,7 +172,12 @@ void rcu_sched_qs(int cpu) +Index: linux-stable/kernel/rcutree.c +=================================================================== +--- linux-stable.orig/kernel/rcutree.c ++++ linux-stable/kernel/rcutree.c +@@ -182,7 +182,12 @@ void rcu_sched_qs(int cpu) rdp->passed_quiesce = 1; } @@ -66,11 +66,11 @@ index 69e959e..a9ca0e0 100644 void rcu_bh_qs(int cpu) { struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu); -diff --git a/kernel/rcutree.h b/kernel/rcutree.h -index cdd1be0..6ee6525 100644 ---- a/kernel/rcutree.h -+++ b/kernel/rcutree.h -@@ -423,6 +423,7 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work); +Index: linux-stable/kernel/rcutree.h +=================================================================== +--- linux-stable.orig/kernel/rcutree.h ++++ linux-stable/kernel/rcutree.h +@@ -463,6 +463,7 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work); /* Forward declarations for rcutree_plugin.h */ static void rcu_bootup_announce(void); long rcu_batches_completed(void); @@ -78,11 +78,11 @@ index cdd1be0..6ee6525 100644 static void rcu_preempt_note_context_switch(int cpu); static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp); #ifdef CONFIG_HOTPLUG_CPU -diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h -index e4cc151..14acafc 100644 ---- a/kernel/rcutree_plugin.h -+++ b/kernel/rcutree_plugin.h -@@ -1899,7 +1899,7 @@ static void __cpuinit rcu_prepare_kthreads(int cpu) +Index: linux-stable/kernel/rcutree_plugin.h +=================================================================== +--- linux-stable.orig/kernel/rcutree_plugin.h ++++ linux-stable/kernel/rcutree_plugin.h +@@ -1727,7 +1727,7 @@ static void __cpuinit rcu_prepare_kthrea #endif /* #else #ifdef CONFIG_RCU_BOOST */ @@ -91,10 +91,10 @@ index e4cc151..14acafc 100644 /* * Check to see if any future RCU-related work will need to be done -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 35fb713..34fe1db 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c @@ -139,7 +139,7 @@ static void wakeup_softirqd(void) wake_up_process(tsk); } @@ -104,7 +104,7 @@ index 35fb713..34fe1db 100644 { struct softirq_action *h = softirq_vec; unsigned int prev_count = preempt_count(); -@@ -162,7 +162,8 @@ static void handle_pending_softirqs(u32 pending, int cpu) +@@ -162,7 +162,8 @@ static void handle_pending_softirqs(u32 prev_count, (unsigned int) preempt_count()); preempt_count() = prev_count; } @@ -114,7 +114,7 @@ index 35fb713..34fe1db 100644 } local_irq_disable(); } -@@ -314,7 +315,7 @@ restart: +@@ -322,7 +323,7 @@ restart: /* Reset the pending bitmask before enabling irqs */ set_softirq_pending(0); @@ -123,7 +123,7 @@ index 35fb713..34fe1db 100644 pending = local_softirq_pending(); if (pending && --max_restart) -@@ -384,7 +385,12 @@ static inline void ksoftirqd_clr_sched_params(void) { } +@@ -393,7 +394,12 @@ static inline void ksoftirqd_clr_sched_p static DEFINE_LOCAL_IRQ_LOCK(local_softirq_lock); static DEFINE_PER_CPU(struct task_struct *, local_softirq_runner); @@ -137,7 +137,7 @@ index 35fb713..34fe1db 100644 void __init softirq_early_init(void) { -@@ -455,7 +461,7 @@ EXPORT_SYMBOL(in_serving_softirq); +@@ -464,7 +470,7 @@ EXPORT_SYMBOL(in_serving_softirq); * Called with bh and local interrupts disabled. For full RT cpu must * be pinned. */ @@ -146,7 +146,7 @@ index 35fb713..34fe1db 100644 { u32 pending = local_softirq_pending(); int cpu = smp_processor_id(); -@@ -469,7 +475,7 @@ static void __do_softirq(void) +@@ -478,7 +484,7 @@ static void __do_softirq(void) lockdep_softirq_enter(); @@ -155,7 +155,7 @@ index 35fb713..34fe1db 100644 pending = local_softirq_pending(); if (pending) -@@ -508,7 +514,7 @@ static int __thread_do_softirq(int cpu) +@@ -517,7 +523,7 @@ static int __thread_do_softirq(int cpu) * schedule! */ if (local_softirq_pending()) diff --git a/debian/patches/features/all/rt/0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch b/debian/patches/features/all/rt/pci-access-use-__wake_up_all_locked.patch similarity index 60% rename from debian/patches/features/all/rt/0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch rename to debian/patches/features/all/rt/pci-access-use-__wake_up_all_locked.patch index 8d10c0d3b..844ca4a80 100644 --- a/debian/patches/features/all/rt/0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch +++ b/debian/patches/features/all/rt/pci-access-use-__wake_up_all_locked.patch @@ -1,8 +1,6 @@ -From 89f36c4ed5519559922ececc6f47865510d5358d Mon Sep 17 00:00:00 2001 +Subject: pci: Use __wake_up_all_locked pci_unblock_user_cfg_access() From: Thomas Gleixner -Date: Thu, 1 Dec 2011 00:07:16 +0100 -Subject: [053/256] pci: Use __wake_up_all_locked - pci_unblock_user_cfg_access() +Date: Thu, 01 Dec 2011 00:07:16 +0100 The waitqueue is protected by the pci_lock, so we can just avoid to lock the waitqueue lock itself. That prevents the @@ -14,11 +12,11 @@ Cc: stable-rt@vger.kernel.org drivers/pci/access.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/drivers/pci/access.c b/drivers/pci/access.c -index 2a58164..8e6a88e 100644 ---- a/drivers/pci/access.c -+++ b/drivers/pci/access.c -@@ -463,7 +463,7 @@ void pci_cfg_access_unlock(struct pci_dev *dev) +Index: linux-stable/drivers/pci/access.c +=================================================================== +--- linux-stable.orig/drivers/pci/access.c ++++ linux-stable/drivers/pci/access.c +@@ -465,7 +465,7 @@ void pci_cfg_access_unlock(struct pci_de WARN_ON(!dev->block_cfg_access); dev->block_cfg_access = 0; diff --git a/debian/patches/features/all/rt/perf-make-swevent-hrtimer-irqsafe.patch b/debian/patches/features/all/rt/perf-make-swevent-hrtimer-irqsafe.patch new file mode 100644 index 000000000..4c9d583e5 --- /dev/null +++ b/debian/patches/features/all/rt/perf-make-swevent-hrtimer-irqsafe.patch @@ -0,0 +1,70 @@ +From: Yong Zhang +Date: Wed, 11 Jul 2012 22:05:21 +0000 +Subject: perf: Make swevent hrtimer run in irq instead of softirq + +Otherwise we get a deadlock like below: + +[ 1044.042749] BUG: scheduling while atomic: ksoftirqd/21/141/0x00010003 +[ 1044.042752] INFO: lockdep is turned off. +[ 1044.042754] Modules linked in: +[ 1044.042757] Pid: 141, comm: ksoftirqd/21 Tainted: G W 3.4.0-rc2-rt3-23676-ga723175-dirty #29 +[ 1044.042759] Call Trace: +[ 1044.042761] [] __schedule_bug+0x65/0x80 +[ 1044.042770] [] __schedule+0x83c/0xa70 +[ 1044.042775] [] ? prepare_to_wait+0x32/0xb0 +[ 1044.042779] [] schedule+0x2e/0xa0 +[ 1044.042782] [] hrtimer_wait_for_timer+0x6d/0xb0 +[ 1044.042786] [] ? wake_up_bit+0x40/0x40 +[ 1044.042790] [] hrtimer_cancel+0x20/0x40 +[ 1044.042794] [] perf_swevent_cancel_hrtimer+0x3c/0x50 +[ 1044.042798] [] task_clock_event_stop+0x11/0x40 +[ 1044.042802] [] task_clock_event_del+0xe/0x10 +[ 1044.042805] [] event_sched_out+0x118/0x1d0 +[ 1044.042809] [] group_sched_out+0x29/0x90 +[ 1044.042813] [] __perf_event_disable+0x18e/0x200 +[ 1044.042817] [] remote_function+0x63/0x70 +[ 1044.042821] [] generic_smp_call_function_single_interrupt+0xce/0x120 +[ 1044.042826] [] smp_call_function_single_interrupt+0x27/0x40 +[ 1044.042831] [] call_function_single_interrupt+0x6c/0x80 +[ 1044.042833] [] ? perf_event_overflow+0x20/0x20 +[ 1044.042840] [] ? _raw_spin_unlock_irq+0x30/0x70 +[ 1044.042844] [] ? _raw_spin_unlock_irq+0x36/0x70 +[ 1044.042848] [] run_hrtimer_softirq+0xc2/0x200 +[ 1044.042853] [] ? perf_event_overflow+0x20/0x20 +[ 1044.042857] [] __do_softirq_common+0xf5/0x3a0 +[ 1044.042862] [] __thread_do_softirq+0x15d/0x200 +[ 1044.042865] [] run_ksoftirqd+0xfa/0x210 +[ 1044.042869] [] ? __thread_do_softirq+0x200/0x200 +[ 1044.042873] [] ? __thread_do_softirq+0x200/0x200 +[ 1044.042877] [] kthread+0xb6/0xc0 +[ 1044.042881] [] ? _raw_spin_unlock_irq+0x3b/0x70 +[ 1044.042886] [] kernel_thread_helper+0x4/0x10 +[ 1044.042889] [] ? finish_task_switch+0x8c/0x110 +[ 1044.042894] [] ? _raw_spin_unlock_irq+0x3b/0x70 +[ 1044.042897] [] ? retint_restore_args+0xe/0xe +[ 1044.042900] [] ? kthreadd+0x1e0/0x1e0 +[ 1044.042902] [] ? gs_change+0xb/0xb + +Signed-off-by: Yong Zhang +Cc: Peter Zijlstra +Cc: Steven Rostedt +Link: http://lkml.kernel.org/r/1341476476-5666-1-git-send-email-yong.zhang0@gmail.com +Signed-off-by: Thomas Gleixner +Signed-off-by: Steven Rostedt + +--- + kernel/events/core.c | 1 + + 1 file changed, 1 insertion(+) + +Index: linux-stable/kernel/events/core.c +=================================================================== +--- linux-stable.orig/kernel/events/core.c ++++ linux-stable/kernel/events/core.c +@@ -5441,6 +5441,7 @@ static void perf_swevent_init_hrtimer(st + + hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hwc->hrtimer.function = perf_swevent_hrtimer; ++ hwc->hrtimer.irqsafe = 1; + + /* + * Since hrtimers have a fixed rate, we can do a static freq->period diff --git a/debian/patches/features/all/rt/0215-x86-no-perf-irq-work-rt.patch.patch b/debian/patches/features/all/rt/perf-move-irq-work-to-softirq-in-rt.patch similarity index 59% rename from debian/patches/features/all/rt/0215-x86-no-perf-irq-work-rt.patch.patch rename to debian/patches/features/all/rt/perf-move-irq-work-to-softirq-in-rt.patch index 4a62606cd..20713df12 100644 --- a/debian/patches/features/all/rt/0215-x86-no-perf-irq-work-rt.patch.patch +++ b/debian/patches/features/all/rt/perf-move-irq-work-to-softirq-in-rt.patch @@ -1,7 +1,6 @@ -From e52603f78af80f021e98e5e2d1015e15dbe8f013 Mon Sep 17 00:00:00 2001 +Subject: x86-no-perf-irq-work-rt.patch From: Thomas Gleixner Date: Wed, 13 Jul 2011 14:05:05 +0200 -Subject: [215/256] x86-no-perf-irq-work-rt.patch Signed-off-by: Thomas Gleixner --- @@ -10,11 +9,11 @@ Signed-off-by: Thomas Gleixner kernel/timer.c | 6 +++++- 3 files changed, 9 insertions(+), 1 deletion(-) -diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c -index ca8f703..129b8bb 100644 ---- a/arch/x86/kernel/irq_work.c -+++ b/arch/x86/kernel/irq_work.c -@@ -18,6 +18,7 @@ void smp_irq_work_interrupt(struct pt_regs *regs) +Index: linux-stable/arch/x86/kernel/irq_work.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/irq_work.c ++++ linux-stable/arch/x86/kernel/irq_work.c +@@ -18,6 +18,7 @@ void smp_irq_work_interrupt(struct pt_re irq_exit(); } @@ -27,10 +26,10 @@ index ca8f703..129b8bb 100644 #endif } +#endif -diff --git a/kernel/irq_work.c b/kernel/irq_work.c -index 1588e3b..170c2ea 100644 ---- a/kernel/irq_work.c -+++ b/kernel/irq_work.c +Index: linux-stable/kernel/irq_work.c +=================================================================== +--- linux-stable.orig/kernel/irq_work.c ++++ linux-stable/kernel/irq_work.c @@ -107,8 +107,10 @@ void irq_work_run(void) if (llist_empty(this_list)) return; @@ -42,11 +41,11 @@ index 1588e3b..170c2ea 100644 llnode = llist_del_all(this_list); while (llnode != NULL) { -diff --git a/kernel/timer.c b/kernel/timer.c -index f6f2958..935f46d 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1412,7 +1412,7 @@ void update_process_times(int user_tick) +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -1426,7 +1426,7 @@ void update_process_times(int user_tick) scheduler_tick(); run_local_timers(); rcu_check_callbacks(cpu, user_tick); @@ -55,7 +54,7 @@ index f6f2958..935f46d 100644 if (in_irq()) irq_work_run(); #endif -@@ -1426,6 +1426,10 @@ static void run_timer_softirq(struct softirq_action *h) +@@ -1440,6 +1440,10 @@ static void run_timer_softirq(struct sof { struct tvec_base *base = __this_cpu_read(tvec_bases); diff --git a/debian/patches/features/all/rt/0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch b/debian/patches/features/all/rt/peter_zijlstra-frob-hrtimer.patch similarity index 87% rename from debian/patches/features/all/rt/0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch rename to debian/patches/features/all/rt/peter_zijlstra-frob-hrtimer.patch index 1fcdba0b2..0299ee857 100644 --- a/debian/patches/features/all/rt/0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch +++ b/debian/patches/features/all/rt/peter_zijlstra-frob-hrtimer.patch @@ -1,7 +1,6 @@ -From 64c3e837013143386069c3dda8d67f137fd63500 Mon Sep 17 00:00:00 2001 +Subject: hrtimer: Don't call the timer handler from hrtimer_start From: Peter Zijlstra -Date: Fri, 12 Aug 2011 17:39:54 +0200 -Subject: [117/256] hrtimer: Don't call the timer handler from hrtimer_start +Date: Fri Aug 12 17:39:54 CEST 2011 [] __delay+0xf/0x11 [] do_raw_spin_lock+0xd2/0x13c @@ -31,11 +30,11 @@ Signed-off-by: Peter Zijlstra kernel/hrtimer.c | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 1dd627b..358442b 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -646,37 +646,24 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, +Index: linux-stable/kernel/hrtimer.c +=================================================================== +--- linux-stable.orig/kernel/hrtimer.c ++++ linux-stable/kernel/hrtimer.c +@@ -646,37 +646,24 @@ static inline int hrtimer_enqueue_reprog struct hrtimer_clock_base *base, int wakeup) { @@ -83,7 +82,7 @@ index 1dd627b..358442b 100644 } return 0; -@@ -1046,8 +1033,19 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, +@@ -1067,8 +1054,19 @@ int __hrtimer_start_range_ns(struct hrti * * XXX send_remote_softirq() ? */ diff --git a/debian/patches/features/all/rt/0148-sched-Generic-migrate_disable.patch b/debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable-2.patch similarity index 73% rename from debian/patches/features/all/rt/0148-sched-Generic-migrate_disable.patch rename to debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable-2.patch index fa5ba2e62..d22659861 100644 --- a/debian/patches/features/all/rt/0148-sched-Generic-migrate_disable.patch +++ b/debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable-2.patch @@ -1,7 +1,6 @@ -From d648a9940a4f406cfa10d9161fb31d37719d3b37 Mon Sep 17 00:00:00 2001 +Subject: sched: Generic migrate_disable From: Peter Zijlstra -Date: Thu, 11 Aug 2011 15:14:58 +0200 -Subject: [148/256] sched: Generic migrate_disable +Date: Thu Aug 11 15:14:58 CEST 2011 Make migrate_disable() be a preempt_disable() for !rt kernels. This allows generic code to use it but still enforces that these code @@ -22,10 +21,10 @@ Link: http://lkml.kernel.org/n/tip-275i87sl8e1jcamtchmehonm@git.kernel.org lib/smp_processor_id.c | 2 +- 6 files changed, 30 insertions(+), 23 deletions(-) -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 714a08c..5af46d0 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h +Index: linux-stable/include/linux/preempt.h +=================================================================== +--- linux-stable.orig/include/linux/preempt.h ++++ linux-stable/include/linux/preempt.h @@ -108,28 +108,25 @@ do { \ #endif /* CONFIG_PREEMPT_COUNT */ @@ -64,21 +63,21 @@ index 714a08c..5af46d0 100644 #endif #ifdef CONFIG_PREEMPT_NOTIFIERS -diff --git a/include/linux/sched.h b/include/linux/sched.h -index c5f690a..cf6809b 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1302,7 +1302,9 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1275,7 +1275,9 @@ struct task_struct { #endif unsigned int policy; +#ifdef CONFIG_PREEMPT_RT_FULL int migrate_disable; +#endif + int nr_cpus_allowed; cpumask_t cpus_allowed; - #ifdef CONFIG_PREEMPT_RCU -@@ -2771,11 +2773,22 @@ static inline void set_task_cpu(struct task_struct *p, unsigned int cpu) +@@ -2771,11 +2773,22 @@ static inline void set_task_cpu(struct t #endif /* CONFIG_SMP */ @@ -101,11 +100,11 @@ index c5f690a..cf6809b 100644 return &p->cpus_allowed; } -diff --git a/include/linux/smp.h b/include/linux/smp.h -index 980c525..3001ba5 100644 ---- a/include/linux/smp.h -+++ b/include/linux/smp.h -@@ -218,13 +218,8 @@ smp_call_function_any(const struct cpumask *mask, smp_call_func_t func, +Index: linux-stable/include/linux/smp.h +=================================================================== +--- linux-stable.orig/include/linux/smp.h ++++ linux-stable/include/linux/smp.h +@@ -218,13 +218,8 @@ static inline void kick_all_cpus_sync(vo #define get_cpu() ({ preempt_disable(); smp_processor_id(); }) #define put_cpu() preempt_enable() @@ -121,11 +120,11 @@ index 980c525..3001ba5 100644 /* * Callback to arch code if there's nosmp or maxcpus=0 on the -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index fb1e8bb..954dfa9 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4976,7 +4976,7 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -5203,7 +5203,7 @@ void __cpuinit init_idle(struct task_str #ifdef CONFIG_SMP void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) { @@ -133,8 +132,8 @@ index fb1e8bb..954dfa9 100644 + if (!__migrate_disabled(p)) { if (p->sched_class && p->sched_class->set_cpus_allowed) p->sched_class->set_cpus_allowed(p, new_mask); - p->rt.nr_cpus_allowed = cpumask_weight(new_mask); -@@ -5032,7 +5032,7 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) + p->nr_cpus_allowed = cpumask_weight(new_mask); +@@ -5259,7 +5259,7 @@ int set_cpus_allowed_ptr(struct task_str do_set_cpus_allowed(p, new_mask); /* Can the task run on the task's current CPU? If so, we're done */ @@ -143,7 +142,7 @@ index fb1e8bb..954dfa9 100644 goto out; dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); -@@ -5051,6 +5051,7 @@ out: +@@ -5278,6 +5278,7 @@ out: } EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); @@ -151,7 +150,7 @@ index fb1e8bb..954dfa9 100644 void migrate_disable(void) { struct task_struct *p = current; -@@ -5143,6 +5144,7 @@ void migrate_enable(void) +@@ -5370,6 +5371,7 @@ void migrate_enable(void) preempt_enable(); } EXPORT_SYMBOL(migrate_enable); @@ -159,11 +158,11 @@ index fb1e8bb..954dfa9 100644 /* * Move (not current) task off this cpu, onto dest cpu. We're doing -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 8e79f40..ee744f3 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -1180,7 +1180,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, +Index: linux-stable/kernel/trace/trace.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace.c ++++ linux-stable/kernel/trace/trace.c +@@ -1156,7 +1156,7 @@ tracing_generic_entry_update(struct trac ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); @@ -172,11 +171,11 @@ index 8e79f40..ee744f3 100644 } EXPORT_SYMBOL_GPL(tracing_generic_entry_update); -diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c -index 0a846e7..dbb1570 100644 ---- a/lib/smp_processor_id.c -+++ b/lib/smp_processor_id.c -@@ -41,7 +41,7 @@ notrace unsigned int debug_smp_processor_id(void) +Index: linux-stable/lib/smp_processor_id.c +=================================================================== +--- linux-stable.orig/lib/smp_processor_id.c ++++ linux-stable/lib/smp_processor_id.c +@@ -41,7 +41,7 @@ notrace unsigned int debug_smp_processor printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x %08x] " "code: %s/%d\n", preempt_count() - 1, diff --git a/debian/patches/features/all/rt/0147-sched-Optimize-migrate_disable.patch b/debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable.patch similarity index 73% rename from debian/patches/features/all/rt/0147-sched-Optimize-migrate_disable.patch rename to debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable.patch index 40532e5e7..1cce90c23 100644 --- a/debian/patches/features/all/rt/0147-sched-Optimize-migrate_disable.patch +++ b/debian/patches/features/all/rt/peter_zijlstra-frob-migrate_disable.patch @@ -1,7 +1,6 @@ -From 6ff6774bdeef497a14f274c7e70cddba59099c03 Mon Sep 17 00:00:00 2001 +Subject: sched: Optimize migrate_disable From: Peter Zijlstra -Date: Thu, 11 Aug 2011 15:03:35 +0200 -Subject: [147/256] sched: Optimize migrate_disable +Date: Thu Aug 11 15:03:35 CEST 2011 Change from task_rq_lock() to raw_spin_lock(&rq->lock) to avoid a few atomic ops. See comment on why it should be safe. @@ -12,11 +11,11 @@ Link: http://lkml.kernel.org/n/tip-cbz6hkl5r5mvwtx5s3tor2y6@git.kernel.org kernel/sched/core.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 42efb3c..fb1e8bb 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -5071,7 +5071,19 @@ void migrate_disable(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -5298,7 +5298,19 @@ void migrate_disable(void) preempt_enable(); return; } @@ -37,16 +36,16 @@ index 42efb3c..fb1e8bb 100644 p->migrate_disable = 1; mask = tsk_cpus_allowed(p); -@@ -5082,7 +5094,7 @@ void migrate_disable(void) +@@ -5309,7 +5321,7 @@ void migrate_disable(void) p->sched_class->set_cpus_allowed(p, mask); - p->rt.nr_cpus_allowed = cpumask_weight(mask); + p->nr_cpus_allowed = cpumask_weight(mask); } - task_rq_unlock(rq, p, &flags); + raw_spin_unlock_irqrestore(&rq->lock, flags); preempt_enable(); } EXPORT_SYMBOL(migrate_disable); -@@ -5110,7 +5122,11 @@ void migrate_enable(void) +@@ -5337,7 +5349,11 @@ void migrate_enable(void) return; } @@ -59,8 +58,8 @@ index 42efb3c..fb1e8bb 100644 p->migrate_disable = 0; mask = tsk_cpus_allowed(p); -@@ -5122,7 +5138,7 @@ void migrate_enable(void) - p->rt.nr_cpus_allowed = cpumask_weight(mask); +@@ -5349,7 +5365,7 @@ void migrate_enable(void) + p->nr_cpus_allowed = cpumask_weight(mask); } - task_rq_unlock(rq, p, &flags); diff --git a/debian/patches/features/all/rt/0034-mm-pagefault_disabled.patch b/debian/patches/features/all/rt/peter_zijlstra-frob-pagefault_disable.patch similarity index 54% rename from debian/patches/features/all/rt/0034-mm-pagefault_disabled.patch rename to debian/patches/features/all/rt/peter_zijlstra-frob-pagefault_disable.patch index 662c07c1d..539c0c86b 100644 --- a/debian/patches/features/all/rt/0034-mm-pagefault_disabled.patch +++ b/debian/patches/features/all/rt/peter_zijlstra-frob-pagefault_disable.patch @@ -1,7 +1,6 @@ -From 18f00091ed648f77ace207462cf93d1c86de0194 Mon Sep 17 00:00:00 2001 +Subject: mm: pagefault_disabled() From: Peter Zijlstra -Date: Thu, 11 Aug 2011 15:31:31 +0200 -Subject: [034/256] mm: pagefault_disabled() +Date: Thu Aug 11 15:31:31 CEST 2011 Wrap the test for pagefault_disabled() into a helper, this allows us to remove the need for current->pagefault_disabled on !-rt kernels. @@ -24,7 +23,7 @@ Link: http://lkml.kernel.org/n/tip-3yy517m8zsi9fpsf14xfaqkw@git.kernel.org arch/powerpc/mm/fault.c | 2 +- arch/s390/mm/fault.c | 6 +++--- arch/score/mm/fault.c | 2 +- - arch/sh/mm/fault_32.c | 2 +- + arch/sh/mm/fault.c | 2 +- arch/sparc/mm/fault_32.c | 2 +- arch/sparc/mm/fault_64.c | 2 +- arch/tile/mm/fault.c | 2 +- @@ -35,11 +34,11 @@ Link: http://lkml.kernel.org/n/tip-3yy517m8zsi9fpsf14xfaqkw@git.kernel.org kernel/fork.c | 2 ++ 24 files changed, 40 insertions(+), 25 deletions(-) -diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c -index 0ddf6c0..ab6b9d13 100644 ---- a/arch/alpha/mm/fault.c -+++ b/arch/alpha/mm/fault.c -@@ -106,7 +106,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, +Index: linux-stable/arch/alpha/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/alpha/mm/fault.c ++++ linux-stable/arch/alpha/mm/fault.c +@@ -108,7 +108,7 @@ do_page_fault(unsigned long address, uns /* If we're in an interrupt context, or have no user context, we must not take the fault. */ @@ -48,11 +47,11 @@ index 0ddf6c0..ab6b9d13 100644 goto no_context; #ifdef CONFIG_ALPHA_LARGE_VMALLOC -diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c -index 40bd40f..17a9f4a 100644 ---- a/arch/arm/mm/fault.c -+++ b/arch/arm/mm/fault.c -@@ -279,7 +279,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) +Index: linux-stable/arch/arm/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/arm/mm/fault.c ++++ linux-stable/arch/arm/mm/fault.c +@@ -279,7 +279,7 @@ do_page_fault(unsigned long addr, unsign * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -61,11 +60,11 @@ index 40bd40f..17a9f4a 100644 goto no_context; /* -diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c -index 623a027..155ad8d 100644 ---- a/arch/avr32/mm/fault.c -+++ b/arch/avr32/mm/fault.c -@@ -81,8 +81,7 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs) +Index: linux-stable/arch/avr32/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/avr32/mm/fault.c ++++ linux-stable/arch/avr32/mm/fault.c +@@ -81,8 +81,7 @@ asmlinkage void do_page_fault(unsigned l * If we're in an interrupt or have no user context, we must * not take the fault... */ @@ -75,11 +74,11 @@ index 623a027..155ad8d 100644 goto no_context; local_irq_enable(); -diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c -index 1c1630e..886be8e 100644 ---- a/arch/cris/mm/fault.c -+++ b/arch/cris/mm/fault.c -@@ -112,7 +112,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs, +Index: linux-stable/arch/cris/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/cris/mm/fault.c ++++ linux-stable/arch/cris/mm/fault.c +@@ -114,7 +114,7 @@ do_page_fault(unsigned long address, str * user context, we must not take the fault. */ @@ -87,12 +86,12 @@ index 1c1630e..886be8e 100644 + if (!mm || pagefault_disabled()) goto no_context; - down_read(&mm->mmap_sem); -diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c -index 6372088..e87972c 100644 ---- a/arch/frv/mm/fault.c -+++ b/arch/frv/mm/fault.c -@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear + retry: +Index: linux-stable/arch/frv/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/frv/mm/fault.c ++++ linux-stable/arch/frv/mm/fault.c +@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(int datamm * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -101,11 +100,11 @@ index 6372088..e87972c 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c -index 721dbb9..8ca850e 100644 ---- a/arch/ia64/mm/fault.c -+++ b/arch/ia64/mm/fault.c -@@ -88,7 +88,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re +Index: linux-stable/arch/ia64/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/ia64/mm/fault.c ++++ linux-stable/arch/ia64/mm/fault.c +@@ -98,7 +98,7 @@ ia64_do_page_fault (unsigned long addres /* * If we're in an interrupt or have no user context, we must not take the fault.. */ @@ -114,11 +113,11 @@ index 721dbb9..8ca850e 100644 goto no_context; #ifdef CONFIG_VIRTUAL_MEM_MAP -diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c -index 1eec8af..6945056 100644 ---- a/arch/m32r/mm/fault.c -+++ b/arch/m32r/mm/fault.c -@@ -114,7 +114,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, +Index: linux-stable/arch/m32r/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/m32r/mm/fault.c ++++ linux-stable/arch/m32r/mm/fault.c +@@ -114,7 +114,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user context or are running in an * atomic region then we must not take the fault.. */ @@ -127,11 +126,11 @@ index 1eec8af..6945056 100644 goto bad_area_nosemaphore; /* When running in the kernel we expect faults to occur only to -diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c -index 7a4cc68..46b8cce 100644 ---- a/arch/m68k/mm/fault.c -+++ b/arch/m68k/mm/fault.c -@@ -84,7 +84,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, +Index: linux-stable/arch/m68k/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/m68k/mm/fault.c ++++ linux-stable/arch/m68k/mm/fault.c +@@ -85,7 +85,7 @@ int do_page_fault(struct pt_regs *regs, * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -139,12 +138,12 @@ index 7a4cc68..46b8cce 100644 + if (!mm || pagefault_disabled()) goto no_context; - down_read(&mm->mmap_sem); -diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c -index 621ad49..a438434 100644 ---- a/arch/microblaze/mm/fault.c -+++ b/arch/microblaze/mm/fault.c -@@ -106,7 +106,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, + retry: +Index: linux-stable/arch/microblaze/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/microblaze/mm/fault.c ++++ linux-stable/arch/microblaze/mm/fault.c +@@ -108,7 +108,7 @@ void do_page_fault(struct pt_regs *regs, if ((error_code & 0x13) == 0x13 || (error_code & 0x11) == 0x11) is_write = 0; @@ -153,11 +152,11 @@ index 621ad49..a438434 100644 if (kernel_mode(regs)) goto bad_area_nosemaphore; -diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c -index 3468e69..39a3180 100644 ---- a/arch/mips/mm/fault.c -+++ b/arch/mips/mm/fault.c -@@ -89,7 +89,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ +Index: linux-stable/arch/mips/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/mips/mm/fault.c ++++ linux-stable/arch/mips/mm/fault.c +@@ -89,7 +89,7 @@ asmlinkage void __kprobes do_page_fault( * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -166,11 +165,11 @@ index 3468e69..39a3180 100644 goto bad_area_nosemaphore; retry: -diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c -index ff5acf5..5d9e10f 100644 ---- a/arch/mn10300/mm/fault.c -+++ b/arch/mn10300/mm/fault.c -@@ -167,7 +167,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code, +Index: linux-stable/arch/mn10300/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/mn10300/mm/fault.c ++++ linux-stable/arch/mn10300/mm/fault.c +@@ -167,7 +167,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -179,11 +178,11 @@ index ff5acf5..5d9e10f 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c -index 09ecc8a..df22f39 100644 ---- a/arch/parisc/mm/fault.c -+++ b/arch/parisc/mm/fault.c -@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code, +Index: linux-stable/arch/parisc/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/parisc/mm/fault.c ++++ linux-stable/arch/parisc/mm/fault.c +@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long acc_type; int fault; @@ -192,11 +191,11 @@ index 09ecc8a..df22f39 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c -index 6642dff..7bd8f27 100644 ---- a/arch/powerpc/mm/fault.c -+++ b/arch/powerpc/mm/fault.c -@@ -261,7 +261,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, +Index: linux-stable/arch/powerpc/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/powerpc/mm/fault.c ++++ linux-stable/arch/powerpc/mm/fault.c +@@ -261,7 +261,7 @@ int __kprobes do_page_fault(struct pt_re if (!arch_irq_disabled_regs(regs)) local_irq_enable(); @@ -205,11 +204,11 @@ index 6642dff..7bd8f27 100644 if (!user_mode(regs)) return SIGSEGV; /* in_atomic() in user mode is really bad, -diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c -index f7d796f..e2994cb 100644 ---- a/arch/s390/mm/fault.c -+++ b/arch/s390/mm/fault.c -@@ -283,8 +283,8 @@ static inline int do_exception(struct pt_regs *regs, int access) +Index: linux-stable/arch/s390/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/s390/mm/fault.c ++++ linux-stable/arch/s390/mm/fault.c +@@ -286,8 +286,8 @@ static inline int do_exception(struct pt * user context. */ fault = VM_FAULT_BADCONTEXT; @@ -220,7 +219,7 @@ index f7d796f..e2994cb 100644 goto out; address = trans_exc_code & __FAIL_ADDR_MASK; -@@ -417,7 +417,7 @@ void __kprobes do_asce_exception(struct pt_regs *regs) +@@ -425,7 +425,7 @@ void __kprobes do_asce_exception(struct trans_exc_code = regs->int_parm_long; if (unlikely(!user_space_fault(trans_exc_code) || in_atomic() || !mm || @@ -229,11 +228,11 @@ index f7d796f..e2994cb 100644 goto no_context; down_read(&mm->mmap_sem); -diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c -index 4c12824..59fccbe 100644 ---- a/arch/score/mm/fault.c -+++ b/arch/score/mm/fault.c -@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, +Index: linux-stable/arch/score/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/score/mm/fault.c ++++ linux-stable/arch/score/mm/fault.c +@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_ * If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -242,76 +241,11 @@ index 4c12824..59fccbe 100644 goto bad_area_nosemaphore; down_read(&mm->mmap_sem); -diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c -index 8c3ae42..1aca948 100644 ---- a/arch/sh/mm/fault_32.c -+++ b/arch/sh/mm/fault_32.c -@@ -166,7 +166,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, - * If we're in an interrupt, have no user context or are running - * in an atomic region then we must not take the fault: - */ -- if (in_atomic() || !mm || current->pagefault_disabled) -+ if (!mm || pagefault_disabled()) - goto no_context; - - down_read(&mm->mmap_sem); -diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c -index ffaa99e..77b37e0 100644 ---- a/arch/sparc/mm/fault_32.c -+++ b/arch/sparc/mm/fault_32.c -@@ -248,7 +248,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write, - * If we're in an interrupt or have no user - * context, we must not take the fault.. - */ -- if (in_atomic() || !mm || current->pagefault_disabled) -+ if (!mm || pagefault_disabled()) - goto no_context; - - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); -diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c -index fbd5e11..ea4e14b 100644 ---- a/arch/sparc/mm/fault_64.c -+++ b/arch/sparc/mm/fault_64.c -@@ -323,7 +323,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) - * If we're in an interrupt or have no user - * context, we must not take the fault.. - */ -- if (in_atomic() || !mm || current->pagefault_enabled) -+ if (!mm || pagefault_disabled()) - goto intr_or_no_mm; - - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); -diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c -index f683aad..3e85178 100644 ---- a/arch/tile/mm/fault.c -+++ b/arch/tile/mm/fault.c -@@ -355,7 +355,7 @@ static int handle_page_fault(struct pt_regs *regs, - * If we're in an interrupt, have no user context or are running in an - * atomic region then we must not take the fault. - */ -- if (in_atomic() || !mm || current->pagefault_disabled) { -+ if (!mm || pagefault_disabled()) { - vma = NULL; /* happy compiler */ - goto bad_area_nosemaphore; - } -diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c -index a283400..7878069 100644 ---- a/arch/um/kernel/trap.c -+++ b/arch/um/kernel/trap.c -@@ -37,7 +37,7 @@ int handle_page_fault(unsigned long address, unsigned long ip, - * If the fault was during atomic operation, don't take the fault, just - * fail. - */ -- if (in_atomic() || !mm || current->pagefault_disabled) -+ if (!mm || pagefault_disabled()) - goto out_nosemaphore; - - down_read(&mm->mmap_sem); -diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c -index bb891f2..9d57357 100644 ---- a/arch/x86/mm/fault.c -+++ b/arch/x86/mm/fault.c -@@ -1094,7 +1094,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) +Index: linux-stable/arch/sh/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/sh/mm/fault.c ++++ linux-stable/arch/sh/mm/fault.c +@@ -445,7 +445,7 @@ asmlinkage void __kprobes do_page_fault( * If we're in an interrupt, have no user context or are running * in an atomic region then we must not take the fault: */ @@ -320,11 +254,76 @@ index bb891f2..9d57357 100644 bad_area_nosemaphore(regs, error_code, address); return; } -diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c -index cc58b7c..93d33ee 100644 ---- a/arch/xtensa/mm/fault.c -+++ b/arch/xtensa/mm/fault.c -@@ -56,7 +56,7 @@ void do_page_fault(struct pt_regs *regs) +Index: linux-stable/arch/sparc/mm/fault_32.c +=================================================================== +--- linux-stable.orig/arch/sparc/mm/fault_32.c ++++ linux-stable/arch/sparc/mm/fault_32.c +@@ -200,7 +200,7 @@ asmlinkage void do_sparc_fault(struct pt + * If we're in an interrupt or have no user + * context, we must not take the fault.. + */ +- if (in_atomic() || !mm || current->pagefault_disabled) ++ if (!mm || pagefault_disabled()) + goto no_context; + + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); +Index: linux-stable/arch/sparc/mm/fault_64.c +=================================================================== +--- linux-stable.orig/arch/sparc/mm/fault_64.c ++++ linux-stable/arch/sparc/mm/fault_64.c +@@ -323,7 +323,7 @@ asmlinkage void __kprobes do_sparc64_fau + * If we're in an interrupt or have no user + * context, we must not take the fault.. + */ +- if (in_atomic() || !mm || current->pagefault_enabled) ++ if (!mm || pagefault_disabled()) + goto intr_or_no_mm; + + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); +Index: linux-stable/arch/tile/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/tile/mm/fault.c ++++ linux-stable/arch/tile/mm/fault.c +@@ -359,7 +359,7 @@ static int handle_page_fault(struct pt_r + * If we're in an interrupt, have no user context or are running in an + * atomic region then we must not take the fault. + */ +- if (in_atomic() || !mm || current->pagefault_disabled) { ++ if (!mm || pagefault_disabled()) { + vma = NULL; /* happy compiler */ + goto bad_area_nosemaphore; + } +Index: linux-stable/arch/um/kernel/trap.c +=================================================================== +--- linux-stable.orig/arch/um/kernel/trap.c ++++ linux-stable/arch/um/kernel/trap.c +@@ -39,7 +39,7 @@ int handle_page_fault(unsigned long addr + * If the fault was during atomic operation, don't take the fault, just + * fail. + */ +- if (in_atomic() || current->pagefault_disabled) ++ if (pagefault_disabled()) + goto out_nosemaphore; + + retry: +Index: linux-stable/arch/x86/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/x86/mm/fault.c ++++ linux-stable/arch/x86/mm/fault.c +@@ -1094,7 +1094,7 @@ do_page_fault(struct pt_regs *regs, unsi + * If we're in an interrupt, have no user context or are running + * in an atomic region then we must not take the fault: + */ +- if (unlikely(in_atomic() || !mm || current->pagefault_disabled)) { ++ if (unlikely(!mm || pagefault_disabled())) { + bad_area_nosemaphore(regs, error_code, address); + return; + } +Index: linux-stable/arch/xtensa/mm/fault.c +=================================================================== +--- linux-stable.orig/arch/xtensa/mm/fault.c ++++ linux-stable/arch/xtensa/mm/fault.c +@@ -57,7 +57,7 @@ void do_page_fault(struct pt_regs *regs) /* If we're in an interrupt or have no user * context, we must not take the fault.. */ @@ -333,19 +332,19 @@ index cc58b7c..93d33ee 100644 bad_page_fault(regs, address, SIGSEGV); return; } -diff --git a/include/linux/sched.h b/include/linux/sched.h -index f0ee37f..f14b965 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -90,6 +90,7 @@ struct sched_param { - #include +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -91,6 +91,7 @@ struct sched_param { #include #include + #include +#include #include -@@ -1478,7 +1479,9 @@ struct task_struct { +@@ -1448,7 +1449,9 @@ struct task_struct { /* mutex deadlock detection */ struct mutex_waiter *blocked_on; #endif @@ -355,7 +354,7 @@ index f0ee37f..f14b965 100644 #ifdef CONFIG_TRACE_IRQFLAGS unsigned int irq_events; unsigned long hardirq_enable_ip; -@@ -1628,6 +1631,17 @@ struct task_struct { +@@ -1600,6 +1603,17 @@ struct task_struct { /* Future-safe accessor for struct task_struct's cpus_allowed. */ #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) @@ -373,11 +372,11 @@ index f0ee37f..f14b965 100644 /* * Priority of a process goes from 0..MAX_PRIO-1, valid RT * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH -diff --git a/kernel/fork.c b/kernel/fork.c -index fdf0795..4c9def3 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1265,7 +1265,9 @@ static struct task_struct *copy_process(unsigned long clone_flags, +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -1298,7 +1298,9 @@ static struct task_struct *copy_process( p->hardirq_context = 0; p->softirq_context = 0; #endif diff --git a/debian/patches/features/all/rt/0184-rcu-Frob-softirq-test.patch b/debian/patches/features/all/rt/peter_zijlstra-frob-rcu.patch similarity index 92% rename from debian/patches/features/all/rt/0184-rcu-Frob-softirq-test.patch rename to debian/patches/features/all/rt/peter_zijlstra-frob-rcu.patch index e3d28e552..35b36bc31 100644 --- a/debian/patches/features/all/rt/0184-rcu-Frob-softirq-test.patch +++ b/debian/patches/features/all/rt/peter_zijlstra-frob-rcu.patch @@ -1,7 +1,6 @@ -From d5ea213392a0b5d8cf42b252755f521848824f97 Mon Sep 17 00:00:00 2001 +Subject: rcu: Frob softirq test From: Peter Zijlstra -Date: Sat, 13 Aug 2011 00:23:17 +0200 -Subject: [184/256] rcu: Frob softirq test +Date: Sat Aug 13 00:23:17 CEST 2011 With RT_FULL we get the below wreckage: @@ -11,15 +10,15 @@ With RT_FULL we get the below wreckage: [ 126.060490] ------------------------------------------------------- [ 126.060492] irq/24-eth0/1235 is trying to acquire lock: [ 126.060495] (&(lock)->wait_lock#2){+.+...}, at: [] rt_mutex_slowunlock+0x16/0x55 -[ 126.060503] +[ 126.060503] [ 126.060504] but task is already holding lock: [ 126.060506] (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 -[ 126.060511] +[ 126.060511] [ 126.060511] which lock already depends on the new lock. -[ 126.060513] -[ 126.060514] +[ 126.060513] +[ 126.060514] [ 126.060514] the existing dependency chain (in reverse order) is: -[ 126.060516] +[ 126.060516] [ 126.060516] -> #1 (&p->pi_lock){-...-.}: [ 126.060519] [] lock_acquire+0x145/0x18a [ 126.060524] [] _raw_spin_lock_irqsave+0x4b/0x85 @@ -30,7 +29,7 @@ With RT_FULL we get the below wreckage: [ 126.060541] [] rcu_boost_kthread+0x7d/0x9b [ 126.060544] [] kthread+0x99/0xa1 [ 126.060547] [] kernel_thread_helper+0x4/0x10 -[ 126.060551] +[ 126.060551] [ 126.060552] -> #0 (&(lock)->wait_lock#2){+.+...}: [ 126.060555] [] __lock_acquire+0x1157/0x1816 [ 126.060558] [] lock_acquire+0x145/0x18a @@ -50,23 +49,23 @@ With RT_FULL we get the below wreckage: [ 126.060603] [] irq_thread+0xde/0x1af [ 126.060606] [] kthread+0x99/0xa1 [ 126.060608] [] kernel_thread_helper+0x4/0x10 -[ 126.060611] +[ 126.060611] [ 126.060612] other info that might help us debug this: -[ 126.060614] +[ 126.060614] [ 126.060615] Possible unsafe locking scenario: -[ 126.060616] +[ 126.060616] [ 126.060617] CPU0 CPU1 [ 126.060619] ---- ---- [ 126.060620] lock(&p->pi_lock); [ 126.060623] lock(&(lock)->wait_lock); [ 126.060625] lock(&p->pi_lock); [ 126.060627] lock(&(lock)->wait_lock); -[ 126.060629] +[ 126.060629] [ 126.060629] *** DEADLOCK *** -[ 126.060630] +[ 126.060630] [ 126.060632] 1 lock held by irq/24-eth0/1235: [ 126.060633] #0: (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 -[ 126.060638] +[ 126.060638] [ 126.060638] stack backtrace: [ 126.060641] Pid: 1235, comm: irq/24-eth0 Not tainted 3.0.1-rt10+ #30 [ 126.060643] Call Trace: @@ -154,11 +153,11 @@ Signed-off-by: Peter Zijlstra kernel/rcutree_plugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h -index c023464..e4cc151 100644 ---- a/kernel/rcutree_plugin.h -+++ b/kernel/rcutree_plugin.h -@@ -339,7 +339,7 @@ static noinline void rcu_read_unlock_special(struct task_struct *t) +Index: linux-stable/kernel/rcutree_plugin.h +=================================================================== +--- linux-stable.orig/kernel/rcutree_plugin.h ++++ linux-stable/kernel/rcutree_plugin.h +@@ -331,7 +331,7 @@ void rcu_read_unlock_special(struct task } /* Hardware IRQ handlers cannot block. */ diff --git a/debian/patches/features/all/rt/0035-mm-raw_pagefault_disable.patch b/debian/patches/features/all/rt/peterz-raw_pagefault_disable.patch similarity index 89% rename from debian/patches/features/all/rt/0035-mm-raw_pagefault_disable.patch rename to debian/patches/features/all/rt/peterz-raw_pagefault_disable.patch index 3f6b4a45e..071208179 100644 --- a/debian/patches/features/all/rt/0035-mm-raw_pagefault_disable.patch +++ b/debian/patches/features/all/rt/peterz-raw_pagefault_disable.patch @@ -1,7 +1,6 @@ -From 024afe6afcd8a2c40595b12375d3573d4bf2119b Mon Sep 17 00:00:00 2001 +Subject: mm: raw_pagefault_disable From: Peter Zijlstra -Date: Fri, 5 Aug 2011 17:16:58 +0200 -Subject: [035/256] mm: raw_pagefault_disable +Date: Fri Aug 05 17:16:58 CEST 2011 Adding migrate_disable() to pagefault_disable() to preserve the per-cpu thing for kmap_atomic might not have been the best of choices. @@ -71,6 +70,7 @@ that up by adding raw_pagefault_disable(). [] smp_apic_timer_interrupt+0x85/0x98 [] apic_timer_interrupt+0x13/0x20 + Signed-off-by: Peter Zijlstra Link: http://lkml.kernel.org/n/tip-31keae8mkjiv8esq4rl76cib@git.kernel.org --- @@ -78,10 +78,10 @@ Link: http://lkml.kernel.org/n/tip-31keae8mkjiv8esq4rl76cib@git.kernel.org mm/memory.c | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) -diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h -index 9414a1b..44b3751 100644 ---- a/include/linux/uaccess.h -+++ b/include/linux/uaccess.h +Index: linux-stable/include/linux/uaccess.h +=================================================================== +--- linux-stable.orig/include/linux/uaccess.h ++++ linux-stable/include/linux/uaccess.h @@ -8,8 +8,34 @@ * These routines enable/disable the pagefault handler in that * it will not take any MM locks and go straight to the fixup table. @@ -117,7 +117,7 @@ index 9414a1b..44b3751 100644 #ifndef ARCH_HAS_NOCACHE_UACCESS -@@ -50,9 +76,9 @@ static inline unsigned long __copy_from_user_nocache(void *to, +@@ -50,9 +76,9 @@ static inline unsigned long __copy_from_ mm_segment_t old_fs = get_fs(); \ \ set_fs(KERNEL_DS); \ @@ -129,11 +129,11 @@ index 9414a1b..44b3751 100644 set_fs(old_fs); \ ret; \ }) -diff --git a/mm/memory.c b/mm/memory.c -index c3b9c80..e996afe 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -3467,6 +3467,7 @@ unlock: +Index: linux-stable/mm/memory.c +=================================================================== +--- linux-stable.orig/mm/memory.c ++++ linux-stable/mm/memory.c +@@ -3484,6 +3484,7 @@ unlock: return 0; } @@ -141,7 +141,7 @@ index c3b9c80..e996afe 100644 void pagefault_disable(void) { inc_preempt_count(); -@@ -3495,6 +3496,7 @@ void pagefault_enable(void) +@@ -3512,6 +3513,7 @@ void pagefault_enable(void) preempt_check_resched(); } EXPORT_SYMBOL_GPL(pagefault_enable); diff --git a/debian/patches/features/all/rt/peterz-srcu-crypto-chain.patch b/debian/patches/features/all/rt/peterz-srcu-crypto-chain.patch new file mode 100644 index 000000000..d10596218 --- /dev/null +++ b/debian/patches/features/all/rt/peterz-srcu-crypto-chain.patch @@ -0,0 +1,196 @@ +Subject: crypto: Convert crypto notifier chain to SRCU +From: Peter Zijlstra +Date: Fri, 05 Oct 2012 09:03:24 +0100 + +The crypto notifier deadlocks on RT. Though this can be a real deadlock +on mainline as well due to fifo fair rwsems. + +The involved parties here are: + +[ 82.172678] swapper/0 S 0000000000000001 0 1 0 0x00000000 +[ 82.172682] ffff88042f18fcf0 0000000000000046 ffff88042f18fc80 ffffffff81491238 +[ 82.172685] 0000000000011cc0 0000000000011cc0 ffff88042f18c040 ffff88042f18ffd8 +[ 82.172688] 0000000000011cc0 0000000000011cc0 ffff88042f18ffd8 0000000000011cc0 +[ 82.172689] Call Trace: +[ 82.172697] [] ? _raw_spin_unlock_irqrestore+0x6c/0x7a +[ 82.172701] [] schedule+0x64/0x66 +[ 82.172704] [] schedule_timeout+0x27/0xd0 +[ 82.172708] [] ? unpin_current_cpu+0x1a/0x6c +[ 82.172713] [] ? migrate_enable+0x12f/0x141 +[ 82.172716] [] wait_for_common+0xbb/0x11f +[ 82.172719] [] ? try_to_wake_up+0x182/0x182 +[ 82.172722] [] wait_for_completion_interruptible+0x1d/0x2e +[ 82.172726] [] crypto_wait_for_test+0x49/0x6b +[ 82.172728] [] crypto_register_alg+0x53/0x5a +[ 82.172730] [] crypto_register_algs+0x33/0x72 +[ 82.172734] [] ? aes_init+0x12/0x12 +[ 82.172737] [] aesni_init+0x64/0x66 +[ 82.172741] [] do_one_initcall+0x7f/0x13b +[ 82.172744] [] kernel_init+0x199/0x22c +[ 82.172747] [] ? loglevel+0x31/0x31 +[ 82.172752] [] kernel_thread_helper+0x4/0x10 +[ 82.172755] [] ? retint_restore_args+0x13/0x13 +[ 82.172759] [] ? start_kernel+0x3ca/0x3ca +[ 82.172761] [] ? gs_change+0x13/0x13 + +[ 82.174186] cryptomgr_test S 0000000000000001 0 41 2 0x00000000 +[ 82.174189] ffff88042c971980 0000000000000046 ffffffff81d74830 0000000000000292 +[ 82.174192] 0000000000011cc0 0000000000011cc0 ffff88042c96eb80 ffff88042c971fd8 +[ 82.174195] 0000000000011cc0 0000000000011cc0 ffff88042c971fd8 0000000000011cc0 +[ 82.174195] Call Trace: +[ 82.174198] [] schedule+0x64/0x66 +[ 82.174201] [] schedule_timeout+0x27/0xd0 +[ 82.174204] [] ? unpin_current_cpu+0x1a/0x6c +[ 82.174206] [] ? migrate_enable+0x12f/0x141 +[ 82.174209] [] wait_for_common+0xbb/0x11f +[ 82.174212] [] ? try_to_wake_up+0x182/0x182 +[ 82.174215] [] wait_for_completion_interruptible+0x1d/0x2e +[ 82.174218] [] cryptomgr_notify+0x280/0x385 +[ 82.174221] [] notifier_call_chain+0x6b/0x98 +[ 82.174224] [] ? rt_down_read+0x10/0x12 +[ 82.174227] [] __blocking_notifier_call_chain+0x70/0x8d +[ 82.174230] [] blocking_notifier_call_chain+0x14/0x16 +[ 82.174234] [] crypto_probing_notify+0x24/0x50 +[ 82.174236] [] crypto_alg_mod_lookup+0x3e/0x74 +[ 82.174238] [] crypto_alloc_base+0x36/0x8f +[ 82.174241] [] cryptd_alloc_ablkcipher+0x6e/0xb5 +[ 82.174243] [] ? kzalloc.clone.5+0xe/0x10 +[ 82.174246] [] ablk_init_common+0x1d/0x38 +[ 82.174249] [] ablk_ecb_init+0x15/0x17 +[ 82.174251] [] __crypto_alloc_tfm+0xc7/0x114 +[ 82.174254] [] ? crypto_lookup_skcipher+0x1f/0xe4 +[ 82.174256] [] crypto_alloc_ablkcipher+0x60/0xa5 +[ 82.174258] [] alg_test_skcipher+0x24/0x9b +[ 82.174261] [] ? finish_task_switch+0x3f/0xfa +[ 82.174263] [] alg_test+0x16f/0x1d7 +[ 82.174267] [] ? cryptomgr_probe+0xac/0xac +[ 82.174269] [] cryptomgr_test+0x2c/0x47 +[ 82.174272] [] kthread+0x7e/0x86 +[ 82.174275] [] ? finish_task_switch+0xaf/0xfa +[ 82.174278] [] kernel_thread_helper+0x4/0x10 +[ 82.174281] [] ? retint_restore_args+0x13/0x13 +[ 82.174284] [] ? __init_kthread_worker+0x8c/0x8c +[ 82.174287] [] ? gs_change+0x13/0x13 + +[ 82.174329] cryptomgr_probe D 0000000000000002 0 47 2 0x00000000 +[ 82.174332] ffff88042c991b70 0000000000000046 ffff88042c991bb0 0000000000000006 +[ 82.174335] 0000000000011cc0 0000000000011cc0 ffff88042c98ed00 ffff88042c991fd8 +[ 82.174338] 0000000000011cc0 0000000000011cc0 ffff88042c991fd8 0000000000011cc0 +[ 82.174338] Call Trace: +[ 82.174342] [] schedule+0x64/0x66 +[ 82.174344] [] __rt_mutex_slowlock+0x85/0xbe +[ 82.174347] [] rt_mutex_slowlock+0xec/0x159 +[ 82.174351] [] rt_mutex_fastlock.clone.8+0x29/0x2f +[ 82.174353] [] rt_mutex_lock+0x33/0x37 +[ 82.174356] [] __rt_down_read+0x50/0x5a +[ 82.174358] [] ? rt_down_read+0x10/0x12 +[ 82.174360] [] rt_down_read+0x10/0x12 +[ 82.174363] [] __blocking_notifier_call_chain+0x58/0x8d +[ 82.174366] [] blocking_notifier_call_chain+0x14/0x16 +[ 82.174369] [] crypto_probing_notify+0x24/0x50 +[ 82.174372] [] crypto_wait_for_test+0x22/0x6b +[ 82.174374] [] crypto_register_instance+0xb4/0xc0 +[ 82.174377] [] cryptd_create+0x378/0x3b6 +[ 82.174379] [] ? __crypto_lookup_template+0x5b/0x63 +[ 82.174382] [] cryptomgr_probe+0x45/0xac +[ 82.174385] [] ? crypto_alloc_pcomp+0x1b/0x1b +[ 82.174388] [] kthread+0x7e/0x86 +[ 82.174391] [] ? finish_task_switch+0xaf/0xfa +[ 82.174394] [] kernel_thread_helper+0x4/0x10 +[ 82.174398] [] ? retint_restore_args+0x13/0x13 +[ 82.174401] [] ? __init_kthread_worker+0x8c/0x8c +[ 82.174403] [] ? gs_change+0x13/0x13 + +cryptomgr_test spawns the cryptomgr_probe thread from the notifier +call. The probe thread fires the same notifier as the test thread and +deadlocks on the rwsem on RT. + +Now this is a potential deadlock in mainline as well, because we have +fifo fair rwsems. If another thread blocks with a down_write() on the +notifier chain before the probe thread issues the down_read() it will +block the probe thread and the whole party is dead locked. + +Signed-off-by: Peter Zijlstra +Signed-off-by: Thomas Gleixner +--- + crypto/algapi.c | 5 +++-- + crypto/api.c | 6 +++--- + crypto/internal.h | 4 ++-- + 3 files changed, 8 insertions(+), 7 deletions(-) + +Index: linux-stable/crypto/algapi.c +=================================================================== +--- linux-stable.orig/crypto/algapi.c ++++ linux-stable/crypto/algapi.c +@@ -683,13 +683,13 @@ EXPORT_SYMBOL_GPL(crypto_spawn_tfm2); + + int crypto_register_notifier(struct notifier_block *nb) + { +- return blocking_notifier_chain_register(&crypto_chain, nb); ++ return srcu_notifier_chain_register(&crypto_chain, nb); + } + EXPORT_SYMBOL_GPL(crypto_register_notifier); + + int crypto_unregister_notifier(struct notifier_block *nb) + { +- return blocking_notifier_chain_unregister(&crypto_chain, nb); ++ return srcu_notifier_chain_unregister(&crypto_chain, nb); + } + EXPORT_SYMBOL_GPL(crypto_unregister_notifier); + +@@ -956,6 +956,7 @@ EXPORT_SYMBOL_GPL(crypto_xor); + + static int __init crypto_algapi_init(void) + { ++ srcu_init_notifier_head(&crypto_chain); + crypto_init_proc(); + return 0; + } +Index: linux-stable/crypto/api.c +=================================================================== +--- linux-stable.orig/crypto/api.c ++++ linux-stable/crypto/api.c +@@ -31,7 +31,7 @@ EXPORT_SYMBOL_GPL(crypto_alg_list); + DECLARE_RWSEM(crypto_alg_sem); + EXPORT_SYMBOL_GPL(crypto_alg_sem); + +-BLOCKING_NOTIFIER_HEAD(crypto_chain); ++struct srcu_notifier_head crypto_chain; + EXPORT_SYMBOL_GPL(crypto_chain); + + static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg) +@@ -237,10 +237,10 @@ int crypto_probing_notify(unsigned long + { + int ok; + +- ok = blocking_notifier_call_chain(&crypto_chain, val, v); ++ ok = srcu_notifier_call_chain(&crypto_chain, val, v); + if (ok == NOTIFY_DONE) { + request_module("cryptomgr"); +- ok = blocking_notifier_call_chain(&crypto_chain, val, v); ++ ok = srcu_notifier_call_chain(&crypto_chain, val, v); + } + + return ok; +Index: linux-stable/crypto/internal.h +=================================================================== +--- linux-stable.orig/crypto/internal.h ++++ linux-stable/crypto/internal.h +@@ -48,7 +48,7 @@ struct crypto_larval { + + extern struct list_head crypto_alg_list; + extern struct rw_semaphore crypto_alg_sem; +-extern struct blocking_notifier_head crypto_chain; ++extern struct srcu_notifier_head crypto_chain; + + #ifdef CONFIG_PROC_FS + void __init crypto_init_proc(void); +@@ -136,7 +136,7 @@ static inline int crypto_is_moribund(str + + static inline void crypto_notify(unsigned long val, void *v) + { +- blocking_notifier_call_chain(&crypto_chain, val, v); ++ srcu_notifier_call_chain(&crypto_chain, val, v); + } + + #endif /* _CRYPTO_INTERNAL_H */ diff --git a/debian/patches/features/all/rt/0045-rwsem-inlcude-fix.patch.patch b/debian/patches/features/all/rt/pid-h-include-atomic-h.patch similarity index 55% rename from debian/patches/features/all/rt/0045-rwsem-inlcude-fix.patch.patch rename to debian/patches/features/all/rt/pid-h-include-atomic-h.patch index 5fb556493..6be98922f 100644 --- a/debian/patches/features/all/rt/0045-rwsem-inlcude-fix.patch.patch +++ b/debian/patches/features/all/rt/pid-h-include-atomic-h.patch @@ -1,17 +1,16 @@ -From 712a03975ed20d20f189565f9a307949f62c762b Mon Sep 17 00:00:00 2001 +Subject: rwsem-inlcude-fix.patch From: Thomas Gleixner Date: Fri, 15 Jul 2011 21:24:27 +0200 -Subject: [045/256] rwsem-inlcude-fix.patch Signed-off-by: Thomas Gleixner --- include/linux/pid.h | 1 + 1 file changed, 1 insertion(+) -diff --git a/include/linux/pid.h b/include/linux/pid.h -index b152d44..7f33683 100644 ---- a/include/linux/pid.h -+++ b/include/linux/pid.h +Index: linux-stable/include/linux/pid.h +=================================================================== +--- linux-stable.orig/include/linux/pid.h ++++ linux-stable/include/linux/pid.h @@ -2,6 +2,7 @@ #define _LINUX_PID_H diff --git a/debian/patches/features/all/rt/0224-ping-sysrq.patch.patch b/debian/patches/features/all/rt/ping-sysrq.patch similarity index 74% rename from debian/patches/features/all/rt/0224-ping-sysrq.patch.patch rename to debian/patches/features/all/rt/ping-sysrq.patch index 44a882ffa..44743a1e5 100644 --- a/debian/patches/features/all/rt/0224-ping-sysrq.patch.patch +++ b/debian/patches/features/all/rt/ping-sysrq.patch @@ -1,7 +1,6 @@ -From c03b593dacf8da19b3422391c38a566fba3d7a02 Mon Sep 17 00:00:00 2001 +Subject: net: sysrq via icmp From: Carsten Emde Date: Tue, 19 Jul 2011 13:51:17 +0100 -Subject: [224/256] ping-sysrq.patch There are (probably rare) situations when a system crashed and the system console becomes unresponsive but the network icmp layer still is alive. @@ -11,6 +10,7 @@ This patch provides this facility. Please consult the updated documentation Documentation/sysrq.txt for details. Signed-off-by: Carsten Emde + --- Documentation/sysrq.txt | 11 +++++++++-- include/net/netns/ipv4.h | 1 + @@ -18,11 +18,11 @@ Signed-off-by: Carsten Emde net/ipv4/sysctl_net_ipv4.c | 7 +++++++ 4 files changed, 47 insertions(+), 2 deletions(-) -diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt -index 642f844..bd283ed 100644 ---- a/Documentation/sysrq.txt -+++ b/Documentation/sysrq.txt -@@ -57,10 +57,17 @@ On PowerPC - Press 'ALT - Print Screen (or F13) - , +Index: linux-stable/Documentation/sysrq.txt +=================================================================== +--- linux-stable.orig/Documentation/sysrq.txt ++++ linux-stable/Documentation/sysrq.txt +@@ -57,10 +57,17 @@ On PowerPC - Press 'ALT - Print Screen ( On other - If you know of the key combos for other architectures, please let me know so I can add them to this section. @@ -35,18 +35,18 @@ index 642f844..bd283ed 100644 + echo 0x01020304 >/proc/sys/net/ipv4/icmp_echo_sysrq + Send an ICMP echo request with this pattern plus the particular + SysRq command key. Example: -+ # ping -c1 -s57 -p0102030468 ++ # ping -c1 -s57 -p0102030468 + will trigger the SysRq-H (help) command. + + * What are the 'command' keys? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'b' - Will immediately reboot the system without syncing or unmounting -diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h -index bbd023a..643911e 100644 ---- a/include/net/netns/ipv4.h -+++ b/include/net/netns/ipv4.h -@@ -47,6 +47,7 @@ struct netns_ipv4 { +Index: linux-stable/include/net/netns/ipv4.h +=================================================================== +--- linux-stable.orig/include/net/netns/ipv4.h ++++ linux-stable/include/net/netns/ipv4.h +@@ -57,6 +57,7 @@ struct netns_ipv4 { int sysctl_icmp_echo_ignore_all; int sysctl_icmp_echo_ignore_broadcasts; @@ -54,10 +54,10 @@ index bbd023a..643911e 100644 int sysctl_icmp_ignore_bogus_error_responses; int sysctl_icmp_ratelimit; int sysctl_icmp_ratemask; -diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c -index 2cb2bf8..9a37732 100644 ---- a/net/ipv4/icmp.c -+++ b/net/ipv4/icmp.c +Index: linux-stable/net/ipv4/icmp.c +=================================================================== +--- linux-stable.orig/net/ipv4/icmp.c ++++ linux-stable/net/ipv4/icmp.c @@ -69,6 +69,7 @@ #include #include @@ -66,7 +66,7 @@ index 2cb2bf8..9a37732 100644 #include #include #include -@@ -799,6 +800,30 @@ out_err: +@@ -767,6 +768,30 @@ static void icmp_redirect(struct sk_buff } /* @@ -97,7 +97,7 @@ index 2cb2bf8..9a37732 100644 * Handle ICMP_ECHO ("ping") requests. * * RFC 1122: 3.2.2.6 MUST have an echo server that answers ICMP echo -@@ -825,6 +850,11 @@ static void icmp_echo(struct sk_buff *skb) +@@ -793,6 +818,11 @@ static void icmp_echo(struct sk_buff *sk icmp_param.data_len = skb->len; icmp_param.head_len = sizeof(struct icmphdr); icmp_reply(&icmp_param, skb); @@ -109,11 +109,11 @@ index 2cb2bf8..9a37732 100644 } } -diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c -index 7a7724d..96c6109 100644 ---- a/net/ipv4/sysctl_net_ipv4.c -+++ b/net/ipv4/sysctl_net_ipv4.c -@@ -718,6 +718,13 @@ static struct ctl_table ipv4_net_table[] = { +Index: linux-stable/net/ipv4/sysctl_net_ipv4.c +=================================================================== +--- linux-stable.orig/net/ipv4/sysctl_net_ipv4.c ++++ linux-stable/net/ipv4/sysctl_net_ipv4.c +@@ -756,6 +756,13 @@ static struct ctl_table ipv4_net_table[] .proc_handler = proc_dointvec }, { diff --git a/debian/patches/features/all/rt/0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch b/debian/patches/features/all/rt/posix-timers-avoid-wakeups-when-no-timers-are-active.patch similarity index 74% rename from debian/patches/features/all/rt/0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch rename to debian/patches/features/all/rt/posix-timers-avoid-wakeups-when-no-timers-are-active.patch index fbddc648a..edf4ecc63 100644 --- a/debian/patches/features/all/rt/0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch +++ b/debian/patches/features/all/rt/posix-timers-avoid-wakeups-when-no-timers-are-active.patch @@ -1,19 +1,19 @@ -From a819843d215ebad5b84fbdb585d2aa4f7bed7748 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:44 -0500 -Subject: [123/256] posix-timers: Avoid wakeups when no timers are active +Subject: posix-timers: Avoid wakeups when no timers are active Waking the thread even when no timers are scheduled is useless. Signed-off-by: Thomas Gleixner + --- kernel/posix-cpu-timers.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) -diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c -index 09eb469..2af6ea68 100644 ---- a/kernel/posix-cpu-timers.c -+++ b/kernel/posix-cpu-timers.c +Index: linux-stable/kernel/posix-cpu-timers.c +=================================================================== +--- linux-stable.orig/kernel/posix-cpu-timers.c ++++ linux-stable/kernel/posix-cpu-timers.c @@ -1408,6 +1408,21 @@ wait_to_die: return 0; } @@ -36,7 +36,7 @@ index 09eb469..2af6ea68 100644 void run_posix_cpu_timers(struct task_struct *tsk) { unsigned long cpu = smp_processor_id(); -@@ -1420,7 +1435,7 @@ void run_posix_cpu_timers(struct task_struct *tsk) +@@ -1420,7 +1435,7 @@ void run_posix_cpu_timers(struct task_st tasklist = per_cpu(posix_timer_tasklist, cpu); /* check to see if we're already queued */ @@ -45,7 +45,7 @@ index 09eb469..2af6ea68 100644 get_task_struct(tsk); if (tasklist) { tsk->posix_timer_list = tasklist; -@@ -1432,9 +1447,9 @@ void run_posix_cpu_timers(struct task_struct *tsk) +@@ -1432,9 +1447,9 @@ void run_posix_cpu_timers(struct task_st tsk->posix_timer_list = tsk; } per_cpu(posix_timer_tasklist, cpu) = tsk; diff --git a/debian/patches/features/all/rt/0021-posix-timers-Prevent-broadcast-signals.patch b/debian/patches/features/all/rt/posix-timers-no-broadcast.patch similarity index 66% rename from debian/patches/features/all/rt/0021-posix-timers-Prevent-broadcast-signals.patch rename to debian/patches/features/all/rt/posix-timers-no-broadcast.patch index aa095c631..46f0801c3 100644 --- a/debian/patches/features/all/rt/0021-posix-timers-Prevent-broadcast-signals.patch +++ b/debian/patches/features/all/rt/posix-timers-no-broadcast.patch @@ -1,21 +1,21 @@ -From d4e4500394adb167a94c878ed6c7cc8ecdb26da1 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:29:20 -0500 -Subject: [021/256] posix-timers: Prevent broadcast signals +Subject: posix-timers: Prevent broadcast signals Posix timers should not send broadcast signals and kernel only signals. Prevent it. Signed-off-by: Thomas Gleixner + --- kernel/posix-timers.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) -diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c -index 69185ae..7b73c34 100644 ---- a/kernel/posix-timers.c -+++ b/kernel/posix-timers.c -@@ -439,6 +439,7 @@ static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer) +Index: linux-stable/kernel/posix-timers.c +=================================================================== +--- linux-stable.orig/kernel/posix-timers.c ++++ linux-stable/kernel/posix-timers.c +@@ -439,6 +439,7 @@ static enum hrtimer_restart posix_timer_ static struct pid *good_sigevent(sigevent_t * event) { struct task_struct *rtn = current->group_leader; @@ -23,7 +23,7 @@ index 69185ae..7b73c34 100644 if ((event->sigev_notify & SIGEV_THREAD_ID ) && (!(rtn = find_task_by_vpid(event->sigev_notify_thread_id)) || -@@ -447,7 +448,8 @@ static struct pid *good_sigevent(sigevent_t * event) +@@ -447,7 +448,8 @@ static struct pid *good_sigevent(sigeven return NULL; if (((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) && diff --git a/debian/patches/features/all/rt/0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch b/debian/patches/features/all/rt/posix-timers-shorten-cpu-timers-thread.patch similarity index 63% rename from debian/patches/features/all/rt/0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch rename to debian/patches/features/all/rt/posix-timers-shorten-cpu-timers-thread.patch index e174896a9..f0b8a6995 100644 --- a/debian/patches/features/all/rt/0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch +++ b/debian/patches/features/all/rt/posix-timers-shorten-cpu-timers-thread.patch @@ -1,8 +1,6 @@ -From d43c6637939cbe4ffd20739ab80b6089d7c8f07e Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 3 Jul 2009 08:30:00 -0500 -Subject: [122/256] posix-timers: Shorten posix_cpu_timers/ kernel thread - names +Subject: posix-timers: Shorten posix_cpu_timers/ kernel thread names Shorten the softirq kernel thread names because they always overflow the limited comm length, appearing as "posix_cpu_timer" CPU# times. @@ -10,15 +8,16 @@ limited comm length, appearing as "posix_cpu_timer" CPU# times. Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- kernel/posix-cpu-timers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c -index 63468d1..09eb469 100644 ---- a/kernel/posix-cpu-timers.c -+++ b/kernel/posix-cpu-timers.c -@@ -1451,7 +1451,7 @@ static int posix_cpu_thread_call(struct notifier_block *nfb, +Index: linux-stable/kernel/posix-cpu-timers.c +=================================================================== +--- linux-stable.orig/kernel/posix-cpu-timers.c ++++ linux-stable/kernel/posix-cpu-timers.c +@@ -1451,7 +1451,7 @@ static int posix_cpu_thread_call(struct switch (action) { case CPU_UP_PREPARE: p = kthread_create(posix_cpu_timers_thread, hcpu, diff --git a/debian/patches/features/all/rt/0121-posix-timers-thread-posix-cpu-timers-on-rt.patch b/debian/patches/features/all/rt/posix-timers-thread-posix-cpu-timers-on-rt.patch similarity index 83% rename from debian/patches/features/all/rt/0121-posix-timers-thread-posix-cpu-timers-on-rt.patch rename to debian/patches/features/all/rt/posix-timers-thread-posix-cpu-timers-on-rt.patch index 15d115b6d..ffb6d437e 100644 --- a/debian/patches/features/all/rt/0121-posix-timers-thread-posix-cpu-timers-on-rt.patch +++ b/debian/patches/features/all/rt/posix-timers-thread-posix-cpu-timers-on-rt.patch @@ -1,7 +1,6 @@ -From 2bb51fa71528853384b1cf3873f06853fd454b51 Mon Sep 17 00:00:00 2001 From: John Stultz Date: Fri, 3 Jul 2009 08:29:58 -0500 -Subject: [121/256] posix-timers: thread posix-cpu-timers on -rt +Subject: posix-timers: thread posix-cpu-timers on -rt posix-cpu-timer code takes non -rt safe locks in hard irq context. Move it to a thread. @@ -10,19 +9,20 @@ context. Move it to a thread. Signed-off-by: John Stultz Signed-off-by: Thomas Gleixner + --- - include/linux/init_task.h | 7 ++ - include/linux/sched.h | 3 + - init/main.c | 1 + - kernel/fork.c | 3 + - kernel/posix-cpu-timers.c | 182 +++++++++++++++++++++++++++++++++++++++++++-- + include/linux/init_task.h | 7 + + include/linux/sched.h | 3 + init/main.c | 1 + kernel/fork.c | 3 + kernel/posix-cpu-timers.c | 182 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 190 insertions(+), 6 deletions(-) -diff --git a/include/linux/init_task.h b/include/linux/init_task.h -index e4baff5..29334a5 100644 ---- a/include/linux/init_task.h -+++ b/include/linux/init_task.h -@@ -132,6 +132,12 @@ extern struct cred init_cred; +Index: linux-stable/include/linux/init_task.h +=================================================================== +--- linux-stable.orig/include/linux/init_task.h ++++ linux-stable/include/linux/init_task.h +@@ -141,6 +141,12 @@ extern struct task_group root_task_group # define INIT_PERF_EVENTS(tsk) #endif @@ -35,7 +35,7 @@ index e4baff5..29334a5 100644 #define INIT_TASK_COMM "swapper" /* -@@ -186,6 +192,7 @@ extern struct cred init_cred; +@@ -196,6 +202,7 @@ extern struct task_group root_task_group .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(tsk.pi_lock), \ .timer_slack_ns = 50000, /* 50 usec default slack */ \ @@ -43,11 +43,11 @@ index e4baff5..29334a5 100644 .pids = { \ [PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \ [PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \ -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 5b63855..b997506 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1403,6 +1403,9 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1373,6 +1373,9 @@ struct task_struct { struct task_cputime cputime_expires; struct list_head cpu_timers[3]; @@ -57,23 +57,23 @@ index 5b63855..b997506 100644 /* process credentials */ const struct cred __rcu *real_cred; /* objective and real subjective task -diff --git a/init/main.c b/init/main.c -index b08c5f7..7896ec9 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -68,6 +68,7 @@ - #include +Index: linux-stable/init/main.c +=================================================================== +--- linux-stable.orig/init/main.c ++++ linux-stable/init/main.c +@@ -69,6 +69,7 @@ #include #include + #include +#include #include #include -diff --git a/kernel/fork.c b/kernel/fork.c -index 4c9def3..45a45b7 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1098,6 +1098,9 @@ void mm_init_owner(struct mm_struct *mm, struct task_struct *p) +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -1130,6 +1130,9 @@ void mm_init_owner(struct mm_struct *mm, */ static void posix_cpu_timers_init(struct task_struct *tsk) { @@ -83,11 +83,11 @@ index 4c9def3..45a45b7 100644 tsk->cputime_expires.prof_exp = 0; tsk->cputime_expires.virt_exp = 0; tsk->cputime_expires.sched_exp = 0; -diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c -index 125cb67..63468d1 100644 ---- a/kernel/posix-cpu-timers.c -+++ b/kernel/posix-cpu-timers.c -@@ -682,7 +682,7 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int flags, +Index: linux-stable/kernel/posix-cpu-timers.c +=================================================================== +--- linux-stable.orig/kernel/posix-cpu-timers.c ++++ linux-stable/kernel/posix-cpu-timers.c +@@ -682,7 +682,7 @@ static int posix_cpu_timer_set(struct k_ /* * Disarm any old timer after extracting its expiry time. */ @@ -96,7 +96,7 @@ index 125cb67..63468d1 100644 ret = 0; old_incr = timer->it.cpu.incr; -@@ -1198,7 +1198,7 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) +@@ -1198,7 +1198,7 @@ void posix_cpu_timer_schedule(struct k_i /* * Now re-arm for the new expiry time. */ @@ -105,7 +105,7 @@ index 125cb67..63468d1 100644 arm_timer(timer); spin_unlock(&p->sighand->siglock); -@@ -1262,10 +1262,11 @@ static inline int fastpath_timer_check(struct task_struct *tsk) +@@ -1262,10 +1262,11 @@ static inline int fastpath_timer_check(s sig = tsk->signal; if (sig->cputimer.running) { struct task_cputime group_sample; @@ -119,7 +119,7 @@ index 125cb67..63468d1 100644 if (task_cputime_expired(&group_sample, &sig->cputime_expires)) return 1; -@@ -1279,13 +1280,13 @@ static inline int fastpath_timer_check(struct task_struct *tsk) +@@ -1279,13 +1280,13 @@ static inline int fastpath_timer_check(s * already updated our counts. We need to check if any timers fire now. * Interrupts are disabled. */ @@ -135,7 +135,7 @@ index 125cb67..63468d1 100644 /* * The fast path checks that there are no expired thread or thread -@@ -1343,6 +1344,175 @@ void run_posix_cpu_timers(struct task_struct *tsk) +@@ -1343,6 +1344,175 @@ void run_posix_cpu_timers(struct task_st } } diff --git a/debian/patches/features/all/rt/0219-power-disable-highmem-on-rt.patch.patch b/debian/patches/features/all/rt/power-disable-highmem-on-rt.patch similarity index 51% rename from debian/patches/features/all/rt/0219-power-disable-highmem-on-rt.patch.patch rename to debian/patches/features/all/rt/power-disable-highmem-on-rt.patch index bd7c035c5..481bfaff2 100644 --- a/debian/patches/features/all/rt/0219-power-disable-highmem-on-rt.patch.patch +++ b/debian/patches/features/all/rt/power-disable-highmem-on-rt.patch @@ -1,23 +1,22 @@ -From b0c5b2c481c27ca0c81463536b9fd60e0375b1e6 Mon Sep 17 00:00:00 2001 +Subject: power-disable-highmem-on-rt.patch From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:08:34 +0200 -Subject: [219/256] power-disable-highmem-on-rt.patch Signed-off-by: Thomas Gleixner --- arch/powerpc/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index 981d71f..86e2322 100644 ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -283,7 +283,7 @@ menu "Kernel options" +Index: linux-stable/arch/powerpc/Kconfig +=================================================================== +--- linux-stable.orig/arch/powerpc/Kconfig ++++ linux-stable/arch/powerpc/Kconfig +@@ -278,7 +278,7 @@ menu "Kernel options" config HIGHMEM bool "High memory support" - depends on PPC32 + depends on PPC32 && !PREEMPT_RT_FULL - source kernel/time/Kconfig source kernel/Kconfig.hz + source kernel/Kconfig.preempt diff --git a/debian/patches/features/all/rt/power-use-generic-rwsem-on-rt.patch b/debian/patches/features/all/rt/power-use-generic-rwsem-on-rt.patch new file mode 100644 index 000000000..c68860d09 --- /dev/null +++ b/debian/patches/features/all/rt/power-use-generic-rwsem-on-rt.patch @@ -0,0 +1,25 @@ +From: Thomas Gleixner +Subject: Powerpc: Use generic rwsem on RT + +Signed-off-by: Thomas Gleixner +--- + arch/powerpc/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: linux-stable/arch/powerpc/Kconfig +=================================================================== +--- linux-stable.orig/arch/powerpc/Kconfig ++++ linux-stable/arch/powerpc/Kconfig +@@ -60,10 +60,11 @@ config LOCKDEP_SUPPORT + + config RWSEM_GENERIC_SPINLOCK + bool ++ default y if PREEMPT_RT_FULL + + config RWSEM_XCHGADD_ALGORITHM + bool +- default y ++ default y if !PREEMPT_RT_FULL + + config GENERIC_LOCKBREAK + bool diff --git a/debian/patches/features/all/rt/ppc-mark-low-level-handlers-no-thread.patch b/debian/patches/features/all/rt/ppc-mark-low-level-handlers-no-thread.patch new file mode 100644 index 000000000..cd00a615c --- /dev/null +++ b/debian/patches/features/all/rt/ppc-mark-low-level-handlers-no-thread.patch @@ -0,0 +1,39 @@ +From: Thomas Gleixner +Date: Mon, 18 Jun 2012 19:53:17 +0200 +Subject: powerpc: Mark low level irq handlers NO_THREAD + +These low level handlers cannot be threaded. Mark them NO_THREAD + +Reported-by: leroy christophe +Tested-by: leroy christophe +Signed-off-by: Thomas Gleixner + +--- + arch/powerpc/platforms/8xx/m8xx_setup.c | 1 + + arch/powerpc/sysdev/cpm1.c | 1 + + 2 files changed, 2 insertions(+) + +Index: linux-stable/arch/powerpc/platforms/8xx/m8xx_setup.c +=================================================================== +--- linux-stable.orig/arch/powerpc/platforms/8xx/m8xx_setup.c ++++ linux-stable/arch/powerpc/platforms/8xx/m8xx_setup.c +@@ -43,6 +43,7 @@ static irqreturn_t timebase_interrupt(in + + static struct irqaction tbint_irqaction = { + .handler = timebase_interrupt, ++ .flags = IRQF_NO_THREAD, + .name = "tbint", + }; + +Index: linux-stable/arch/powerpc/sysdev/cpm1.c +=================================================================== +--- linux-stable.orig/arch/powerpc/sysdev/cpm1.c ++++ linux-stable/arch/powerpc/sysdev/cpm1.c +@@ -120,6 +120,7 @@ static irqreturn_t cpm_error_interrupt(i + + static struct irqaction cpm_error_irqaction = { + .handler = cpm_error_interrupt, ++ .flags = IRQF_NO_THREAD, + .name = "error", + }; + diff --git a/debian/patches/features/all/rt/0063-preempt-Provide-preempt_-_-no-rt-variants.patch b/debian/patches/features/all/rt/preempt-nort-rt-variants.patch similarity index 83% rename from debian/patches/features/all/rt/0063-preempt-Provide-preempt_-_-no-rt-variants.patch rename to debian/patches/features/all/rt/preempt-nort-rt-variants.patch index b8a7d2d30..94549dded 100644 --- a/debian/patches/features/all/rt/0063-preempt-Provide-preempt_-_-no-rt-variants.patch +++ b/debian/patches/features/all/rt/preempt-nort-rt-variants.patch @@ -1,20 +1,20 @@ -From 80a25976f8e91af5f742c4cb2603fc67615da181 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 24 Jul 2009 12:38:56 +0200 -Subject: [063/256] preempt: Provide preempt_*_(no)rt variants +Subject: preempt: Provide preempt_*_(no)rt variants RT needs a few preempt_disable/enable points which are not necessary otherwise. Implement variants to avoid #ifdeffery. Signed-off-by: Thomas Gleixner + --- include/linux/preempt.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 5a710b9..5b46536 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h +Index: linux-stable/include/linux/preempt.h +=================================================================== +--- linux-stable.orig/include/linux/preempt.h ++++ linux-stable/include/linux/preempt.h @@ -54,11 +54,15 @@ do { \ dec_preempt_count(); \ } while (0) diff --git a/debian/patches/features/all/rt/0059-printk-force_early_printk-boot-param-to-help-with-de.patch b/debian/patches/features/all/rt/printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch similarity index 58% rename from debian/patches/features/all/rt/0059-printk-force_early_printk-boot-param-to-help-with-de.patch rename to debian/patches/features/all/rt/printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch index 54cc3a1bb..6abf87eea 100644 --- a/debian/patches/features/all/rt/0059-printk-force_early_printk-boot-param-to-help-with-de.patch +++ b/debian/patches/features/all/rt/printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch @@ -1,8 +1,10 @@ -From a68766e166c72cd6c07a4a2cb2cbbaba2a18a220 Mon Sep 17 00:00:00 2001 +Subject: printk: %27force_early_printk%27 boot param to help with debugging +From: Peter Zijlstra +Date: Fri, 02 Sep 2011 14:41:29 +0200 + +Subject: printk: 'force_early_printk' boot param to help with debugging From: Peter Zijlstra -Date: Fri, 2 Sep 2011 14:29:33 +0200 -Subject: [059/256] printk: 'force_early_printk' boot param to help with - debugging +Date: Fri Sep 02 14:29:33 CEST 2011 Gives me an option to screw printk and actually see what the machine says. @@ -15,11 +17,11 @@ Link: http://lkml.kernel.org/n/tip-ykb97nsfmobq44xketrxs977@git.kernel.org kernel/printk.c | 7 +++++++ 1 file changed, 7 insertions(+) -diff --git a/kernel/printk.c b/kernel/printk.c -index 5a172f9..300952e 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -547,6 +547,13 @@ asmlinkage void early_printk(const char *fmt, ...) +Index: linux-stable/kernel/printk.c +=================================================================== +--- linux-stable.orig/kernel/printk.c ++++ linux-stable/kernel/printk.c +@@ -1255,6 +1255,13 @@ asmlinkage void early_printk(const char */ static bool __read_mostly printk_killswitch; diff --git a/debian/patches/features/all/rt/0058-printk-kill.patch.patch b/debian/patches/features/all/rt/printk-kill.patch similarity index 70% rename from debian/patches/features/all/rt/0058-printk-kill.patch.patch rename to debian/patches/features/all/rt/printk-kill.patch index 89cce7360..c8f21fa33 100644 --- a/debian/patches/features/all/rt/0058-printk-kill.patch.patch +++ b/debian/patches/features/all/rt/printk-kill.patch @@ -1,7 +1,6 @@ -From 88a4cc8d3aa5b6010db77faa48003759d22d64d8 Mon Sep 17 00:00:00 2001 +Subject: printk-kill.patch From: Ingo Molnar Date: Fri, 22 Jul 2011 17:58:40 +0200 -Subject: [058/256] printk-kill.patch Signed-off-by: Thomas Gleixner --- @@ -10,14 +9,14 @@ Signed-off-by: Thomas Gleixner kernel/watchdog.c | 15 +++++++++++++-- 3 files changed, 48 insertions(+), 3 deletions(-) -diff --git a/include/linux/printk.h b/include/linux/printk.h -index c8d7f7b..d5e6eed 100644 ---- a/include/linux/printk.h -+++ b/include/linux/printk.h -@@ -91,9 +91,11 @@ int no_printk(const char *fmt, ...) - #ifdef CONFIG_EARLY_PRINTK +Index: linux-stable/include/linux/printk.h +=================================================================== +--- linux-stable.orig/include/linux/printk.h ++++ linux-stable/include/linux/printk.h +@@ -99,9 +99,11 @@ int no_printk(const char *fmt, ...) extern asmlinkage __printf(1, 2) void early_printk(const char *fmt, ...); + void early_vprintk(const char *fmt, va_list ap); +extern void printk_kill(void); #else static inline __printf(1, 2) __cold @@ -26,7 +25,7 @@ index c8d7f7b..d5e6eed 100644 #endif extern int printk_needs_cpu(int cpu); -@@ -119,7 +121,6 @@ extern int __printk_ratelimit(const char *func); +@@ -138,7 +140,6 @@ extern int __printk_ratelimit(const char #define printk_ratelimit() __printk_ratelimit(__func__) extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, unsigned int interval_msec); @@ -34,11 +33,11 @@ index c8d7f7b..d5e6eed 100644 extern int printk_delay_msec; extern int dmesg_restrict; extern int kptr_restrict; -diff --git a/kernel/printk.c b/kernel/printk.c -index c442606..5a172f9 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -538,6 +538,32 @@ asmlinkage void early_printk(const char *fmt, ...) +Index: linux-stable/kernel/printk.c +=================================================================== +--- linux-stable.orig/kernel/printk.c ++++ linux-stable/kernel/printk.c +@@ -1246,6 +1246,32 @@ asmlinkage void early_printk(const char early_vprintk(fmt, ap); va_end(ap); } @@ -71,9 +70,9 @@ index c442606..5a172f9 100644 #endif static bool __read_mostly ignore_loglevel; -@@ -862,6 +888,13 @@ asmlinkage int vprintk(const char *fmt, va_list args) - size_t plen; - char special; +@@ -1508,6 +1534,13 @@ asmlinkage int vprintk_emit(int facility + int this_cpu; + int printed_len = 0; + /* + * Fall back to early_printk if a debugging subsystem has @@ -85,11 +84,11 @@ index c442606..5a172f9 100644 boot_delay_msec(); printk_delay(); -diff --git a/kernel/watchdog.c b/kernel/watchdog.c -index df30ee0..de08263 100644 ---- a/kernel/watchdog.c -+++ b/kernel/watchdog.c -@@ -201,6 +201,8 @@ static int is_softlockup(unsigned long touch_ts) +Index: linux-stable/kernel/watchdog.c +=================================================================== +--- linux-stable.orig/kernel/watchdog.c ++++ linux-stable/kernel/watchdog.c +@@ -202,6 +202,8 @@ static int is_softlockup(unsigned long t #ifdef CONFIG_HARDLOCKUP_DETECTOR @@ -98,7 +97,7 @@ index df30ee0..de08263 100644 static struct perf_event_attr wd_hw_attr = { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES, -@@ -235,10 +237,19 @@ static void watchdog_overflow_callback(struct perf_event *event, +@@ -236,10 +238,19 @@ static void watchdog_overflow_callback(s if (__this_cpu_read(hard_watchdog_warn) == true) return; diff --git a/debian/patches/features/all/rt/printk-rt-aware.patch b/debian/patches/features/all/rt/printk-rt-aware.patch new file mode 100644 index 000000000..2529fcd4b --- /dev/null +++ b/debian/patches/features/all/rt/printk-rt-aware.patch @@ -0,0 +1,103 @@ +Subject: printk-rt-aware.patch +From: Thomas Gleixner +Date: Wed, 19 Sep 2012 14:50:37 +0200 + +Signed-off-by: Thomas Gleixner +--- + kernel/printk.c | 33 +++++++++++++++++++++++++++++---- + 1 file changed, 29 insertions(+), 4 deletions(-) + +Index: linux-stable/kernel/printk.c +=================================================================== +--- linux-stable.orig/kernel/printk.c ++++ linux-stable/kernel/printk.c +@@ -1312,6 +1312,7 @@ static void call_console_drivers(int lev + if (!console_drivers) + return; + ++ migrate_disable(); + for_each_console(con) { + if (exclusive_console && con != exclusive_console) + continue; +@@ -1324,6 +1325,7 @@ static void call_console_drivers(int lev + continue; + con->write(con, text, len); + } ++ migrate_enable(); + } + + /* +@@ -1383,12 +1385,18 @@ static inline int can_use_console(unsign + * interrupts disabled. It should return with 'lockbuf_lock' + * released but interrupts still disabled. + */ +-static int console_trylock_for_printk(unsigned int cpu) ++static int console_trylock_for_printk(unsigned int cpu, unsigned long flags) + __releases(&logbuf_lock) + { + int retval = 0, wake = 0; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) && ++ (preempt_count() <= 1); ++#else ++ int lock = 1; ++#endif + +- if (console_trylock()) { ++ if (lock && console_trylock()) { + retval = 1; + + /* +@@ -1667,8 +1675,15 @@ asmlinkage int vprintk_emit(int facility + * The console_trylock_for_printk() function will release 'logbuf_lock' + * regardless of whether it actually gets the console semaphore or not. + */ +- if (console_trylock_for_printk(this_cpu)) ++ if (console_trylock_for_printk(this_cpu, flags)) { ++#ifndef CONFIG_PREEMPT_RT_FULL ++ console_unlock(); ++#else ++ raw_local_irq_restore(flags); + console_unlock(); ++ raw_local_irq_save(flags); ++#endif ++ } + + lockdep_on(); + out_restore_irqs: +@@ -2057,11 +2072,16 @@ static void console_cont_flush(char *tex + goto out; + + len = cont_print_text(text, size); ++#ifndef CONFIG_PREEMPT_RT_FULL + raw_spin_unlock(&logbuf_lock); + stop_critical_timings(); + call_console_drivers(cont.level, text, len); + start_critical_timings(); + local_irq_restore(flags); ++#else ++ raw_spin_unlock_irqrestore(&logbuf_lock, flags); ++ call_console_drivers(cont.level, text, len); ++#endif + return; + out: + raw_spin_unlock_irqrestore(&logbuf_lock, flags); +@@ -2144,12 +2164,17 @@ skip: + console_idx = log_next(console_idx); + console_seq++; + console_prev = msg->flags; +- raw_spin_unlock(&logbuf_lock); + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ raw_spin_unlock(&logbuf_lock); + stop_critical_timings(); /* don't trace print latency */ + call_console_drivers(level, text, len); + start_critical_timings(); + local_irq_restore(flags); ++#else ++ raw_spin_unlock_irqrestore(&logbuf_lock, flags); ++ call_console_drivers(level, text, len); ++#endif + } + console_locked = 0; + diff --git a/debian/patches/features/all/rt/0101-radix-tree-rt-aware.patch.patch b/debian/patches/features/all/rt/radix-tree-rt-aware.patch similarity index 67% rename from debian/patches/features/all/rt/0101-radix-tree-rt-aware.patch.patch rename to debian/patches/features/all/rt/radix-tree-rt-aware.patch index 62fb8c185..102f0b63f 100644 --- a/debian/patches/features/all/rt/0101-radix-tree-rt-aware.patch.patch +++ b/debian/patches/features/all/rt/radix-tree-rt-aware.patch @@ -1,7 +1,6 @@ -From bd3ec47b69cea1ae02ae7d50ac1090eabc6c2edb Mon Sep 17 00:00:00 2001 +Subject: radix-tree-rt-aware.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:33:18 +0200 -Subject: [101/256] radix-tree-rt-aware.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner lib/radix-tree.c | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) -diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h -index ffc444c..7ddfbf9 100644 ---- a/include/linux/radix-tree.h -+++ b/include/linux/radix-tree.h -@@ -230,7 +230,13 @@ unsigned long radix_tree_next_hole(struct radix_tree_root *root, +Index: linux-stable/include/linux/radix-tree.h +=================================================================== +--- linux-stable.orig/include/linux/radix-tree.h ++++ linux-stable/include/linux/radix-tree.h +@@ -230,7 +230,13 @@ unsigned long radix_tree_next_hole(struc unsigned long index, unsigned long max_scan); unsigned long radix_tree_prev_hole(struct radix_tree_root *root, unsigned long index, unsigned long max_scan); @@ -27,7 +26,7 @@ index ffc444c..7ddfbf9 100644 void radix_tree_init(void); void *radix_tree_tag_set(struct radix_tree_root *root, unsigned long index, unsigned int tag); -@@ -255,7 +261,7 @@ unsigned long radix_tree_locate_item(struct radix_tree_root *root, void *item); +@@ -255,7 +261,7 @@ unsigned long radix_tree_locate_item(str static inline void radix_tree_preload_end(void) { @@ -36,11 +35,11 @@ index ffc444c..7ddfbf9 100644 } /** -diff --git a/lib/radix-tree.c b/lib/radix-tree.c -index 3ac50dc..52ebdb1 100644 ---- a/lib/radix-tree.c -+++ b/lib/radix-tree.c -@@ -202,12 +202,13 @@ radix_tree_node_alloc(struct radix_tree_root *root) +Index: linux-stable/lib/radix-tree.c +=================================================================== +--- linux-stable.orig/lib/radix-tree.c ++++ linux-stable/lib/radix-tree.c +@@ -215,12 +215,13 @@ radix_tree_node_alloc(struct radix_tree_ * succeed in getting a node here (and never reach * kmem_cache_alloc) */ @@ -55,7 +54,7 @@ index 3ac50dc..52ebdb1 100644 } if (ret == NULL) ret = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask); -@@ -242,6 +243,7 @@ radix_tree_node_free(struct radix_tree_node *node) +@@ -255,6 +256,7 @@ radix_tree_node_free(struct radix_tree_n call_rcu(&node->rcu_head, radix_tree_node_rcu_free); } @@ -63,7 +62,7 @@ index 3ac50dc..52ebdb1 100644 /* * Load up this CPU's radix_tree_node buffer with sufficient objects to * ensure that the addition of a single element in the tree cannot fail. On -@@ -276,6 +278,7 @@ out: +@@ -289,6 +291,7 @@ out: return ret; } EXPORT_SYMBOL(radix_tree_preload); diff --git a/debian/patches/features/all/rt/random-make-it-work-on-rt.patch b/debian/patches/features/all/rt/random-make-it-work-on-rt.patch new file mode 100644 index 000000000..edade40b8 --- /dev/null +++ b/debian/patches/features/all/rt/random-make-it-work-on-rt.patch @@ -0,0 +1,124 @@ +Subject: random: Make it work on rt +From: Thomas Gleixner +Date: Tue, 21 Aug 2012 20:38:50 +0200 + +Delegate the random insertion to the forced threaded interrupt +handler. Store the return IP of the hard interrupt handler in the irq +descriptor and feed it into the random generator as a source of +entropy. + +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +--- + drivers/char/random.c | 10 ++++++---- + include/linux/irqdesc.h | 1 + + include/linux/random.h | 2 +- + kernel/irq/handle.c | 8 +++++++- + kernel/irq/manage.c | 6 ++++++ + 5 files changed, 21 insertions(+), 6 deletions(-) + +Index: linux-stable/drivers/char/random.c +=================================================================== +--- linux-stable.orig/drivers/char/random.c ++++ linux-stable/drivers/char/random.c +@@ -745,18 +745,16 @@ EXPORT_SYMBOL_GPL(add_input_randomness); + + static DEFINE_PER_CPU(struct fast_pool, irq_randomness); + +-void add_interrupt_randomness(int irq, int irq_flags) ++void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) + { + struct entropy_store *r; + struct fast_pool *fast_pool = &__get_cpu_var(irq_randomness); +- struct pt_regs *regs = get_irq_regs(); + unsigned long now = jiffies; + __u32 input[4], cycles = get_cycles(); + + input[0] = cycles ^ jiffies; + input[1] = irq; +- if (regs) { +- __u64 ip = instruction_pointer(regs); ++ if (ip) { + input[2] = ip; + input[3] = ip >> 32; + } +@@ -770,7 +768,11 @@ void add_interrupt_randomness(int irq, i + fast_pool->last = now; + + r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; ++#ifndef CONFIG_PREEMPT_RT_FULL + __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool), NULL); ++#else ++ mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool), NULL); ++#endif + /* + * If we don't have a valid cycle counter, and we see + * back-to-back timer interrupts, then skip giving credit for +Index: linux-stable/include/linux/irqdesc.h +=================================================================== +--- linux-stable.orig/include/linux/irqdesc.h ++++ linux-stable/include/linux/irqdesc.h +@@ -52,6 +52,7 @@ struct irq_desc { + unsigned int irq_count; /* For detecting broken IRQs */ + unsigned long last_unhandled; /* Aging timer for unhandled count */ + unsigned int irqs_unhandled; ++ u64 random_ip; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + #ifdef CONFIG_SMP +Index: linux-stable/include/linux/random.h +=================================================================== +--- linux-stable.orig/include/linux/random.h ++++ linux-stable/include/linux/random.h +@@ -51,7 +51,7 @@ struct rnd_state { + extern void add_device_randomness(const void *, unsigned int); + extern void add_input_randomness(unsigned int type, unsigned int code, + unsigned int value); +-extern void add_interrupt_randomness(int irq, int irq_flags); ++extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip); + + extern void get_random_bytes(void *buf, int nbytes); + extern void get_random_bytes_arch(void *buf, int nbytes); +Index: linux-stable/kernel/irq/handle.c +=================================================================== +--- linux-stable.orig/kernel/irq/handle.c ++++ linux-stable/kernel/irq/handle.c +@@ -132,6 +132,8 @@ static void irq_wake_thread(struct irq_d + irqreturn_t + handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action) + { ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + irqreturn_t retval = IRQ_NONE; + unsigned int flags = 0, irq = desc->irq_data.irq; + +@@ -172,7 +174,11 @@ handle_irq_event_percpu(struct irq_desc + action = action->next; + } while (action); + +- add_interrupt_randomness(irq, flags); ++#ifndef CONFIG_PREEMPT_RT_FULL ++ add_interrupt_randomness(irq, flags, ip); ++#else ++ desc->random_ip = ip; ++#endif + + if (!noirqdebug) + note_interrupt(irq, desc, retval); +Index: linux-stable/kernel/irq/manage.c +=================================================================== +--- linux-stable.orig/kernel/irq/manage.c ++++ linux-stable/kernel/irq/manage.c +@@ -852,6 +852,12 @@ static int irq_thread(void *data) + if (!noirqdebug) + note_interrupt(action->irq, desc, action_ret); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ migrate_disable(); ++ add_interrupt_randomness(action->irq, 0, ++ desc->random_ip ^ (u64) action); ++ migrate_enable(); ++#endif + wake_threads_waitq(desc); + } + diff --git a/debian/patches/features/all/rt/0189-rcu-Fix-build-break.patch b/debian/patches/features/all/rt/rcu-fix-build-break.patch similarity index 64% rename from debian/patches/features/all/rt/0189-rcu-Fix-build-break.patch rename to debian/patches/features/all/rt/rcu-fix-build-break.patch index 662643d97..ecb6d96c9 100644 --- a/debian/patches/features/all/rt/0189-rcu-Fix-build-break.patch +++ b/debian/patches/features/all/rt/rcu-fix-build-break.patch @@ -1,10 +1,6 @@ -From 1516657b9f046ff3d8091a556863bda9c891e314 Mon Sep 17 00:00:00 2001 +Subject: rcu: Fix build break From: John Kacur Date: Fri, 13 Apr 2012 12:54:21 +0200 -Subject: [189/256] rcu: Fix build break -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit A build break can occur with the following config options enabled @@ -32,12 +28,12 @@ Signed-off-by: Thomas Gleixner kernel/rcutree_plugin.h | 5 +++++ 1 file changed, 5 insertions(+) -diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h -index 14acafc..2844d7d 100644 ---- a/kernel/rcutree_plugin.h -+++ b/kernel/rcutree_plugin.h -@@ -1914,6 +1914,9 @@ int rcu_needs_cpu(int cpu) - { +Index: linux-stable/kernel/rcutree_plugin.h +=================================================================== +--- linux-stable.orig/kernel/rcutree_plugin.h ++++ linux-stable/kernel/rcutree_plugin.h +@@ -1743,6 +1743,9 @@ int rcu_needs_cpu(int cpu, unsigned long + *delta_jiffies = ULONG_MAX; return rcu_cpu_has_callbacks(cpu); } +#endif /* !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) */ @@ -46,19 +42,19 @@ index 14acafc..2844d7d 100644 /* * Because we do not have RCU_FAST_NO_HZ, don't bother initializing for it. -@@ -1984,6 +1987,7 @@ static DEFINE_PER_CPU(struct hrtimer, rcu_idle_gp_timer); - static ktime_t rcu_idle_gp_wait; /* If some non-lazy callbacks. */ - static ktime_t rcu_idle_lazy_gp_wait; /* If only lazy callbacks. */ +@@ -1859,6 +1862,7 @@ static bool rcu_cpu_has_nonlazy_callback + rcu_preempt_cpu_has_nonlazy_callbacks(cpu); + } +#ifndef CONFIG_PREEMPT_RT_FULL /* * Allow the CPU to enter dyntick-idle mode if either: (1) There are no * callbacks on this CPU, (2) this CPU has not yet attempted to enter -@@ -2001,6 +2005,7 @@ int rcu_needs_cpu(int cpu) - /* Otherwise, RCU needs the CPU only if it recently tried and failed. */ - return per_cpu(rcu_dyntick_holdoff, cpu) == jiffies; +@@ -1902,6 +1906,7 @@ int rcu_needs_cpu(int cpu, unsigned long + } + return 0; } +#endif /* #ifndef CONFIG_PREEMPT_RT_FULL */ /* - * Does the specified flavor of RCU have non-lazy callbacks pending on + * Handler for smp_call_function_single(). The only point of this diff --git a/debian/patches/features/all/rt/0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch b/debian/patches/features/all/rt/rcu-force-preempt-rcu-for-rt.patch similarity index 70% rename from debian/patches/features/all/rt/0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch rename to debian/patches/features/all/rt/rcu-force-preempt-rcu-for-rt.patch index e843d37a0..5de6462d2 100644 --- a/debian/patches/features/all/rt/0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch +++ b/debian/patches/features/all/rt/rcu-force-preempt-rcu-for-rt.patch @@ -1,7 +1,6 @@ -From 9640a57ed1d6ef1f9b41b08d68aba97add9dca95 Mon Sep 17 00:00:00 2001 +Subject: RCU: Force PREEMPT_RCU for PREEMPT-RT From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:30 -0500 -Subject: [183/256] RCU: Force PREEMPT_RCU for PREEMPT-RT PREEMPT_RT relies on PREEMPT_RCU - only allow RCU to be configured interactively in the !PREEMPT_RT case. @@ -15,11 +14,11 @@ Link: http://lkml.kernel.org/n/tip-j1y0phicu6s6pu8guku2vca0@git.kernel.org init/Kconfig | 1 - 1 file changed, 1 deletion(-) -diff --git a/init/Kconfig b/init/Kconfig -index c06208b..7c0b369 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -746,7 +746,6 @@ config RT_GROUP_SCHED +Index: linux-stable/init/Kconfig +=================================================================== +--- linux-stable.orig/init/Kconfig ++++ linux-stable/init/Kconfig +@@ -806,7 +806,6 @@ config RT_GROUP_SCHED bool "Group scheduling for SCHED_RR/FIFO" depends on EXPERIMENTAL depends on CGROUP_SCHED diff --git a/debian/patches/features/all/rt/0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch b/debian/patches/features/all/rt/rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch similarity index 71% rename from debian/patches/features/all/rt/0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch rename to debian/patches/features/all/rt/rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch index b4ea5b2e4..a0eea9424 100644 --- a/debian/patches/features/all/rt/0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch +++ b/debian/patches/features/all/rt/rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch @@ -1,7 +1,6 @@ -From f786c807198155ff8dad9591045035a53aeed4c0 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner +Subject: rcu: Merge RCU-bh into RCU-preempt Date: Wed, 5 Oct 2011 11:59:38 -0700 -Subject: [185/256] rcu: Merge RCU-bh into RCU-preempt +From: Thomas Gleixner The Linux kernel has long RCU-bh read-side critical sections that intolerably increase scheduling latency under mainline's RCU-bh rules, @@ -23,6 +22,7 @@ Signed-off-by: Thomas Gleixner Signed-off-by: Paul E. McKenney Link: http://lkml.kernel.org/r/20111005185938.GA20403@linux.vnet.ibm.com Signed-off-by: Thomas Gleixner + --- include/linux/rcupdate.h | 25 +++++++++++++++++++++++++ include/linux/rcutree.h | 18 ++++++++++++++++-- @@ -30,11 +30,11 @@ Signed-off-by: Thomas Gleixner kernel/rcutree.c | 10 ++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index 23a500f..888d24a 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -101,6 +101,9 @@ extern void call_rcu(struct rcu_head *head, +Index: linux-stable/include/linux/rcupdate.h +=================================================================== +--- linux-stable.orig/include/linux/rcupdate.h ++++ linux-stable/include/linux/rcupdate.h +@@ -101,6 +101,9 @@ extern void call_rcu(struct rcu_head *he #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ @@ -44,7 +44,7 @@ index 23a500f..888d24a 100644 /** * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. * @head: structure to be used for queueing the RCU updates. -@@ -121,6 +124,7 @@ extern void call_rcu(struct rcu_head *head, +@@ -121,6 +124,7 @@ extern void call_rcu(struct rcu_head *he */ extern void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *head)); @@ -52,7 +52,7 @@ index 23a500f..888d24a 100644 /** * call_rcu_sched() - Queue an RCU for invocation after sched grace period. -@@ -190,7 +194,13 @@ static inline int rcu_preempt_depth(void) +@@ -191,7 +195,13 @@ static inline int rcu_preempt_depth(void /* Internal to kernel */ extern void rcu_sched_qs(int cpu); @@ -66,7 +66,7 @@ index 23a500f..888d24a 100644 extern void rcu_check_callbacks(int cpu, int user); struct notifier_block; extern void rcu_idle_enter(void); -@@ -331,7 +341,14 @@ static inline int rcu_read_lock_held(void) +@@ -328,7 +338,14 @@ static inline int rcu_read_lock_held(voi * rcu_read_lock_bh_held() is defined out of line to avoid #include-file * hell. */ @@ -81,7 +81,7 @@ index 23a500f..888d24a 100644 /** * rcu_read_lock_sched_held() - might we be in RCU-sched read-side critical section? -@@ -780,10 +797,14 @@ static inline void rcu_read_unlock(void) +@@ -776,10 +793,14 @@ static inline void rcu_read_unlock(void) static inline void rcu_read_lock_bh(void) { local_bh_disable(); @@ -96,7 +96,7 @@ index 23a500f..888d24a 100644 } /* -@@ -793,10 +814,14 @@ static inline void rcu_read_lock_bh(void) +@@ -789,10 +810,14 @@ static inline void rcu_read_lock_bh(void */ static inline void rcu_read_unlock_bh(void) { @@ -111,23 +111,23 @@ index 23a500f..888d24a 100644 local_bh_enable(); } -diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h -index e8ee5dd..5b2d03e 100644 ---- a/include/linux/rcutree.h -+++ b/include/linux/rcutree.h -@@ -57,7 +57,11 @@ static inline void exit_rcu(void) +Index: linux-stable/include/linux/rcutree.h +=================================================================== +--- linux-stable.orig/include/linux/rcutree.h ++++ linux-stable/include/linux/rcutree.h +@@ -45,7 +45,11 @@ static inline void rcu_virt_note_context + rcu_note_context_switch(cpu); + } - #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ - -+#ifndef CONFIG_PREEMPT_RT_FULL - extern void synchronize_rcu_bh(void); ++#ifdef CONFIG_PREEMPT_RT_FULL ++# define synchronize_rcu_bh synchronize_rcu +#else -+# define synchronize_rcu_bh() synchronize_rcu() + extern void synchronize_rcu_bh(void); +#endif extern void synchronize_sched_expedited(void); extern void synchronize_rcu_expedited(void); -@@ -85,19 +89,29 @@ static inline void synchronize_rcu_bh_expedited(void) +@@ -73,20 +77,30 @@ static inline void synchronize_rcu_bh_ex } extern void rcu_barrier(void); @@ -148,6 +148,9 @@ index e8ee5dd..5b2d03e 100644 -extern void rcu_bh_force_quiescent_state(void); extern void rcu_sched_force_quiescent_state(void); + extern void rcu_scheduler_starting(void); + extern int rcu_scheduler_active __read_mostly; + +#ifndef CONFIG_PREEMPT_RT_FULL +extern void rcu_bh_force_quiescent_state(void); +extern long rcu_batches_completed_bh(void); @@ -156,14 +159,12 @@ index e8ee5dd..5b2d03e 100644 +# define rcu_batches_completed_bh rcu_batches_completed +#endif + - /* A context switch is a grace period for RCU-sched and RCU-bh. */ - static inline int rcu_blocking_is_gp(void) - { -diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c -index a86f174..63fc4b3 100644 ---- a/kernel/rcupdate.c -+++ b/kernel/rcupdate.c -@@ -77,6 +77,7 @@ int debug_lockdep_rcu_enabled(void) + #endif /* __LINUX_RCUTREE_H */ +Index: linux-stable/kernel/rcupdate.c +=================================================================== +--- linux-stable.orig/kernel/rcupdate.c ++++ linux-stable/kernel/rcupdate.c +@@ -149,6 +149,7 @@ int debug_lockdep_rcu_enabled(void) } EXPORT_SYMBOL_GPL(debug_lockdep_rcu_enabled); @@ -171,7 +172,7 @@ index a86f174..63fc4b3 100644 /** * rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section? * -@@ -103,6 +104,7 @@ int rcu_read_lock_bh_held(void) +@@ -175,6 +176,7 @@ int rcu_read_lock_bh_held(void) return in_softirq() || irqs_disabled(); } EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); @@ -179,11 +180,11 @@ index a86f174..63fc4b3 100644 #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ -diff --git a/kernel/rcutree.c b/kernel/rcutree.c -index d0c5baf..69e959e 100644 ---- a/kernel/rcutree.c -+++ b/kernel/rcutree.c -@@ -172,6 +172,7 @@ void rcu_sched_qs(int cpu) +Index: linux-stable/kernel/rcutree.c +=================================================================== +--- linux-stable.orig/kernel/rcutree.c ++++ linux-stable/kernel/rcutree.c +@@ -182,6 +182,7 @@ void rcu_sched_qs(int cpu) rdp->passed_quiesce = 1; } @@ -191,7 +192,7 @@ index d0c5baf..69e959e 100644 void rcu_bh_qs(int cpu) { struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu); -@@ -182,6 +183,7 @@ void rcu_bh_qs(int cpu) +@@ -192,6 +193,7 @@ void rcu_bh_qs(int cpu) trace_rcu_grace_period("rcu_bh", rdp->gpnum, "cpuqs"); rdp->passed_quiesce = 1; } @@ -199,7 +200,7 @@ index d0c5baf..69e959e 100644 /* * Note a context switch. This is a quiescent state for RCU-sched, -@@ -228,6 +230,7 @@ long rcu_batches_completed_sched(void) +@@ -238,6 +240,7 @@ long rcu_batches_completed_sched(void) } EXPORT_SYMBOL_GPL(rcu_batches_completed_sched); @@ -207,7 +208,7 @@ index d0c5baf..69e959e 100644 /* * Return the number of RCU BH batches processed thus far for debug & stats. */ -@@ -245,6 +248,7 @@ void rcu_bh_force_quiescent_state(void) +@@ -255,6 +258,7 @@ void rcu_bh_force_quiescent_state(void) force_quiescent_state(&rcu_bh_state, 0); } EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); @@ -215,7 +216,7 @@ index d0c5baf..69e959e 100644 /* * Record the number of times rcutorture tests have been initiated and -@@ -1884,6 +1888,7 @@ void call_rcu_sched(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) +@@ -1970,6 +1974,7 @@ void call_rcu_sched(struct rcu_head *hea } EXPORT_SYMBOL_GPL(call_rcu_sched); @@ -223,15 +224,15 @@ index d0c5baf..69e959e 100644 /* * Queue an RCU callback for invocation after a quicker grace period. */ -@@ -1892,6 +1897,7 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) +@@ -1978,6 +1983,7 @@ void call_rcu_bh(struct rcu_head *head, __call_rcu(head, func, &rcu_bh_state, 0); } EXPORT_SYMBOL_GPL(call_rcu_bh); +#endif - /** - * synchronize_sched - wait until an rcu-sched grace period has elapsed. -@@ -1928,6 +1934,7 @@ void synchronize_sched(void) + /* + * Because a context switch is a grace period for RCU-sched and RCU-bh, +@@ -2034,6 +2040,7 @@ void synchronize_sched(void) } EXPORT_SYMBOL_GPL(synchronize_sched); @@ -239,7 +240,7 @@ index d0c5baf..69e959e 100644 /** * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. * -@@ -1948,6 +1955,7 @@ void synchronize_rcu_bh(void) +@@ -2054,6 +2061,7 @@ void synchronize_rcu_bh(void) wait_rcu_gp(call_rcu_bh); } EXPORT_SYMBOL_GPL(synchronize_rcu_bh); @@ -247,16 +248,16 @@ index d0c5baf..69e959e 100644 static atomic_t sync_sched_expedited_started = ATOMIC_INIT(0); static atomic_t sync_sched_expedited_done = ATOMIC_INIT(0); -@@ -2223,6 +2231,7 @@ static void _rcu_barrier(struct rcu_state *rsp, - mutex_unlock(&rcu_barrier_mutex); +@@ -2460,6 +2468,7 @@ static void _rcu_barrier(struct rcu_stat + destroy_rcu_head_on_stack(&rd.barrier_head); } +#ifndef CONFIG_PREEMPT_RT_FULL /** * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. */ -@@ -2231,6 +2240,7 @@ void rcu_barrier_bh(void) - _rcu_barrier(&rcu_bh_state, call_rcu_bh); +@@ -2468,6 +2477,7 @@ void rcu_barrier_bh(void) + _rcu_barrier(&rcu_bh_state); } EXPORT_SYMBOL_GPL(rcu_barrier_bh); +#endif diff --git a/debian/patches/features/all/rt/0187-rcu-more-fallout.patch.patch b/debian/patches/features/all/rt/rcu-tiny-merge-bh.patch similarity index 51% rename from debian/patches/features/all/rt/0187-rcu-more-fallout.patch.patch rename to debian/patches/features/all/rt/rcu-tiny-merge-bh.patch index 831b77f6b..c697500bd 100644 --- a/debian/patches/features/all/rt/0187-rcu-more-fallout.patch.patch +++ b/debian/patches/features/all/rt/rcu-tiny-merge-bh.patch @@ -1,18 +1,17 @@ -From 9edeec52fd841c2807974b7db2b4ef958b4e7dba Mon Sep 17 00:00:00 2001 +Subject: rcu-more-fallout.patch From: Thomas Gleixner Date: Mon, 14 Nov 2011 10:57:54 +0100 -Subject: [187/256] rcu-more-fallout.patch Signed-off-by: Thomas Gleixner --- kernel/rcutiny.c | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c -index 37a5444..fc581fb 100644 ---- a/kernel/rcutiny.c -+++ b/kernel/rcutiny.c -@@ -368,6 +368,7 @@ void call_rcu_sched(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) +Index: linux-stable/kernel/rcutiny.c +=================================================================== +--- linux-stable.orig/kernel/rcutiny.c ++++ linux-stable/kernel/rcutiny.c +@@ -368,6 +368,7 @@ void call_rcu_sched(struct rcu_head *hea } EXPORT_SYMBOL_GPL(call_rcu_sched); @@ -20,7 +19,7 @@ index 37a5444..fc581fb 100644 /* * Post an RCU bottom-half callback to be invoked after any subsequent * quiescent state. -@@ -377,3 +378,4 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu)) +@@ -377,3 +378,4 @@ void call_rcu_bh(struct rcu_head *head, __call_rcu(head, func, &rcu_bh_ctrlblk); } EXPORT_SYMBOL_GPL(call_rcu_bh); diff --git a/debian/patches/features/all/rt/rcu-tiny-solve-rt-mistery.patch b/debian/patches/features/all/rt/rcu-tiny-solve-rt-mistery.patch new file mode 100644 index 000000000..c238058d3 --- /dev/null +++ b/debian/patches/features/all/rt/rcu-tiny-solve-rt-mistery.patch @@ -0,0 +1,44 @@ +Subject: rcu: rcutiny: Prevent RCU stall +From: Thomas Gleixner +Date: Tue, 16 Oct 2012 18:36:51 +0200 + +rcu_read_unlock_special() checks in_serving_softirq() and leaves early +when true. On RT this is obviously wrong as softirq processing context +can be preempted and therefor such a task can be on the gp_tasks +list. Leaving early here will leave the task on the list and therefor +block RCU processing forever. + +This cannot happen on mainline because softirq processing context +cannot be preempted and therefor this can never happen at all. + +In fact this check looks quite questionable in general. Neither irq +context nor softirq processing context in mainline can ever be +preempted in mainline so the special unlock case should not ever be +invoked in such context. Now the only explanation might be a +rcu_read_unlock() being interrupted and therefor leave the rcu nest +count at 0 before the special unlock bit has been cleared. That looks +fragile. At least it's missing a big fat comment. Paul ???? + +See mainline commits: ec433f0c5 and 8762705a for further enlightment. + +Reported-by: Kristian Lehmann +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org + +--- + kernel/rcutiny_plugin.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux-stable/kernel/rcutiny_plugin.h +=================================================================== +--- linux-stable.orig/kernel/rcutiny_plugin.h ++++ linux-stable/kernel/rcutiny_plugin.h +@@ -560,7 +560,7 @@ void rcu_read_unlock_special(struct task + rcu_preempt_cpu_qs(); + + /* Hardware IRQ handlers cannot block. */ +- if (in_irq() || in_serving_softirq()) { ++ if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) { + local_irq_restore(flags); + return; + } diff --git a/debian/patches/features/all/rt/0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch b/debian/patches/features/all/rt/re-migrate_disable-race-with-cpu-hotplug-3f.patch similarity index 73% rename from debian/patches/features/all/rt/0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch rename to debian/patches/features/all/rt/re-migrate_disable-race-with-cpu-hotplug-3f.patch index 523551a67..6851af928 100644 --- a/debian/patches/features/all/rt/0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch +++ b/debian/patches/features/all/rt/re-migrate_disable-race-with-cpu-hotplug-3f.patch @@ -1,7 +1,6 @@ -From 73d949d0e1f86dd881ae7dea5f2f27241e2e45ba Mon Sep 17 00:00:00 2001 From: Yong Zhang Date: Thu, 28 Jul 2011 11:16:00 +0800 -Subject: [140/256] hotplug: Reread hotplug_pcp on pin_current_cpu() retry +Subject: hotplug: Reread hotplug_pcp on pin_current_cpu() retry When retry happens, it's likely that the task has been migrated to another cpu (except unplug failed), but it still derefernces the @@ -18,11 +17,11 @@ Signed-off-by: Thomas Gleixner kernel/cpu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) -diff --git a/kernel/cpu.c b/kernel/cpu.c -index da4ed4f..1e80dff 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -76,9 +76,11 @@ static DEFINE_PER_CPU(struct hotplug_pcp, hotplug_pcp); +Index: linux-stable/kernel/cpu.c +=================================================================== +--- linux-stable.orig/kernel/cpu.c ++++ linux-stable/kernel/cpu.c +@@ -81,9 +81,11 @@ static DEFINE_PER_CPU(struct hotplug_pcp */ void pin_current_cpu(void) { diff --git a/debian/patches/features/all/rt/0099-ARM-Initialize-ptl-lock-for-vector-page.patch b/debian/patches/features/all/rt/re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch similarity index 84% rename from debian/patches/features/all/rt/0099-ARM-Initialize-ptl-lock-for-vector-page.patch rename to debian/patches/features/all/rt/re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch index 056e16c13..5b9d3118d 100644 --- a/debian/patches/features/all/rt/0099-ARM-Initialize-ptl-lock-for-vector-page.patch +++ b/debian/patches/features/all/rt/re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch @@ -1,7 +1,6 @@ -From 9e6883b3845df25a28bbbba0dac73967166197d0 Mon Sep 17 00:00:00 2001 +Subject: ARM: Initialize ptl->lock for vector page From: Frank Rowand Date: Sat, 1 Oct 2011 18:58:13 -0700 -Subject: [099/256] ARM: Initialize ptl->lock for vector page Without this patch, ARM can not use SPLIT_PTLOCK_CPUS if PREEMPT_RT_FULL=y because vectors_user_mapping() creates a @@ -34,11 +33,11 @@ Signed-off-by: Thomas Gleixner arch/arm/kernel/process.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) -diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c -index 2b7b017..ed2300e 100644 ---- a/arch/arm/kernel/process.c -+++ b/arch/arm/kernel/process.c -@@ -526,6 +526,31 @@ unsigned long arch_randomize_brk(struct mm_struct *mm) +Index: linux-stable/arch/arm/kernel/process.c +=================================================================== +--- linux-stable.orig/arch/arm/kernel/process.c ++++ linux-stable/arch/arm/kernel/process.c +@@ -508,6 +508,31 @@ unsigned long arch_randomize_brk(struct } #ifdef CONFIG_MMU diff --git a/debian/patches/features/all/rt/0105-relay-fix-timer-madness.patch b/debian/patches/features/all/rt/relay-fix-timer-madness.patch similarity index 72% rename from debian/patches/features/all/rt/0105-relay-fix-timer-madness.patch rename to debian/patches/features/all/rt/relay-fix-timer-madness.patch index 47114dd5b..8ce2eecae 100644 --- a/debian/patches/features/all/rt/0105-relay-fix-timer-madness.patch +++ b/debian/patches/features/all/rt/relay-fix-timer-madness.patch @@ -1,7 +1,6 @@ -From f1b9277c8523774819cd00dc1b0f2c401db94a88 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:44:07 -0500 -Subject: [105/256] relay: fix timer madness +Subject: relay: fix timer madness remove timer calls (!!!) from deep within the tracing infrastructure. This was totally bogus code that can cause lockups and worse. Poll @@ -9,15 +8,16 @@ the buffer every 2 jiffies for now. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- kernel/relay.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) -diff --git a/kernel/relay.c b/kernel/relay.c -index ab56a17..0fb9799 100644 ---- a/kernel/relay.c -+++ b/kernel/relay.c -@@ -340,6 +340,10 @@ static void wakeup_readers(unsigned long data) +Index: linux-stable/kernel/relay.c +=================================================================== +--- linux-stable.orig/kernel/relay.c ++++ linux-stable/kernel/relay.c +@@ -340,6 +340,10 @@ static void wakeup_readers(unsigned long { struct rchan_buf *buf = (struct rchan_buf *)data; wake_up_interruptible(&buf->read_wait); @@ -28,7 +28,7 @@ index ab56a17..0fb9799 100644 } /** -@@ -357,6 +361,7 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init) +@@ -357,6 +361,7 @@ static void __relay_reset(struct rchan_b init_waitqueue_head(&buf->read_wait); kref_init(&buf->kref); setup_timer(&buf->timer, wakeup_readers, (unsigned long)buf); @@ -36,7 +36,7 @@ index ab56a17..0fb9799 100644 } else del_timer_sync(&buf->timer); -@@ -739,15 +744,6 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length) +@@ -739,15 +744,6 @@ size_t relay_switch_subbuf(struct rchan_ else buf->early_bytes += buf->chan->subbuf_size - buf->padding[old_subbuf]; diff --git a/debian/patches/features/all/rt/0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch b/debian/patches/features/all/rt/resource-counters-use-localirq-nort.patch similarity index 81% rename from debian/patches/features/all/rt/0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch rename to debian/patches/features/all/rt/resource-counters-use-localirq-nort.patch index dfd6c803c..bcb79ced9 100644 --- a/debian/patches/features/all/rt/0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch +++ b/debian/patches/features/all/rt/resource-counters-use-localirq-nort.patch @@ -1,7 +1,6 @@ -From deb750df13d81367349e2878a3a2d445f1b7bb01 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:44:33 -0500 -Subject: [070/256] core: Do not disable interrupts on RT in res_counter.c +Subject: core: Do not disable interrupts on RT in res_counter.c Frederic Weisbecker reported this warning: @@ -42,39 +41,40 @@ So replace it with _nort(). This code needs a second look. Reported-by: Frederic Weisbecker Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- kernel/res_counter.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/kernel/res_counter.c b/kernel/res_counter.c -index d508363..402f91a 100644 ---- a/kernel/res_counter.c -+++ b/kernel/res_counter.c -@@ -43,7 +43,7 @@ int res_counter_charge(struct res_counter *counter, unsigned long val, - struct res_counter *c, *u; +Index: linux-stable/kernel/res_counter.c +=================================================================== +--- linux-stable.orig/kernel/res_counter.c ++++ linux-stable/kernel/res_counter.c +@@ -49,7 +49,7 @@ static int __res_counter_charge(struct r + r = ret = 0; *limit_fail_at = NULL; - local_irq_save(flags); + local_irq_save_nort(flags); for (c = counter; c != NULL; c = c->parent) { spin_lock(&c->lock); - ret = res_counter_charge_locked(c, val); -@@ -62,7 +62,7 @@ undo: - spin_unlock(&u->lock); + r = res_counter_charge_locked(c, val, force); +@@ -69,7 +69,7 @@ static int __res_counter_charge(struct r + spin_unlock(&u->lock); + } } - done: - local_irq_restore(flags); + local_irq_restore_nort(flags); + return ret; } - -@@ -104,13 +104,13 @@ void res_counter_uncharge(struct res_counter *counter, unsigned long val) +@@ -101,13 +101,13 @@ void res_counter_uncharge_until(struct r unsigned long flags; struct res_counter *c; - local_irq_save(flags); + local_irq_save_nort(flags); - for (c = counter; c != NULL; c = c->parent) { + for (c = counter; c != top; c = c->parent) { spin_lock(&c->lock); res_counter_uncharge_locked(c, val); spin_unlock(&c->lock); @@ -83,4 +83,4 @@ index d508363..402f91a 100644 + local_irq_restore_nort(flags); } - + void res_counter_uncharge(struct res_counter *counter, unsigned long val) diff --git a/debian/patches/features/all/rt/0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch b/debian/patches/features/all/rt/rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch similarity index 83% rename from debian/patches/features/all/rt/0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch rename to debian/patches/features/all/rt/rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch index 8c642c926..973b05537 100644 --- a/debian/patches/features/all/rt/0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch +++ b/debian/patches/features/all/rt/rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch @@ -1,7 +1,6 @@ -From f246e95b5dd41a2ff8fc54d50a83e40cb5c9e9b5 Mon Sep 17 00:00:00 2001 +Subject: printk: Don't call printk_tick in printk_needs_cpu() on RT From: Yong Zhang Date: Sun, 16 Oct 2011 18:56:45 +0800 -Subject: [114/256] printk: Don't call printk_tick in printk_needs_cpu() on RT printk_tick() can't be called in atomic context when RT is enabled, otherwise below warning will show: @@ -31,11 +30,11 @@ Signed-off-by: Thomas Gleixner kernel/printk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/kernel/printk.c b/kernel/printk.c -index 300952e..9a27a94 100644 ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -1298,8 +1298,8 @@ void printk_tick(void) +Index: linux-stable/kernel/printk.c +=================================================================== +--- linux-stable.orig/kernel/printk.c ++++ linux-stable/kernel/printk.c +@@ -2027,8 +2027,8 @@ void printk_tick(void) int printk_needs_cpu(int cpu) { diff --git a/debian/patches/features/all/rt/0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch b/debian/patches/features/all/rt/rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch similarity index 73% rename from debian/patches/features/all/rt/0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch rename to debian/patches/features/all/rt/rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch index c608ae7a3..f93d9a25d 100644 --- a/debian/patches/features/all/rt/0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch +++ b/debian/patches/features/all/rt/rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch @@ -1,8 +1,6 @@ -From 61b20fa24de8e05b9156f00953b223ad15076808 Mon Sep 17 00:00:00 2001 +Subject: sched/rt: Fix wait_task_interactive() to test rt_spin_lock state From: Steven Rostedt -Date: Thu, 1 Mar 2012 13:55:33 -0500 -Subject: [238/256] sched/rt: Fix wait_task_interactive() to test rt_spin_lock - state +Date: Thu, 01 Mar 2012 13:55:33 -0500 The wait_task_interactive() will have a task sleep waiting for another task to have a certain state. But it ignores the rt_spin_locks state @@ -24,11 +22,11 @@ Signed-off-by: Thomas Gleixner kernel/sched/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 599cc25..e8d5a10 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1174,7 +1174,8 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -1172,7 +1172,8 @@ unsigned long wait_task_inactive(struct * is actually now running somewhere else! */ while (task_running(rq, p)) { @@ -38,7 +36,7 @@ index 599cc25..e8d5a10 100644 return 0; cpu_relax(); } -@@ -1189,7 +1190,8 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) +@@ -1187,7 +1188,8 @@ unsigned long wait_task_inactive(struct running = task_running(rq, p); on_rq = p->on_rq; ncsw = 0; diff --git a/debian/patches/features/all/rt/0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch b/debian/patches/features/all/rt/rt-add-rt-locks.patch similarity index 88% rename from debian/patches/features/all/rt/0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch rename to debian/patches/features/all/rt/rt-add-rt-locks.patch index dcbc2fe74..fdbc41280 100644 --- a/debian/patches/features/all/rt/0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch +++ b/debian/patches/features/all/rt/rt-add-rt-locks.patch @@ -1,31 +1,27 @@ -From 275349693ff49e04119066402e460cd59060ab93 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 26 Jul 2009 19:39:56 +0200 -Subject: [180/256] rt: Add the preempt-rt lock replacement APIs +Subject: rt: Add the preempt-rt lock replacement APIs Map spinlocks, rwlocks, rw_semaphores and semaphores to the rt_mutex based locking functions for preempt-rt. Signed-off-by: Thomas Gleixner ---- - include/linux/rwlock_rt.h | 123 +++++++++++ - include/linux/spinlock.h | 12 +- - include/linux/spinlock_api_smp.h | 4 +- - include/linux/spinlock_rt.h | 156 ++++++++++++++ - kernel/Makefile | 9 +- - kernel/rt.c | 442 ++++++++++++++++++++++++++++++++++++++ - kernel/spinlock.c | 7 + - lib/spinlock_debug.c | 5 + - 8 files changed, 754 insertions(+), 4 deletions(-) - create mode 100644 include/linux/rwlock_rt.h - create mode 100644 include/linux/spinlock_rt.h - create mode 100644 kernel/rt.c -diff --git a/include/linux/rwlock_rt.h b/include/linux/rwlock_rt.h -new file mode 100644 -index 0000000..853ee36 +--- + include/linux/rwlock_rt.h | 123 ++++++++++ + include/linux/spinlock.h | 12 - + include/linux/spinlock_api_smp.h | 4 + include/linux/spinlock_rt.h | 158 +++++++++++++ + kernel/Makefile | 9 + kernel/rt.c | 442 +++++++++++++++++++++++++++++++++++++++ + kernel/spinlock.c | 7 + lib/spinlock_debug.c | 5 + 8 files changed, 756 insertions(+), 4 deletions(-) + +Index: linux-stable/include/linux/rwlock_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/rwlock_rt.h ++++ linux-stable/include/linux/rwlock_rt.h @@ -0,0 +1,123 @@ +#ifndef __LINUX_RWLOCK_RT_H +#define __LINUX_RWLOCK_RT_H @@ -150,11 +146,11 @@ index 0000000..853ee36 + } while (0) + +#endif -diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h -index 7d537ce..0c11a7c 100644 ---- a/include/linux/spinlock.h -+++ b/include/linux/spinlock.h -@@ -254,7 +254,11 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) +Index: linux-stable/include/linux/spinlock.h +=================================================================== +--- linux-stable.orig/include/linux/spinlock.h ++++ linux-stable/include/linux/spinlock.h +@@ -254,7 +254,11 @@ static inline void do_raw_spin_unlock(ra #define raw_spin_can_lock(lock) (!raw_spin_is_locked(lock)) /* Include rwlock functions */ @@ -167,7 +163,7 @@ index 7d537ce..0c11a7c 100644 /* * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: -@@ -265,6 +269,10 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) +@@ -265,6 +269,10 @@ static inline void do_raw_spin_unlock(ra # include #endif @@ -178,18 +174,18 @@ index 7d537ce..0c11a7c 100644 /* * Map the spin_lock functions to the raw variants for PREEMPT_RT=n */ -@@ -394,4 +402,6 @@ extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock); +@@ -394,4 +402,6 @@ extern int _atomic_dec_and_lock(atomic_t #define atomic_dec_and_lock(atomic, lock) \ __cond_lock(lock, _atomic_dec_and_lock(atomic, lock)) +#endif /* !PREEMPT_RT_FULL */ + #endif /* __LINUX_SPINLOCK_H */ -diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h -index 51df117..3f68f50 100644 ---- a/include/linux/spinlock_api_smp.h -+++ b/include/linux/spinlock_api_smp.h -@@ -191,6 +191,8 @@ static inline int __raw_spin_trylock_bh(raw_spinlock_t *lock) +Index: linux-stable/include/linux/spinlock_api_smp.h +=================================================================== +--- linux-stable.orig/include/linux/spinlock_api_smp.h ++++ linux-stable/include/linux/spinlock_api_smp.h +@@ -191,6 +191,8 @@ static inline int __raw_spin_trylock_bh( return 0; } @@ -199,12 +195,11 @@ index 51df117..3f68f50 100644 +#endif #endif /* __LINUX_SPINLOCK_API_SMP_H */ -diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h -new file mode 100644 -index 0000000..205ca95 +Index: linux-stable/include/linux/spinlock_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/spinlock_rt.h -@@ -0,0 +1,156 @@ ++++ linux-stable/include/linux/spinlock_rt.h +@@ -0,0 +1,158 @@ +#ifndef __LINUX_SPINLOCK_RT_H +#define __LINUX_SPINLOCK_RT_H + @@ -212,6 +207,8 @@ index 0000000..205ca95 +#error Do not include directly. Use spinlock.h +#endif + ++#include ++ +extern void +__rt_spin_lock_init(spinlock_t *lock, char *name, struct lock_class_key *key); + @@ -361,22 +358,22 @@ index 0000000..205ca95 + atomic_dec_and_spin_lock(atomic, lock) + +#endif -diff --git a/kernel/Makefile b/kernel/Makefile -index cb41b95..f4bf68a 100644 ---- a/kernel/Makefile -+++ b/kernel/Makefile -@@ -7,8 +7,8 @@ obj-y = fork.o exec_domain.o panic.o printk.o \ +Index: linux-stable/kernel/Makefile +=================================================================== +--- linux-stable.orig/kernel/Makefile ++++ linux-stable/kernel/Makefile +@@ -7,8 +7,8 @@ obj-y = fork.o exec_domain.o panic.o sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ - signal.o sys.o kmod.o workqueue.o pid.o \ + signal.o sys.o kmod.o workqueue.o pid.o task_work.o \ rcupdate.o extable.o params.o posix-timers.o \ - kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ - hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ + kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o \ + hrtimer.o nsproxy.o srcu.o semaphore.o \ notifier.o ksysfs.o cred.o \ - async.o range.o groups.o + async.o range.o groups.o lglock.o -@@ -29,7 +29,11 @@ obj-$(CONFIG_FREEZER) += freezer.o +@@ -32,7 +32,11 @@ obj-$(CONFIG_FREEZER) += freezer.o obj-$(CONFIG_PROFILING) += profile.o obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-y += time/ @@ -388,19 +385,18 @@ index cb41b95..f4bf68a 100644 obj-$(CONFIG_LOCKDEP) += lockdep.o ifeq ($(CONFIG_PROC_FS),y) obj-$(CONFIG_LOCKDEP) += lockdep_proc.o -@@ -41,6 +45,7 @@ endif +@@ -44,6 +48,7 @@ endif obj-$(CONFIG_RT_MUTEXES) += rtmutex.o obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o +obj-$(CONFIG_PREEMPT_RT_FULL) += rt.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += smp.o - ifneq ($(CONFIG_SMP),y) -diff --git a/kernel/rt.c b/kernel/rt.c -new file mode 100644 -index 0000000..092d6b3 + obj-$(CONFIG_SMP) += smpboot.o +Index: linux-stable/kernel/rt.c +=================================================================== --- /dev/null -+++ b/kernel/rt.c ++++ linux-stable/kernel/rt.c @@ -0,0 +1,442 @@ +/* + * kernel/rt.c @@ -844,11 +840,11 @@ index 0000000..092d6b3 + return 1; +} +EXPORT_SYMBOL(atomic_dec_and_mutex_lock); -diff --git a/kernel/spinlock.c b/kernel/spinlock.c -index 5cdd806..da9775b 100644 ---- a/kernel/spinlock.c -+++ b/kernel/spinlock.c -@@ -110,8 +110,11 @@ void __lockfunc __raw_##op##_lock_bh(locktype##_t *lock) \ +Index: linux-stable/kernel/spinlock.c +=================================================================== +--- linux-stable.orig/kernel/spinlock.c ++++ linux-stable/kernel/spinlock.c +@@ -110,8 +110,11 @@ void __lockfunc __raw_##op##_lock_bh(loc * __[spin|read|write]_lock_bh() */ BUILD_LOCK_OPS(spin, raw_spinlock); @@ -860,7 +856,7 @@ index 5cdd806..da9775b 100644 #endif -@@ -195,6 +198,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_spinlock_t *lock) +@@ -195,6 +198,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_ EXPORT_SYMBOL(_raw_spin_unlock_bh); #endif @@ -869,7 +865,7 @@ index 5cdd806..da9775b 100644 #ifndef CONFIG_INLINE_READ_TRYLOCK int __lockfunc _raw_read_trylock(rwlock_t *lock) { -@@ -339,6 +344,8 @@ void __lockfunc _raw_write_unlock_bh(rwlock_t *lock) +@@ -339,6 +344,8 @@ void __lockfunc _raw_write_unlock_bh(rwl EXPORT_SYMBOL(_raw_write_unlock_bh); #endif @@ -878,11 +874,11 @@ index 5cdd806..da9775b 100644 #ifdef CONFIG_DEBUG_LOCK_ALLOC void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) -diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c -index 525d160..5f5eae5 100644 ---- a/lib/spinlock_debug.c -+++ b/lib/spinlock_debug.c -@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name, +Index: linux-stable/lib/spinlock_debug.c +=================================================================== +--- linux-stable.orig/lib/spinlock_debug.c ++++ linux-stable/lib/spinlock_debug.c +@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t EXPORT_SYMBOL(__raw_spin_lock_init); @@ -890,7 +886,7 @@ index 525d160..5f5eae5 100644 void __rwlock_init(rwlock_t *lock, const char *name, struct lock_class_key *key) { -@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const char *name, +@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const } EXPORT_SYMBOL(__rwlock_init); @@ -898,7 +894,7 @@ index 525d160..5f5eae5 100644 static void spin_dump(raw_spinlock_t *lock, const char *msg) { -@@ -155,6 +157,7 @@ void do_raw_spin_unlock(raw_spinlock_t *lock) +@@ -155,6 +157,7 @@ void do_raw_spin_unlock(raw_spinlock_t * arch_spin_unlock(&lock->raw_lock); } diff --git a/debian/patches/features/all/rt/0177-rt-add-rt-spinlocks.patch.patch b/debian/patches/features/all/rt/rt-add-rt-spinlock-to-headers.patch similarity index 77% rename from debian/patches/features/all/rt/0177-rt-add-rt-spinlocks.patch.patch rename to debian/patches/features/all/rt/rt-add-rt-spinlock-to-headers.patch index 016a8cfe9..25de9535c 100644 --- a/debian/patches/features/all/rt/0177-rt-add-rt-spinlocks.patch.patch +++ b/debian/patches/features/all/rt/rt-add-rt-spinlock-to-headers.patch @@ -1,22 +1,18 @@ -From cf7aac26c5a28cf20b70fd431be88839c0058778 Mon Sep 17 00:00:00 2001 +Subject: rt-add-rt-spinlocks.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 19:43:35 +0200 -Subject: [177/256] rt-add-rt-spinlocks.patch Signed-off-by: Thomas Gleixner --- include/linux/rwlock_types_rt.h | 33 +++++++++++++++++++++++++ - include/linux/spinlock_types.h | 11 ++++++--- - include/linux/spinlock_types_rt.h | 49 +++++++++++++++++++++++++++++++++++++ + include/linux/spinlock_types.h | 11 ++++++-- + include/linux/spinlock_types_rt.h | 49 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) - create mode 100644 include/linux/rwlock_types_rt.h - create mode 100644 include/linux/spinlock_types_rt.h -diff --git a/include/linux/rwlock_types_rt.h b/include/linux/rwlock_types_rt.h -new file mode 100644 -index 0000000..b138321 +Index: linux-stable/include/linux/rwlock_types_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/rwlock_types_rt.h ++++ linux-stable/include/linux/rwlock_types_rt.h @@ -0,0 +1,33 @@ +#ifndef __LINUX_RWLOCK_TYPES_RT_H +#define __LINUX_RWLOCK_TYPES_RT_H @@ -51,10 +47,10 @@ index 0000000..b138321 + rwlock_t name __cacheline_aligned_in_smp = __RW_LOCK_UNLOCKED(name) + +#endif -diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h -index 5c8664d..10bac71 100644 ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h +Index: linux-stable/include/linux/spinlock_types.h +=================================================================== +--- linux-stable.orig/include/linux/spinlock_types.h ++++ linux-stable/include/linux/spinlock_types.h @@ -11,8 +11,13 @@ #include @@ -72,11 +68,10 @@ index 5c8664d..10bac71 100644 +#endif #endif /* __LINUX_SPINLOCK_TYPES_H */ -diff --git a/include/linux/spinlock_types_rt.h b/include/linux/spinlock_types_rt.h -new file mode 100644 -index 0000000..1fe8fc0 +Index: linux-stable/include/linux/spinlock_types_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/spinlock_types_rt.h ++++ linux-stable/include/linux/spinlock_types_rt.h @@ -0,0 +1,49 @@ +#ifndef __LINUX_SPINLOCK_TYPES_RT_H +#define __LINUX_SPINLOCK_TYPES_RT_H diff --git a/debian/patches/features/all/rt/0178-rt-add-rt-to-mutex-headers.patch.patch b/debian/patches/features/all/rt/rt-add-rt-to-mutex-headers.patch similarity index 87% rename from debian/patches/features/all/rt/0178-rt-add-rt-to-mutex-headers.patch.patch rename to debian/patches/features/all/rt/rt-add-rt-to-mutex-headers.patch index 162e0f2d6..237094975 100644 --- a/debian/patches/features/all/rt/0178-rt-add-rt-to-mutex-headers.patch.patch +++ b/debian/patches/features/all/rt/rt-add-rt-to-mutex-headers.patch @@ -1,19 +1,17 @@ -From 9b84e782f207e5da7a3fa04cc65d8e4ac17026e9 Mon Sep 17 00:00:00 2001 +Subject: rt-add-rt-to-mutex-headers.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 20:56:22 +0200 -Subject: [178/256] rt-add-rt-to-mutex-headers.patch Signed-off-by: Thomas Gleixner --- - include/linux/mutex.h | 21 ++++++++---- - include/linux/mutex_rt.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++ + include/linux/mutex.h | 21 +++++++---- + include/linux/mutex_rt.h | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 7 deletions(-) - create mode 100644 include/linux/mutex_rt.h -diff --git a/include/linux/mutex.h b/include/linux/mutex.h -index 9121595..bdf1da2 100644 ---- a/include/linux/mutex.h -+++ b/include/linux/mutex.h +Index: linux-stable/include/linux/mutex.h +=================================================================== +--- linux-stable.orig/include/linux/mutex.h ++++ linux-stable/include/linux/mutex.h @@ -17,6 +17,17 @@ #include @@ -46,7 +44,7 @@ index 9121595..bdf1da2 100644 #define __MUTEX_INITIALIZER(lockname) \ { .count = ATOMIC_INIT(1) \ , .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \ -@@ -167,6 +171,9 @@ extern int __must_check mutex_lock_killable(struct mutex *lock); +@@ -167,6 +171,9 @@ extern int __must_check mutex_lock_killa */ extern int mutex_trylock(struct mutex *lock); extern void mutex_unlock(struct mutex *lock); @@ -56,11 +54,10 @@ index 9121595..bdf1da2 100644 extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); #ifndef CONFIG_HAVE_ARCH_MUTEX_CPU_RELAX -diff --git a/include/linux/mutex_rt.h b/include/linux/mutex_rt.h -new file mode 100644 -index 0000000..c38a44b +Index: linux-stable/include/linux/mutex_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/mutex_rt.h ++++ linux-stable/include/linux/mutex_rt.h @@ -0,0 +1,84 @@ +#ifndef __LINUX_MUTEX_RT_H +#define __LINUX_MUTEX_RT_H diff --git a/debian/patches/features/all/rt/rt-disable-rt-group-sched.patch b/debian/patches/features/all/rt/rt-disable-rt-group-sched.patch new file mode 100644 index 000000000..418dd9dcf --- /dev/null +++ b/debian/patches/features/all/rt/rt-disable-rt-group-sched.patch @@ -0,0 +1,29 @@ +From f9e7eb3419db82245b3396074c137b687b42df06 Mon Sep 17 00:00:00 2001 +From: Carsten Emde +Date: Wed, 11 Jul 2012 22:05:18 +0000 +Subject: Disable RT_GROUP_SCHED in PREEMPT_RT_FULL + +Strange CPU stalls have been observed in RT when RT_GROUP_SCHED +was configured. + +Disable it for now. + +Signed-off-by: Carsten Emde +Signed-off-by: Thomas Gleixner + +--- + init/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +Index: linux-stable/init/Kconfig +=================================================================== +--- linux-stable.orig/init/Kconfig ++++ linux-stable/init/Kconfig +@@ -806,6 +806,7 @@ config RT_GROUP_SCHED + bool "Group scheduling for SCHED_RR/FIFO" + depends on EXPERIMENTAL + depends on CGROUP_SCHED ++ depends on !PREEMPT_RT_FULL + default n + help + This feature lets you explicitly allocate real CPU bandwidth diff --git a/debian/patches/features/all/rt/0244-rt-Introduce-cpu_chill.patch b/debian/patches/features/all/rt/rt-introduce-cpu-chill.patch similarity index 63% rename from debian/patches/features/all/rt/0244-rt-Introduce-cpu_chill.patch rename to debian/patches/features/all/rt/rt-introduce-cpu-chill.patch index 9c8fa6918..1fa281808 100644 --- a/debian/patches/features/all/rt/0244-rt-Introduce-cpu_chill.patch +++ b/debian/patches/features/all/rt/rt-introduce-cpu-chill.patch @@ -1,7 +1,6 @@ -From 00fa0b57d2e9dcfc2482e72e85111776fac22e53 Mon Sep 17 00:00:00 2001 +Subject: rt: Introduce cpu_chill() From: Thomas Gleixner -Date: Wed, 7 Mar 2012 20:51:03 +0100 -Subject: [244/256] rt: Introduce cpu_chill() +Date: Wed, 07 Mar 2012 20:51:03 +0100 Retry loops on RT might loop forever when the modifying side was preempted. Add cpu_chill() to replace cpu_relax(). cpu_chill() @@ -14,11 +13,11 @@ Cc: stable-rt@vger.kernel.org include/linux/delay.h | 6 ++++++ 1 file changed, 6 insertions(+) -diff --git a/include/linux/delay.h b/include/linux/delay.h -index a6ecb34..e23a7c0 100644 ---- a/include/linux/delay.h -+++ b/include/linux/delay.h -@@ -52,4 +52,10 @@ static inline void ssleep(unsigned int seconds) +Index: linux-stable/include/linux/delay.h +=================================================================== +--- linux-stable.orig/include/linux/delay.h ++++ linux-stable/include/linux/delay.h +@@ -52,4 +52,10 @@ static inline void ssleep(unsigned int s msleep(seconds * 1000); } diff --git a/debian/patches/features/all/rt/0088-rt-local-irq-lock.patch.patch b/debian/patches/features/all/rt/rt-local-irq-lock.patch similarity index 94% rename from debian/patches/features/all/rt/0088-rt-local-irq-lock.patch.patch rename to debian/patches/features/all/rt/rt-local-irq-lock.patch index 82fa8fd0c..b33ccec61 100644 --- a/debian/patches/features/all/rt/0088-rt-local-irq-lock.patch.patch +++ b/debian/patches/features/all/rt/rt-local-irq-lock.patch @@ -1,19 +1,16 @@ -From 892c3a442dd0abcd683c165f7b2fe3a1b0918bc4 Mon Sep 17 00:00:00 2001 +Subject: rt-local-irq-lock.patch From: Thomas Gleixner Date: Mon, 20 Jun 2011 09:03:47 +0200 -Subject: [088/256] rt-local-irq-lock.patch Signed-off-by: Thomas Gleixner --- - include/linux/locallock.h | 230 +++++++++++++++++++++++++++++++++++++++++++++ + include/linux/locallock.h | 230 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) - create mode 100644 include/linux/locallock.h -diff --git a/include/linux/locallock.h b/include/linux/locallock.h -new file mode 100644 -index 0000000..8fbc393 +Index: linux-stable/include/linux/locallock.h +=================================================================== --- /dev/null -+++ b/include/linux/locallock.h ++++ linux-stable/include/linux/locallock.h @@ -0,0 +1,230 @@ +#ifndef _LINUX_LOCALLOCK_H +#define _LINUX_LOCALLOCK_H diff --git a/debian/patches/features/all/rt/0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch b/debian/patches/features/all/rt/rt-mutex-add-sleeping-spinlocks-support.patch similarity index 88% rename from debian/patches/features/all/rt/0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch rename to debian/patches/features/all/rt/rt-mutex-add-sleeping-spinlocks-support.patch index a3e9b3a26..566f52903 100644 --- a/debian/patches/features/all/rt/0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch +++ b/debian/patches/features/all/rt/rt-mutex-add-sleeping-spinlocks-support.patch @@ -1,20 +1,19 @@ -From 324904375b11bf2a728446415012297ca09c6022 Mon Sep 17 00:00:00 2001 +Subject: rt-mutex-add-sleeping-spinlocks-support.patch From: Thomas Gleixner Date: Fri, 10 Jun 2011 11:21:25 +0200 -Subject: [174/256] rt-mutex-add-sleeping-spinlocks-support.patch Signed-off-by: Thomas Gleixner --- - include/linux/rtmutex.h | 35 ++++- - kernel/futex.c | 3 +- - kernel/rtmutex.c | 384 ++++++++++++++++++++++++++++++++++++++++++++--- - kernel/rtmutex_common.h | 9 ++ + include/linux/rtmutex.h | 35 +++- + kernel/futex.c | 3 + kernel/rtmutex.c | 384 +++++++++++++++++++++++++++++++++++++++++++++--- + kernel/rtmutex_common.h | 9 + 4 files changed, 404 insertions(+), 27 deletions(-) -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index 3561eb2..928d93e 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h +Index: linux-stable/include/linux/rtmutex.h +=================================================================== +--- linux-stable.orig/include/linux/rtmutex.h ++++ linux-stable/include/linux/rtmutex.h @@ -29,9 +29,10 @@ struct rt_mutex { raw_spinlock_t wait_lock; struct plist_head wait_list; @@ -73,11 +72,11 @@ index 3561eb2..928d93e 100644 #define DEFINE_RT_MUTEX(mutexname) \ struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) -diff --git a/kernel/futex.c b/kernel/futex.c -index 9decb1c..3ee96ed 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2299,8 +2299,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, +Index: linux-stable/kernel/futex.c +=================================================================== +--- linux-stable.orig/kernel/futex.c ++++ linux-stable/kernel/futex.c +@@ -2302,8 +2302,7 @@ static int futex_wait_requeue_pi(u32 __u * The waiter is allocated on our stack, manipulated by the requeue * code while we sleep on uaddr. */ @@ -87,10 +86,10 @@ index 9decb1c..3ee96ed 100644 ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); if (unlikely(ret != 0)) -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index 7a96797..f9baaae 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c +Index: linux-stable/kernel/rtmutex.c +=================================================================== +--- linux-stable.orig/kernel/rtmutex.c ++++ linux-stable/kernel/rtmutex.c @@ -8,6 +8,12 @@ * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt * Copyright (C) 2006 Esben Nielsen @@ -104,7 +103,7 @@ index 7a96797..f9baaae 100644 * See Documentation/rt-mutex-design.txt for details. */ #include -@@ -96,6 +102,12 @@ static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) +@@ -96,6 +102,12 @@ static inline void mark_rt_mutex_waiters } #endif @@ -117,7 +116,7 @@ index 7a96797..f9baaae 100644 /* * Calculate task priority from the waiter list priority * -@@ -142,6 +154,14 @@ static void rt_mutex_adjust_prio(struct task_struct *task) +@@ -142,6 +154,14 @@ static void rt_mutex_adjust_prio(struct raw_spin_unlock_irqrestore(&task->pi_lock, flags); } @@ -132,7 +131,7 @@ index 7a96797..f9baaae 100644 /* * Max number of times we'll walk the boosting chain: */ -@@ -253,13 +273,15 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, +@@ -253,13 +273,15 @@ static int rt_mutex_adjust_prio_chain(st /* Release the task */ raw_spin_unlock_irqrestore(&task->pi_lock, flags); if (!rt_mutex_owner(lock)) { @@ -151,7 +150,7 @@ index 7a96797..f9baaae 100644 raw_spin_unlock(&lock->wait_lock); goto out_put_task; } -@@ -304,6 +326,25 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, +@@ -304,6 +326,25 @@ static int rt_mutex_adjust_prio_chain(st return ret; } @@ -177,7 +176,7 @@ index 7a96797..f9baaae 100644 /* * Try to take an rt-mutex * -@@ -313,8 +354,9 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, +@@ -313,8 +354,9 @@ static int rt_mutex_adjust_prio_chain(st * @task: the task which wants to acquire the lock * @waiter: the waiter that is queued to the lock's wait list. (could be NULL) */ @@ -189,7 +188,7 @@ index 7a96797..f9baaae 100644 { /* * We have to be careful here if the atomic speedups are -@@ -347,12 +389,14 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, +@@ -347,12 +389,14 @@ static int try_to_take_rt_mutex(struct r * 3) it is top waiter */ if (rt_mutex_has_waiters(lock)) { @@ -208,7 +207,7 @@ index 7a96797..f9baaae 100644 if (waiter || rt_mutex_has_waiters(lock)) { unsigned long flags; struct rt_mutex_waiter *top; -@@ -377,7 +421,6 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, +@@ -377,7 +421,6 @@ static int try_to_take_rt_mutex(struct r raw_spin_unlock_irqrestore(&task->pi_lock, flags); } @@ -216,7 +215,7 @@ index 7a96797..f9baaae 100644 debug_rt_mutex_lock(lock); rt_mutex_set_owner(lock, task); -@@ -387,6 +430,13 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, +@@ -387,6 +430,13 @@ static int try_to_take_rt_mutex(struct r return 1; } @@ -230,7 +229,7 @@ index 7a96797..f9baaae 100644 /* * Task blocks on lock. * -@@ -501,7 +551,7 @@ static void wakeup_next_waiter(struct rt_mutex *lock) +@@ -501,7 +551,7 @@ static void wakeup_next_waiter(struct rt raw_spin_unlock_irqrestore(¤t->pi_lock, flags); @@ -239,7 +238,7 @@ index 7a96797..f9baaae 100644 } /* -@@ -580,18 +630,315 @@ void rt_mutex_adjust_pi(struct task_struct *task) +@@ -580,18 +630,315 @@ void rt_mutex_adjust_pi(struct task_stru return; } @@ -558,7 +557,7 @@ index 7a96797..f9baaae 100644 * @timeout: the pre-initialized and started timer, or NULL for none * @waiter: the pre-initialized rt_mutex_waiter * -@@ -647,9 +994,10 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, +@@ -647,9 +994,10 @@ rt_mutex_slowlock(struct rt_mutex *lock, struct rt_mutex_waiter waiter; int ret = 0; @@ -570,7 +569,7 @@ index 7a96797..f9baaae 100644 /* Try to acquire the lock again: */ if (try_to_take_rt_mutex(lock, current, NULL)) { -@@ -702,6 +1050,7 @@ rt_mutex_slowtrylock(struct rt_mutex *lock) +@@ -702,6 +1050,7 @@ rt_mutex_slowtrylock(struct rt_mutex *lo int ret = 0; raw_spin_lock(&lock->wait_lock); @@ -601,10 +600,10 @@ index 7a96797..f9baaae 100644 debug_rt_mutex_proxy_lock(lock, proxy_owner); rt_mutex_set_owner(lock, proxy_owner); rt_mutex_deadlock_account_lock(lock, proxy_owner); -diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h -index 47290ec..6ec3dc1 100644 ---- a/kernel/rtmutex_common.h -+++ b/kernel/rtmutex_common.h +Index: linux-stable/kernel/rtmutex_common.h +=================================================================== +--- linux-stable.orig/kernel/rtmutex_common.h ++++ linux-stable/kernel/rtmutex_common.h @@ -49,6 +49,7 @@ struct rt_mutex_waiter { struct plist_node pi_list_entry; struct task_struct *task; @@ -613,7 +612,7 @@ index 47290ec..6ec3dc1 100644 #ifdef CONFIG_DEBUG_RT_MUTEXES unsigned long ip; struct pid *deadlock_task_pid; -@@ -126,4 +127,12 @@ extern int rt_mutex_finish_proxy_lock(struct rt_mutex *lock, +@@ -126,4 +127,12 @@ extern int rt_mutex_finish_proxy_lock(st # include "rtmutex.h" #endif diff --git a/debian/patches/features/all/rt/0060-rt-preempt-base-config.patch.patch b/debian/patches/features/all/rt/rt-preempt-base-config.patch similarity index 81% rename from debian/patches/features/all/rt/0060-rt-preempt-base-config.patch.patch rename to debian/patches/features/all/rt/rt-preempt-base-config.patch index a0006eee2..cbff74555 100644 --- a/debian/patches/features/all/rt/0060-rt-preempt-base-config.patch.patch +++ b/debian/patches/features/all/rt/rt-preempt-base-config.patch @@ -1,17 +1,16 @@ -From affafa484e6797dab272f3bc2d8b4f68da70e050 Mon Sep 17 00:00:00 2001 +Subject: rt-preempt-base-config.patch From: Thomas Gleixner Date: Fri, 17 Jun 2011 12:39:57 +0200 -Subject: [060/256] rt-preempt-base-config.patch Signed-off-by: Thomas Gleixner --- kernel/Kconfig.preempt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) -diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt -index 3f9c974..885efbd 100644 ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt +Index: linux-stable/kernel/Kconfig.preempt +=================================================================== +--- linux-stable.orig/kernel/Kconfig.preempt ++++ linux-stable/kernel/Kconfig.preempt @@ -1,3 +1,10 @@ +config PREEMPT + bool diff --git a/debian/patches/features/all/rt/0190-rt-rcutree-Move-misplaced-prototype.patch b/debian/patches/features/all/rt/rt-rcutree-warn-fix.patch similarity index 60% rename from debian/patches/features/all/rt/0190-rt-rcutree-Move-misplaced-prototype.patch rename to debian/patches/features/all/rt/rt-rcutree-warn-fix.patch index 245e96022..8b82a7545 100644 --- a/debian/patches/features/all/rt/0190-rt-rcutree-Move-misplaced-prototype.patch +++ b/debian/patches/features/all/rt/rt-rcutree-warn-fix.patch @@ -1,10 +1,6 @@ -From 2b9c6eb39777cbe4d3b9cfbd293fc683c5e10da6 Mon Sep 17 00:00:00 2001 +Subject: rt/rcutree: Move misplaced prototype From: Ingo Molnar -Date: Wed, 14 Dec 2011 12:51:28 +0100 -Subject: [190/256] rt/rcutree: Move misplaced prototype -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +Date: Wed Dec 14 12:51:28 CET 2011 Fix this warning on x86 defconfig: @@ -15,16 +11,17 @@ usage site that needs it. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner +--- --- kernel/rcutree.c | 2 ++ kernel/rcutree.h | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) -diff --git a/kernel/rcutree.c b/kernel/rcutree.c -index a9ca0e0..0c3f4a9 100644 ---- a/kernel/rcutree.c -+++ b/kernel/rcutree.c -@@ -173,6 +173,8 @@ void rcu_sched_qs(int cpu) +Index: linux-stable/kernel/rcutree.c +=================================================================== +--- linux-stable.orig/kernel/rcutree.c ++++ linux-stable/kernel/rcutree.c +@@ -183,6 +183,8 @@ void rcu_sched_qs(int cpu) } #ifdef CONFIG_PREEMPT_RT_FULL @@ -33,11 +30,11 @@ index a9ca0e0..0c3f4a9 100644 void rcu_bh_qs(int cpu) { rcu_preempt_qs(cpu); -diff --git a/kernel/rcutree.h b/kernel/rcutree.h -index 6ee6525..cdd1be0 100644 ---- a/kernel/rcutree.h -+++ b/kernel/rcutree.h -@@ -423,7 +423,6 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work); +Index: linux-stable/kernel/rcutree.h +=================================================================== +--- linux-stable.orig/kernel/rcutree.h ++++ linux-stable/kernel/rcutree.h +@@ -463,7 +463,6 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work); /* Forward declarations for rcutree_plugin.h */ static void rcu_bootup_announce(void); long rcu_batches_completed(void); diff --git a/debian/patches/features/all/rt/rt-rw-lockdep-annotations.patch b/debian/patches/features/all/rt/rt-rw-lockdep-annotations.patch new file mode 100644 index 000000000..5e85861de --- /dev/null +++ b/debian/patches/features/all/rt/rt-rw-lockdep-annotations.patch @@ -0,0 +1,121 @@ +Subject: rt: rwsem/rwlock: lockdep annotations +From: Thomas Gleixner +Date: Fri, 28 Sep 2012 10:49:42 +0100 + +rwlocks and rwsems on RT do not allow multiple readers. Annotate the +lockdep acquire functions accordingly. + +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +--- + kernel/rt.c | 46 +++++++++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 21 deletions(-) + +Index: linux-stable/kernel/rt.c +=================================================================== +--- linux-stable.orig/kernel/rt.c ++++ linux-stable/kernel/rt.c +@@ -216,15 +216,17 @@ int __lockfunc rt_read_trylock(rwlock_t + * write locked. + */ + migrate_disable(); +- if (rt_mutex_owner(lock) != current) ++ if (rt_mutex_owner(lock) != current) { + ret = rt_mutex_trylock(lock); +- else if (!rwlock->read_depth) ++ if (ret) ++ rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); ++ } else if (!rwlock->read_depth) { + ret = 0; ++ } + +- if (ret) { ++ if (ret) + rwlock->read_depth++; +- rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); +- } else ++ else + migrate_enable(); + + return ret; +@@ -242,13 +244,13 @@ void __lockfunc rt_read_lock(rwlock_t *r + { + struct rt_mutex *lock = &rwlock->lock; + +- rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); +- + /* + * recursive read locks succeed when current owns the lock + */ +- if (rt_mutex_owner(lock) != current) ++ if (rt_mutex_owner(lock) != current) { ++ rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); + __rt_spin_lock(lock); ++ } + rwlock->read_depth++; + } + +@@ -264,11 +266,11 @@ EXPORT_SYMBOL(rt_write_unlock); + + void __lockfunc rt_read_unlock(rwlock_t *rwlock) + { +- rwlock_release(&rwlock->dep_map, 1, _RET_IP_); +- + /* Release the lock only when read_depth is down to 0 */ +- if (--rwlock->read_depth == 0) ++ if (--rwlock->read_depth == 0) { ++ rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + __rt_spin_unlock(&rwlock->lock); ++ } + } + EXPORT_SYMBOL(rt_read_unlock); + +@@ -315,9 +317,10 @@ EXPORT_SYMBOL(rt_up_write); + + void rt_up_read(struct rw_semaphore *rwsem) + { +- rwsem_release(&rwsem->dep_map, 1, _RET_IP_); +- if (--rwsem->read_depth == 0) ++ if (--rwsem->read_depth == 0) { ++ rwsem_release(&rwsem->dep_map, 1, _RET_IP_); + rt_mutex_unlock(&rwsem->lock); ++ } + } + EXPORT_SYMBOL(rt_up_read); + +@@ -366,15 +369,16 @@ int rt_down_read_trylock(struct rw_sema + * but not when read_depth == 0 which means that the rwsem is + * write locked. + */ +- if (rt_mutex_owner(lock) != current) ++ if (rt_mutex_owner(lock) != current) { + ret = rt_mutex_trylock(&rwsem->lock); +- else if (!rwsem->read_depth) ++ if (ret) ++ rwsem_acquire(&rwsem->dep_map, 0, 1, _RET_IP_); ++ } else if (!rwsem->read_depth) { + ret = 0; ++ } + +- if (ret) { ++ if (ret) + rwsem->read_depth++; +- rwsem_acquire(&rwsem->dep_map, 0, 1, _RET_IP_); +- } + return ret; + } + EXPORT_SYMBOL(rt_down_read_trylock); +@@ -383,10 +387,10 @@ static void __rt_down_read(struct rw_sem + { + struct rt_mutex *lock = &rwsem->lock; + +- rwsem_acquire_read(&rwsem->dep_map, subclass, 0, _RET_IP_); +- +- if (rt_mutex_owner(lock) != current) ++ if (rt_mutex_owner(lock) != current) { ++ rwsem_acquire(&rwsem->dep_map, subclass, 0, _RET_IP_); + rt_mutex_lock(&rwsem->lock); ++ } + rwsem->read_depth++; + } + diff --git a/debian/patches/features/all/rt/0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch b/debian/patches/features/all/rt/rt-sched-do-not-compare-cpu-masks-in-scheduler.patch similarity index 68% rename from debian/patches/features/all/rt/0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch rename to debian/patches/features/all/rt/rt-sched-do-not-compare-cpu-masks-in-scheduler.patch index 7b9b08504..a5ca035bd 100644 --- a/debian/patches/features/all/rt/0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch +++ b/debian/patches/features/all/rt/rt-sched-do-not-compare-cpu-masks-in-scheduler.patch @@ -1,34 +1,34 @@ -From 013916cf88baff0309f2dd8b7cbc80a01177a28b Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra +Subject: sched: Do not compare cpu masks in scheduler Date: Tue, 27 Sep 2011 08:40:24 -0400 -Subject: [152/256] sched: Do not compare cpu masks in scheduler +From: Peter Zijlstra Signed-off-by: Peter Zijlstra Cc: Peter Zijlstra Cc: Clark Williams Link: http://lkml.kernel.org/r/20110927124423.128129033@goodmis.org Signed-off-by: Thomas Gleixner + --- kernel/sched/core.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 388c4ab..44b5b11 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3164,16 +3164,12 @@ static inline void update_migrate_disable(struct task_struct *p) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3398,16 +3398,12 @@ static inline void update_migrate_disabl */ mask = tsk_cpus_allowed(p); - WARN_ON(!cpumask_test_cpu(smp_processor_id(), mask)); + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); - if (!cpumask_equal(&p->cpus_allowed, mask)) { - if (p->sched_class->set_cpus_allowed) - p->sched_class->set_cpus_allowed(p, mask); -- p->rt.nr_cpus_allowed = cpumask_weight(mask); +- p->nr_cpus_allowed = cpumask_weight(mask); - - /* Let migrate_enable know to fix things back up */ - p->migrate_disable |= MIGRATE_DISABLE_SET_AFFIN; diff --git a/debian/patches/features/all/rt/0153-sched-Have-migrate_disable-ignore-bounded-threads.patch b/debian/patches/features/all/rt/rt-sched-have-migrate_disable-ignore-bounded-threads.patch similarity index 77% rename from debian/patches/features/all/rt/0153-sched-Have-migrate_disable-ignore-bounded-threads.patch rename to debian/patches/features/all/rt/rt-sched-have-migrate_disable-ignore-bounded-threads.patch index ba21a0f99..405477b48 100644 --- a/debian/patches/features/all/rt/0153-sched-Have-migrate_disable-ignore-bounded-threads.patch +++ b/debian/patches/features/all/rt/rt-sched-have-migrate_disable-ignore-bounded-threads.patch @@ -1,22 +1,22 @@ -From fdabe6279466f19b4a00a28d07003d12dbf18e6a Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra +Subject: sched: Have migrate_disable ignore bounded threads Date: Tue, 27 Sep 2011 08:40:25 -0400 -Subject: [153/256] sched: Have migrate_disable ignore bounded threads +From: Peter Zijlstra Signed-off-by: Peter Zijlstra Cc: Peter Zijlstra Cc: Clark Williams Link: http://lkml.kernel.org/r/20110927124423.567944215@goodmis.org Signed-off-by: Thomas Gleixner + --- kernel/sched/core.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 44b5b11..8afb5e9 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3176,7 +3176,7 @@ void migrate_disable(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3410,7 +3410,7 @@ void migrate_disable(void) { struct task_struct *p = current; @@ -25,7 +25,7 @@ index 44b5b11..8afb5e9 100644 #ifdef CONFIG_SCHED_DEBUG p->migrate_disable_atomic++; #endif -@@ -3207,7 +3207,7 @@ void migrate_enable(void) +@@ -3441,7 +3441,7 @@ void migrate_enable(void) unsigned long flags; struct rq *rq; @@ -34,7 +34,7 @@ index 44b5b11..8afb5e9 100644 #ifdef CONFIG_SCHED_DEBUG p->migrate_disable_atomic--; #endif -@@ -3228,26 +3228,21 @@ void migrate_enable(void) +@@ -3462,26 +3462,21 @@ void migrate_enable(void) if (unlikely(migrate_disabled_updated(p))) { /* @@ -59,12 +59,12 @@ index 44b5b11..8afb5e9 100644 - mask = tsk_cpus_allowed(p); - if (p->sched_class->set_cpus_allowed) - p->sched_class->set_cpus_allowed(p, mask); -- p->rt.nr_cpus_allowed = cpumask_weight(mask); +- p->nr_cpus_allowed = cpumask_weight(mask); - } + mask = tsk_cpus_allowed(p); + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); raw_spin_unlock_irqrestore(&rq->lock, flags); } else p->migrate_disable = 0; diff --git a/debian/patches/features/all/rt/0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch b/debian/patches/features/all/rt/rt-sched-postpone-actual-migration-disalbe-to-schedule.patch similarity index 90% rename from debian/patches/features/all/rt/0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch rename to debian/patches/features/all/rt/rt-sched-postpone-actual-migration-disalbe-to-schedule.patch index 8ffefe03d..49e1e4f88 100644 --- a/debian/patches/features/all/rt/0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch +++ b/debian/patches/features/all/rt/rt-sched-postpone-actual-migration-disalbe-to-schedule.patch @@ -1,7 +1,6 @@ -From bcc549901e49108b06e373d3cdf26fecf43b2706 Mon Sep 17 00:00:00 2001 +Subject: sched: Postpone actual migration disalbe to schedule From: Steven Rostedt Date: Tue, 27 Sep 2011 08:40:23 -0400 -Subject: [151/256] sched: Postpone actual migration disalbe to schedule The migrate_disable() can cause a bit of a overhead to the RT kernel, as changing the affinity is expensive to do at every lock encountered. @@ -18,15 +17,16 @@ Cc: Peter Zijlstra Cc: Clark Williams Link: http://lkml.kernel.org/r/20110927124422.779693167@goodmis.org Signed-off-by: Thomas Gleixner + --- - kernel/sched/core.c | 251 +++++++++++++++++++++++++++------------------------ + kernel/sched/core.c | 251 +++++++++++++++++++++++++++------------------------- 1 file changed, 132 insertions(+), 119 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index d2cc5a0..388c4ab 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3136,6 +3136,135 @@ static inline void schedule_debug(struct task_struct *prev) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3370,6 +3370,135 @@ static inline void schedule_debug(struct schedstat_inc(this_rq(), sched_count); } @@ -63,7 +63,7 @@ index d2cc5a0..388c4ab 100644 + if (!cpumask_equal(&p->cpus_allowed, mask)) { + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); + + /* Let migrate_enable know to fix things back up */ + p->migrate_disable |= MIGRATE_DISABLE_SET_AFFIN; @@ -144,7 +144,7 @@ index d2cc5a0..388c4ab 100644 + mask = tsk_cpus_allowed(p); + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); + } + raw_spin_unlock_irqrestore(&rq->lock, flags); + } else @@ -162,7 +162,7 @@ index d2cc5a0..388c4ab 100644 static void put_prev_task(struct rq *rq, struct task_struct *prev) { if (prev->on_rq || rq->skip_clock_update < 0) -@@ -3195,6 +3324,8 @@ need_resched: +@@ -3429,6 +3558,8 @@ need_resched: raw_spin_lock_irq(&rq->lock); @@ -171,7 +171,7 @@ index d2cc5a0..388c4ab 100644 switch_count = &prev->nivcsw; if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { if (unlikely(signal_pending_state(prev->state, prev))) { -@@ -4976,7 +5107,7 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) +@@ -5203,7 +5334,7 @@ void __cpuinit init_idle(struct task_str #ifdef CONFIG_SMP void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) { @@ -179,8 +179,8 @@ index d2cc5a0..388c4ab 100644 + if (!migrate_disabled_updated(p)) { if (p->sched_class && p->sched_class->set_cpus_allowed) p->sched_class->set_cpus_allowed(p, new_mask); - p->rt.nr_cpus_allowed = cpumask_weight(new_mask); -@@ -5051,124 +5182,6 @@ out: + p->nr_cpus_allowed = cpumask_weight(new_mask); +@@ -5278,124 +5409,6 @@ out: } EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); @@ -237,7 +237,7 @@ index d2cc5a0..388c4ab 100644 - if (!cpumask_equal(&p->cpus_allowed, mask)) { - if (p->sched_class->set_cpus_allowed) - p->sched_class->set_cpus_allowed(p, mask); -- p->rt.nr_cpus_allowed = cpumask_weight(mask); +- p->nr_cpus_allowed = cpumask_weight(mask); - } - raw_spin_unlock_irqrestore(&rq->lock, flags); - preempt_enable(); @@ -292,7 +292,7 @@ index d2cc5a0..388c4ab 100644 - mask = tsk_cpus_allowed(p); - if (p->sched_class->set_cpus_allowed) - p->sched_class->set_cpus_allowed(p, mask); -- p->rt.nr_cpus_allowed = cpumask_weight(mask); +- p->nr_cpus_allowed = cpumask_weight(mask); - } - - raw_spin_unlock_irqrestore(&rq->lock, flags); diff --git a/debian/patches/features/all/rt/0195-rt-Improve-the-serial-console-PASS_LIMIT.patch b/debian/patches/features/all/rt/rt-serial-warn-fix.patch similarity index 65% rename from debian/patches/features/all/rt/0195-rt-Improve-the-serial-console-PASS_LIMIT.patch rename to debian/patches/features/all/rt/rt-serial-warn-fix.patch index 6411d78a9..1dec8a3dc 100644 --- a/debian/patches/features/all/rt/0195-rt-Improve-the-serial-console-PASS_LIMIT.patch +++ b/debian/patches/features/all/rt/rt-serial-warn-fix.patch @@ -1,10 +1,6 @@ -From ed2487dbf09bdff49c997cadf6e0484c27e10a31 Mon Sep 17 00:00:00 2001 +Subject: rt: Improve the serial console PASS_LIMIT From: Ingo Molnar -Date: Wed, 14 Dec 2011 13:05:54 +0100 -Subject: [195/256] rt: Improve the serial console PASS_LIMIT -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +Date: Wed Dec 14 13:05:54 CET 2011 Beyond the warning: @@ -19,11 +15,11 @@ Signed-off-by: Thomas Gleixner drivers/tty/serial/8250/8250.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) -diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c -index ff93c70..a785ec0 100644 ---- a/drivers/tty/serial/8250/8250.c -+++ b/drivers/tty/serial/8250/8250.c -@@ -80,7 +80,16 @@ static unsigned int skip_txen_test; /* force skip of txen test at init time */ +Index: linux-stable/drivers/tty/serial/8250/8250.c +=================================================================== +--- linux-stable.orig/drivers/tty/serial/8250/8250.c ++++ linux-stable/drivers/tty/serial/8250/8250.c +@@ -80,7 +80,16 @@ static unsigned int skip_txen_test; /* f #define DEBUG_INTR(fmt...) do { } while (0) #endif @@ -41,7 +37,7 @@ index ff93c70..a785ec0 100644 #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) -@@ -1584,14 +1593,12 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id) +@@ -1549,14 +1558,12 @@ static irqreturn_t serial8250_interrupt( l = l->next; diff --git a/debian/patches/features/all/rt/0145-tracing-Show-padding-as-unsigned-short.patch b/debian/patches/features/all/rt/rt-tracing-show-padding-as-unsigned-short.patch similarity index 80% rename from debian/patches/features/all/rt/0145-tracing-Show-padding-as-unsigned-short.patch rename to debian/patches/features/all/rt/rt-tracing-show-padding-as-unsigned-short.patch index 14269ebdb..4d0434cab 100644 --- a/debian/patches/features/all/rt/0145-tracing-Show-padding-as-unsigned-short.patch +++ b/debian/patches/features/all/rt/rt-tracing-show-padding-as-unsigned-short.patch @@ -1,7 +1,6 @@ -From e8940c2513f302ea32fc52c3b1d34f22c093df05 Mon Sep 17 00:00:00 2001 +Subject: tracing: Show padding as unsigned short From: Steven Rostedt Date: Wed, 16 Nov 2011 13:19:35 -0500 -Subject: [145/256] tracing: Show padding as unsigned short RT added two bytes to trace migrate disable counting to the trace events and used two bytes of the padding to make the change. The structures and @@ -20,6 +19,7 @@ format: field:unsigned short common_migrate_disable; offset:8; size:2; signed:0; field:int common_padding; offset:10; size:2; signed:0; + The field for common_padding has the correct size and offset, but the use of "int" might confuse some parsers (and people that are reading it). This needs to be changed to "unsigned short". @@ -28,15 +28,16 @@ Signed-off-by: Steven Rostedt Link: http://lkml.kernel.org/r/1321467575.4181.36.camel@frodo Cc: stable-rt@vger.kernel.org Signed-off-by: Thomas Gleixner + --- kernel/trace/trace_events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c -index 4c3a7b3..9d94e2f 100644 ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -117,7 +117,7 @@ static int trace_define_common_fields(void) +Index: linux-stable/kernel/trace/trace_events.c +=================================================================== +--- linux-stable.orig/kernel/trace/trace_events.c ++++ linux-stable/kernel/trace/trace_events.c +@@ -117,7 +117,7 @@ static int trace_define_common_fields(vo __common_field(unsigned char, preempt_count); __common_field(int, pid); __common_field(unsigned short, migrate_disable); diff --git a/debian/patches/features/all/rt/0176-rtmutex-avoid-include-hell.patch.patch b/debian/patches/features/all/rt/rtmutex-avoid-include-hell.patch similarity index 60% rename from debian/patches/features/all/rt/0176-rtmutex-avoid-include-hell.patch.patch rename to debian/patches/features/all/rt/rtmutex-avoid-include-hell.patch index 26a45aa87..9f141dcb6 100644 --- a/debian/patches/features/all/rt/0176-rtmutex-avoid-include-hell.patch.patch +++ b/debian/patches/features/all/rt/rtmutex-avoid-include-hell.patch @@ -1,17 +1,16 @@ -From 6894c43fe47e28d2a8cc7167922f5b7fba6fb66d Mon Sep 17 00:00:00 2001 +Subject: rtmutex-avoid-include-hell.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 20:06:39 +0200 -Subject: [176/256] rtmutex-avoid-include-hell.patch Signed-off-by: Thomas Gleixner --- include/linux/rtmutex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index 928d93e..5ebd0bb 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h +Index: linux-stable/include/linux/rtmutex.h +=================================================================== +--- linux-stable.orig/include/linux/rtmutex.h ++++ linux-stable/include/linux/rtmutex.h @@ -14,7 +14,7 @@ #include diff --git a/debian/patches/features/all/rt/0172-rtmutex-futex-prepare-rt.patch.patch b/debian/patches/features/all/rt/rtmutex-futex-prepare-rt.patch similarity index 80% rename from debian/patches/features/all/rt/0172-rtmutex-futex-prepare-rt.patch.patch rename to debian/patches/features/all/rt/rtmutex-futex-prepare-rt.patch index 0b7170150..2c0a84da8 100644 --- a/debian/patches/features/all/rt/0172-rtmutex-futex-prepare-rt.patch.patch +++ b/debian/patches/features/all/rt/rtmutex-futex-prepare-rt.patch @@ -1,19 +1,18 @@ -From 360ec2bb1bda440032020cd8a0ba02fffde8e3fc Mon Sep 17 00:00:00 2001 +Subject: rtmutex-futex-prepare-rt.patch From: Thomas Gleixner Date: Fri, 10 Jun 2011 11:04:15 +0200 -Subject: [172/256] rtmutex-futex-prepare-rt.patch Signed-off-by: Thomas Gleixner --- - kernel/futex.c | 77 ++++++++++++++++++++++++++++++++++++++--------- + kernel/futex.c | 77 ++++++++++++++++++++++++++++++++++++++---------- kernel/rtmutex.c | 31 ++++++++++++++++--- - kernel/rtmutex_common.h | 2 ++ + kernel/rtmutex_common.h | 2 + 3 files changed, 91 insertions(+), 19 deletions(-) -diff --git a/kernel/futex.c b/kernel/futex.c -index e2b0fb9..9decb1c 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c +Index: linux-stable/kernel/futex.c +=================================================================== +--- linux-stable.orig/kernel/futex.c ++++ linux-stable/kernel/futex.c @@ -1423,6 +1423,16 @@ retry_private: requeue_pi_wake_futex(this, &key2, hb2); drop_count++; @@ -31,7 +30,7 @@ index e2b0fb9..9decb1c 100644 } else if (ret) { /* -EDEADLK */ this->pi_state = NULL; -@@ -2267,7 +2277,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, +@@ -2267,7 +2277,7 @@ static int futex_wait_requeue_pi(u32 __u struct hrtimer_sleeper timeout, *to = NULL; struct rt_mutex_waiter rt_waiter; struct rt_mutex *pi_mutex = NULL; @@ -40,7 +39,7 @@ index e2b0fb9..9decb1c 100644 union futex_key key2 = FUTEX_KEY_INIT; struct futex_q q = futex_q_init; int res, ret; -@@ -2311,20 +2321,55 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, +@@ -2314,20 +2324,55 @@ static int futex_wait_requeue_pi(u32 __u /* Queue the futex_q, drop the hb lock, wait for wakeup. */ futex_wait_queue_me(hb, &q, to); @@ -107,7 +106,7 @@ index e2b0fb9..9decb1c 100644 /* Check if the requeue code acquired the second futex for us. */ if (!q.rt_waiter) { -@@ -2333,9 +2378,10 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, +@@ -2336,9 +2381,10 @@ static int futex_wait_requeue_pi(u32 __u * did a lock-steal - fix up the PI-state in that case. */ if (q.pi_state && (q.pi_state->owner != current)) { @@ -120,7 +119,7 @@ index e2b0fb9..9decb1c 100644 } } else { /* -@@ -2348,7 +2394,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, +@@ -2351,7 +2397,8 @@ static int futex_wait_requeue_pi(u32 __u ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter, 1); debug_rt_mutex_free_waiter(&rt_waiter); @@ -130,11 +129,11 @@ index e2b0fb9..9decb1c 100644 /* * Fixup the pi_state owner and possibly acquire the lock if we * haven't already. -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index f641ce9..1e98e24 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c -@@ -67,6 +67,11 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) +Index: linux-stable/kernel/rtmutex.c +=================================================================== +--- linux-stable.orig/kernel/rtmutex.c ++++ linux-stable/kernel/rtmutex.c +@@ -67,6 +67,11 @@ static void fixup_rt_mutex_waiters(struc clear_rt_mutex_waiters(lock); } @@ -146,7 +145,7 @@ index f641ce9..1e98e24 100644 /* * We can speed up the acquire/release, if the architecture * supports cmpxchg and if there's no debugging state to be set up -@@ -196,7 +201,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, +@@ -196,7 +201,7 @@ static int rt_mutex_adjust_prio_chain(st * reached or the state of the chain has changed while we * dropped the locks. */ @@ -155,7 +154,7 @@ index f641ce9..1e98e24 100644 goto out_unlock_pi; /* -@@ -399,6 +404,23 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, +@@ -399,6 +404,23 @@ static int task_blocks_on_rt_mutex(struc int chain_walk = 0, res; raw_spin_lock_irqsave(&task->pi_lock, flags); @@ -179,7 +178,7 @@ index f641ce9..1e98e24 100644 __rt_mutex_adjust_prio(task); waiter->task = task; waiter->lock = lock; -@@ -423,7 +445,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, +@@ -423,7 +445,7 @@ static int task_blocks_on_rt_mutex(struc plist_add(&waiter->pi_list_entry, &owner->pi_waiters); __rt_mutex_adjust_prio(owner); @@ -188,7 +187,7 @@ index f641ce9..1e98e24 100644 chain_walk = 1; raw_spin_unlock_irqrestore(&owner->pi_lock, flags); } -@@ -517,7 +539,7 @@ static void remove_waiter(struct rt_mutex *lock, +@@ -517,7 +539,7 @@ static void remove_waiter(struct rt_mute } __rt_mutex_adjust_prio(owner); @@ -197,7 +196,7 @@ index f641ce9..1e98e24 100644 chain_walk = 1; raw_spin_unlock_irqrestore(&owner->pi_lock, flags); -@@ -551,7 +573,8 @@ void rt_mutex_adjust_pi(struct task_struct *task) +@@ -551,7 +573,8 @@ void rt_mutex_adjust_pi(struct task_stru raw_spin_lock_irqsave(&task->pi_lock, flags); waiter = task->pi_blocked_on; @@ -207,11 +206,11 @@ index f641ce9..1e98e24 100644 raw_spin_unlock_irqrestore(&task->pi_lock, flags); return; } -diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h -index 53a66c8..b43d832 100644 ---- a/kernel/rtmutex_common.h -+++ b/kernel/rtmutex_common.h -@@ -103,6 +103,8 @@ static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock) +Index: linux-stable/kernel/rtmutex_common.h +=================================================================== +--- linux-stable.orig/kernel/rtmutex_common.h ++++ linux-stable/kernel/rtmutex_common.h +@@ -103,6 +103,8 @@ static inline struct task_struct *rt_mut /* * PI-futex support (proxy locking functions, etc.): */ diff --git a/debian/patches/features/all/rt/0171-rtmutex-lock-killable.patch.patch b/debian/patches/features/all/rt/rtmutex-lock-killable.patch similarity index 79% rename from debian/patches/features/all/rt/0171-rtmutex-lock-killable.patch.patch rename to debian/patches/features/all/rt/rtmutex-lock-killable.patch index ebd062f93..828da23d7 100644 --- a/debian/patches/features/all/rt/0171-rtmutex-lock-killable.patch.patch +++ b/debian/patches/features/all/rt/rtmutex-lock-killable.patch @@ -1,7 +1,6 @@ -From 19ba6a96866ef2762878a0e3a4741570aab52aa2 Mon Sep 17 00:00:00 2001 +Subject: rtmutex-lock-killable.patch From: Thomas Gleixner -Date: Thu, 9 Jun 2011 11:43:52 +0200 -Subject: [171/256] rtmutex-lock-killable.patch +Date: Thu, 09 Jun 2011 11:43:52 +0200 Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/rtmutex.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index de17134..3561eb2 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -90,6 +90,7 @@ extern void rt_mutex_destroy(struct rt_mutex *lock); +Index: linux-stable/include/linux/rtmutex.h +=================================================================== +--- linux-stable.orig/include/linux/rtmutex.h ++++ linux-stable/include/linux/rtmutex.h +@@ -90,6 +90,7 @@ extern void rt_mutex_destroy(struct rt_m extern void rt_mutex_lock(struct rt_mutex *lock); extern int rt_mutex_lock_interruptible(struct rt_mutex *lock, int detect_deadlock); @@ -21,10 +20,10 @@ index de17134..3561eb2 100644 extern int rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout, int detect_deadlock); -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index a242e69..f641ce9 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c +Index: linux-stable/kernel/rtmutex.c +=================================================================== +--- linux-stable.orig/kernel/rtmutex.c ++++ linux-stable/kernel/rtmutex.c @@ -791,12 +791,12 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock); /** * rt_mutex_lock_interruptible - lock a rt_mutex interruptible @@ -41,7 +40,7 @@ index a242e69..f641ce9 100644 * -EDEADLK when the lock would deadlock (when deadlock detection is on) */ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock, -@@ -810,17 +810,38 @@ int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock, +@@ -810,17 +810,38 @@ int __sched rt_mutex_lock_interruptible( EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); /** diff --git a/debian/patches/features/all/rt/0179-rwsem-add-rt-variant.patch.patch b/debian/patches/features/all/rt/rwsem-add-rt-variant.patch similarity index 82% rename from debian/patches/features/all/rt/0179-rwsem-add-rt-variant.patch.patch rename to debian/patches/features/all/rt/rwsem-add-rt-variant.patch index 3ff8acc80..e192641af 100644 --- a/debian/patches/features/all/rt/0179-rwsem-add-rt-variant.patch.patch +++ b/debian/patches/features/all/rt/rwsem-add-rt-variant.patch @@ -1,20 +1,18 @@ -From c1daad4c6bc6fc32b5b82b388d9217375f65ab6a Mon Sep 17 00:00:00 2001 +Subject: rwsem-add-rt-variant.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 21:02:53 +0200 -Subject: [179/256] rwsem-add-rt-variant.patch Signed-off-by: Thomas Gleixner --- - include/linux/rwsem.h | 6 +++ - include/linux/rwsem_rt.h | 105 ++++++++++++++++++++++++++++++++++++++++++++++ - lib/Makefile | 3 ++ + include/linux/rwsem.h | 6 ++ + include/linux/rwsem_rt.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++ + lib/Makefile | 3 + 3 files changed, 114 insertions(+) - create mode 100644 include/linux/rwsem_rt.h -diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h -index 54bd7cd..3f7df4a 100644 ---- a/include/linux/rwsem.h -+++ b/include/linux/rwsem.h +Index: linux-stable/include/linux/rwsem.h +=================================================================== +--- linux-stable.orig/include/linux/rwsem.h ++++ linux-stable/include/linux/rwsem.h @@ -16,6 +16,10 @@ #include @@ -26,18 +24,17 @@ index 54bd7cd..3f7df4a 100644 struct rw_semaphore; #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK -@@ -130,4 +134,6 @@ extern void down_write_nested(struct rw_semaphore *sem, int subclass); +@@ -130,4 +134,6 @@ extern void down_write_nested(struct rw_ # define down_write_nested(sem, subclass) down_write(sem) #endif +#endif /* !PREEMPT_RT_FULL */ + #endif /* _LINUX_RWSEM_H */ -diff --git a/include/linux/rwsem_rt.h b/include/linux/rwsem_rt.h -new file mode 100644 -index 0000000..802c690 +Index: linux-stable/include/linux/rwsem_rt.h +=================================================================== --- /dev/null -+++ b/include/linux/rwsem_rt.h ++++ linux-stable/include/linux/rwsem_rt.h @@ -0,0 +1,105 @@ +#ifndef _LINUX_RWSEM_RT_H +#define _LINUX_RWSEM_RT_H @@ -144,11 +141,11 @@ index 0000000..802c690 +} + +#endif -diff --git a/lib/Makefile b/lib/Makefile -index 18515f0..a8da407 100644 ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -38,8 +38,11 @@ obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o +Index: linux-stable/lib/Makefile +=================================================================== +--- linux-stable.orig/lib/Makefile ++++ linux-stable/lib/Makefile +@@ -38,8 +38,11 @@ obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o diff --git a/debian/patches/features/all/rt/sched-better-debug-output-for-might-sleep.patch b/debian/patches/features/all/rt/sched-better-debug-output-for-might-sleep.patch new file mode 100644 index 000000000..471a05c0e --- /dev/null +++ b/debian/patches/features/all/rt/sched-better-debug-output-for-might-sleep.patch @@ -0,0 +1,76 @@ +Subject: sched: Better debug output for might sleep +From: Thomas Gleixner +Date: Fri, 05 Oct 2012 08:56:15 +0100 + +might sleep can tell us where interrupts have been disabled, but we +have no idea what disabled preemption. Add some debug infrastructure. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 4 ++++ + kernel/sched/core.c | 23 +++++++++++++++++++++-- + 2 files changed, 25 insertions(+), 2 deletions(-) + +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1624,6 +1624,10 @@ struct task_struct { + int kmap_idx; + pte_t kmap_pte[KM_TYPE_NR]; + #endif ++ ++#ifdef CONFIG_DEBUG_PREEMPT ++ unsigned long preempt_disable_ip; ++#endif + }; + + #ifdef CONFIG_PREEMPT_RT_FULL +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3311,8 +3311,13 @@ void __kprobes add_preempt_count(int val + DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >= + PREEMPT_MASK - 10); + #endif +- if (preempt_count() == val) +- trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1)); ++ if (preempt_count() == val) { ++ unsigned long ip = get_parent_ip(CALLER_ADDR1); ++#ifdef CONFIG_DEBUG_PREEMPT ++ current->preempt_disable_ip = ip; ++#endif ++ trace_preempt_off(CALLER_ADDR0, ip); ++ } + } + EXPORT_SYMBOL(add_preempt_count); + +@@ -3355,6 +3360,13 @@ static noinline void __schedule_bug(stru + print_modules(); + if (irqs_disabled()) + print_irqtrace_events(prev); ++#ifdef DEBUG_PREEMPT ++ if (in_atomic_preempt_off()) { ++ pr_err("Preemption disabled at:"); ++ print_ip_sym(current->preempt_disable_ip); ++ pr_cont("\n"); ++ } ++#endif + dump_stack(); + add_taint(TAINT_WARN); + } +@@ -7700,6 +7712,13 @@ void __might_sleep(const char *file, int + debug_show_held_locks(current); + if (irqs_disabled()) + print_irqtrace_events(current); ++#ifdef DEBUG_PREEMPT ++ if (!preempt_count_equals(preempt_offset)) { ++ pr_err("Preemption disabled at:"); ++ print_ip_sym(current->preempt_disable_ip); ++ pr_cont("\n"); ++ } ++#endif + dump_stack(); + } + EXPORT_SYMBOL(__might_sleep); diff --git a/debian/patches/features/all/rt/0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch b/debian/patches/features/all/rt/sched-clear-pf-thread-bound-on-fallback-rq.patch similarity index 52% rename from debian/patches/features/all/rt/0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch rename to debian/patches/features/all/rt/sched-clear-pf-thread-bound-on-fallback-rq.patch index bdf326d2b..82f7bf2f6 100644 --- a/debian/patches/features/all/rt/0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch +++ b/debian/patches/features/all/rt/sched-clear-pf-thread-bound-on-fallback-rq.patch @@ -1,18 +1,17 @@ -From 1ce97be705d59baa210b67744f1145ee3d6259fb Mon Sep 17 00:00:00 2001 +Subject: sched-clear-pf-thread-bound-on-fallback-rq.patch From: Thomas Gleixner -Date: Fri, 4 Nov 2011 20:48:36 +0100 -Subject: [154/256] sched-clear-pf-thread-bound-on-fallback-rq.patch +Date: Fri, 04 Nov 2011 20:48:36 +0100 Signed-off-by: Thomas Gleixner --- kernel/sched/core.c | 6 ++++++ 1 file changed, 6 insertions(+) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 8afb5e9..599cc25 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1325,6 +1325,12 @@ out: +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -1323,6 +1323,12 @@ out: } } diff --git a/debian/patches/features/all/rt/0129-sched-cond-resched.patch.patch b/debian/patches/features/all/rt/sched-cond-resched.patch similarity index 63% rename from debian/patches/features/all/rt/0129-sched-cond-resched.patch.patch rename to debian/patches/features/all/rt/sched-cond-resched.patch index b2020899f..01b1f8463 100644 --- a/debian/patches/features/all/rt/0129-sched-cond-resched.patch.patch +++ b/debian/patches/features/all/rt/sched-cond-resched.patch @@ -1,18 +1,17 @@ -From 1aa975279d4a5596e082534477783a3961a32c62 Mon Sep 17 00:00:00 2001 +Subject: sched-cond-resched.patch From: Thomas Gleixner -Date: Tue, 7 Jun 2011 11:25:03 +0200 -Subject: [129/256] sched-cond-resched.patch +Date: Tue, 07 Jun 2011 11:25:03 +0200 Signed-off-by: Thomas Gleixner --- kernel/sched/core.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 7fd59a2..dbe9a7d 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4554,9 +4554,17 @@ static inline int should_resched(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -4781,9 +4781,17 @@ static inline int should_resched(void) static void __cond_resched(void) { diff --git a/debian/patches/features/all/rt/0124-sched-delay-put-task.patch.patch b/debian/patches/features/all/rt/sched-delay-put-task.patch similarity index 66% rename from debian/patches/features/all/rt/0124-sched-delay-put-task.patch.patch rename to debian/patches/features/all/rt/sched-delay-put-task.patch index 1a222f4e2..96ebac0c7 100644 --- a/debian/patches/features/all/rt/0124-sched-delay-put-task.patch.patch +++ b/debian/patches/features/all/rt/sched-delay-put-task.patch @@ -1,7 +1,6 @@ -From 1d69cb2f49e57b61483843705efd9cfdc4471f53 Mon Sep 17 00:00:00 2001 +Subject: sched-delay-put-task.patch From: Thomas Gleixner Date: Tue, 31 May 2011 16:59:16 +0200 -Subject: [124/256] sched-delay-put-task.patch Signed-off-by: Thomas Gleixner --- @@ -9,13 +8,13 @@ Signed-off-by: Thomas Gleixner kernel/fork.c | 11 +++++++++++ 2 files changed, 24 insertions(+) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index b997506..0fbffda 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1635,6 +1635,9 @@ struct task_struct { - #ifdef CONFIG_HAVE_HW_BREAKPOINT - atomic_t ptrace_bp_refcnt; +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1607,6 +1607,9 @@ struct task_struct { + #ifdef CONFIG_UPROBES + struct uprobe_task *utask; #endif +#ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head put_rcu; @@ -23,7 +22,7 @@ index b997506..0fbffda 100644 }; /* Future-safe accessor for struct task_struct's cpus_allowed. */ -@@ -1819,6 +1822,15 @@ extern struct pid *cad_pid; +@@ -1791,6 +1794,15 @@ extern struct pid *cad_pid; extern void free_task(struct task_struct *tsk); #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) @@ -39,7 +38,7 @@ index b997506..0fbffda 100644 extern void __put_task_struct(struct task_struct *t); static inline void put_task_struct(struct task_struct *t) -@@ -1826,6 +1838,7 @@ static inline void put_task_struct(struct task_struct *t) +@@ -1798,6 +1810,7 @@ static inline void put_task_struct(struc if (atomic_dec_and_test(&t->usage)) __put_task_struct(t); } @@ -47,11 +46,11 @@ index b997506..0fbffda 100644 extern void task_times(struct task_struct *p, cputime_t *ut, cputime_t *st); extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *st); -diff --git a/kernel/fork.c b/kernel/fork.c -index 45a45b7..e13be8a 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -202,7 +202,18 @@ void __put_task_struct(struct task_struct *tsk) +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -244,7 +244,18 @@ void __put_task_struct(struct task_struc if (!profile_handoff_task(tsk)) free_task(tsk); } @@ -68,5 +67,5 @@ index 45a45b7..e13be8a 100644 +EXPORT_SYMBOL_GPL(__put_task_struct_cb); +#endif - /* - * macro override instead of weak attribute alias, to workaround + void __init __weak arch_task_cache_init(void) { } + diff --git a/debian/patches/features/all/rt/0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch b/debian/patches/features/all/rt/sched-disable-rt-group-sched-on-rt.patch similarity index 72% rename from debian/patches/features/all/rt/0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch rename to debian/patches/features/all/rt/sched-disable-rt-group-sched-on-rt.patch index acc6a4cb5..da5e0933e 100644 --- a/debian/patches/features/all/rt/0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch +++ b/debian/patches/features/all/rt/sched-disable-rt-group-sched-on-rt.patch @@ -1,7 +1,6 @@ -From de9fd92b8ecd080a473c9a42c46613124cd30aff Mon Sep 17 00:00:00 2001 +Subject: sched: Disable CONFIG_RT_GROUP_SCHED on RT From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:03:52 +0200 -Subject: [133/256] sched: Disable CONFIG_RT_GROUP_SCHED on RT Carsten reported problems when running: @@ -17,11 +16,11 @@ Signed-off-by: Thomas Gleixner init/Kconfig | 1 + 1 file changed, 1 insertion(+) -diff --git a/init/Kconfig b/init/Kconfig -index 7c0b369..c06208b 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -746,6 +746,7 @@ config RT_GROUP_SCHED +Index: linux-stable/init/Kconfig +=================================================================== +--- linux-stable.orig/init/Kconfig ++++ linux-stable/init/Kconfig +@@ -806,6 +806,7 @@ config RT_GROUP_SCHED bool "Group scheduling for SCHED_RR/FIFO" depends on EXPERIMENTAL depends on CGROUP_SCHED diff --git a/debian/patches/features/all/rt/0132-sched-disable-ttwu-queue.patch.patch b/debian/patches/features/all/rt/sched-disable-ttwu-queue.patch similarity index 69% rename from debian/patches/features/all/rt/0132-sched-disable-ttwu-queue.patch.patch rename to debian/patches/features/all/rt/sched-disable-ttwu-queue.patch index 97f0a74df..276b75e62 100644 --- a/debian/patches/features/all/rt/0132-sched-disable-ttwu-queue.patch.patch +++ b/debian/patches/features/all/rt/sched-disable-ttwu-queue.patch @@ -1,17 +1,16 @@ -From fb8f00d3e186dd2fbe684e86a24cf5099399ecae Mon Sep 17 00:00:00 2001 +Subject: sched-disable-ttwu-queue.patch From: Thomas Gleixner Date: Tue, 13 Sep 2011 16:42:35 +0200 -Subject: [132/256] sched-disable-ttwu-queue.patch Signed-off-by: Thomas Gleixner --- kernel/sched/features.h | 4 ++++ 1 file changed, 4 insertions(+) -diff --git a/kernel/sched/features.h b/kernel/sched/features.h -index de00a48..27afd1e 100644 ---- a/kernel/sched/features.h -+++ b/kernel/sched/features.h +Index: linux-stable/kernel/sched/features.h +=================================================================== +--- linux-stable.orig/kernel/sched/features.h ++++ linux-stable/kernel/sched/features.h @@ -60,11 +60,15 @@ SCHED_FEAT(OWNER_SPIN, true) */ SCHED_FEAT(NONTASK_POWER, true) diff --git a/debian/patches/features/all/rt/0125-sched-limit-nr-migrate.patch.patch b/debian/patches/features/all/rt/sched-limit-nr-migrate.patch similarity index 65% rename from debian/patches/features/all/rt/0125-sched-limit-nr-migrate.patch.patch rename to debian/patches/features/all/rt/sched-limit-nr-migrate.patch index 6f58e3901..2eca354ea 100644 --- a/debian/patches/features/all/rt/0125-sched-limit-nr-migrate.patch.patch +++ b/debian/patches/features/all/rt/sched-limit-nr-migrate.patch @@ -1,17 +1,16 @@ -From 784b804e6ec857d95df910f424252632126fcf11 Mon Sep 17 00:00:00 2001 +Subject: sched-limit-nr-migrate.patch From: Thomas Gleixner -Date: Mon, 6 Jun 2011 12:12:51 +0200 -Subject: [125/256] sched-limit-nr-migrate.patch +Date: Mon, 06 Jun 2011 12:12:51 +0200 Signed-off-by: Thomas Gleixner --- kernel/sched/core.c | 4 ++++ 1 file changed, 4 insertions(+) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index bf42b7d..c0e6a70 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c @@ -263,7 +263,11 @@ late_initcall(sched_init_debug); * Number of tasks to iterate in a single balance run. * Limited because this is done with IRQs disabled. diff --git a/debian/patches/features/all/rt/0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch b/debian/patches/features/all/rt/sched-might-sleep-do-not-account-rcu-depth.patch similarity index 61% rename from debian/patches/features/all/rt/0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch rename to debian/patches/features/all/rt/sched-might-sleep-do-not-account-rcu-depth.patch index a754872b1..12c5373b6 100644 --- a/debian/patches/features/all/rt/0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch +++ b/debian/patches/features/all/rt/sched-might-sleep-do-not-account-rcu-depth.patch @@ -1,7 +1,6 @@ -From 15ae181ec2b59ad4bbd5f54bee6fbd68bd9358b3 Mon Sep 17 00:00:00 2001 +Subject: sched-might-sleep-do-not-account-rcu-depth.patch From: Thomas Gleixner -Date: Tue, 7 Jun 2011 09:19:06 +0200 -Subject: [128/256] sched-might-sleep-do-not-account-rcu-depth.patch +Date: Tue, 07 Jun 2011 09:19:06 +0200 Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/sched/core.c | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index 20fb776..23a500f 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -156,6 +156,11 @@ void synchronize_rcu(void); +Index: linux-stable/include/linux/rcupdate.h +=================================================================== +--- linux-stable.orig/include/linux/rcupdate.h ++++ linux-stable/include/linux/rcupdate.h +@@ -157,6 +157,11 @@ void synchronize_rcu(void); * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. */ #define rcu_preempt_depth() (current->rcu_read_lock_nesting) @@ -25,7 +24,7 @@ index 20fb776..23a500f 100644 #else /* #ifdef CONFIG_PREEMPT_RCU */ -@@ -179,6 +184,8 @@ static inline int rcu_preempt_depth(void) +@@ -180,6 +185,8 @@ static inline int rcu_preempt_depth(void return 0; } @@ -34,11 +33,11 @@ index 20fb776..23a500f 100644 #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ /* Internal to kernel */ -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 720783a..7fd59a2 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -7091,7 +7091,8 @@ void __init sched_init(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -7450,7 +7450,8 @@ void __init sched_init(void) #ifdef CONFIG_DEBUG_ATOMIC_SLEEP static inline int preempt_count_equals(int preempt_offset) { diff --git a/debian/patches/features/all/rt/0141-sched-migrate-disable.patch.patch b/debian/patches/features/all/rt/sched-migrate-disable.patch similarity index 68% rename from debian/patches/features/all/rt/0141-sched-migrate-disable.patch.patch rename to debian/patches/features/all/rt/sched-migrate-disable.patch index 22b40823b..cdd15f1d5 100644 --- a/debian/patches/features/all/rt/0141-sched-migrate-disable.patch.patch +++ b/debian/patches/features/all/rt/sched-migrate-disable.patch @@ -1,21 +1,19 @@ -From 02cf9f02bdf247447eb54ded7fefa843d4ea4628 Mon Sep 17 00:00:00 2001 +Subject: sched-migrate-disable.patch From: Thomas Gleixner Date: Thu, 16 Jun 2011 13:26:08 +0200 -Subject: [141/256] sched-migrate-disable.patch Signed-off-by: Thomas Gleixner --- - include/linux/preempt.h | 8 +++++ + include/linux/preempt.h | 8 ++++ include/linux/sched.h | 13 +++++-- - include/linux/smp.h | 1 - - kernel/sched/core.c | 88 ++++++++++++++++++++++++++++++++++++++++++++--- - lib/smp_processor_id.c | 6 ++-- - 5 files changed, 104 insertions(+), 12 deletions(-) + kernel/sched/core.c | 88 +++++++++++++++++++++++++++++++++++++++++++++--- + lib/smp_processor_id.c | 6 +-- + 4 files changed, 104 insertions(+), 11 deletions(-) -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 5b46536..c5d2a36 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h +Index: linux-stable/include/linux/preempt.h +=================================================================== +--- linux-stable.orig/include/linux/preempt.h ++++ linux-stable/include/linux/preempt.h @@ -108,6 +108,14 @@ do { \ #endif /* CONFIG_PREEMPT_COUNT */ @@ -31,19 +29,19 @@ index 5b46536..c5d2a36 100644 #ifdef CONFIG_PREEMPT_RT_FULL # define preempt_disable_rt() preempt_disable() # define preempt_enable_rt() preempt_enable() -diff --git a/include/linux/sched.h b/include/linux/sched.h -index cdfc16e..c5f690a 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1302,6 +1302,7 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1275,6 +1275,7 @@ struct task_struct { #endif unsigned int policy; + int migrate_disable; + int nr_cpus_allowed; cpumask_t cpus_allowed; - #ifdef CONFIG_PREEMPT_RCU -@@ -1642,9 +1643,6 @@ struct task_struct { +@@ -1614,9 +1615,6 @@ struct task_struct { #endif }; @@ -53,7 +51,7 @@ index cdfc16e..c5f690a 100644 #ifdef CONFIG_PREEMPT_RT_FULL static inline bool cur_pf_disabled(void) { return current->pagefault_disabled; } #else -@@ -2773,6 +2771,15 @@ static inline void set_task_cpu(struct task_struct *p, unsigned int cpu) +@@ -2773,6 +2771,15 @@ static inline void set_task_cpu(struct t #endif /* CONFIG_SMP */ @@ -69,23 +67,11 @@ index cdfc16e..c5f690a 100644 extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); extern long sched_getaffinity(pid_t pid, struct cpumask *mask); -diff --git a/include/linux/smp.h b/include/linux/smp.h -index 04e7ed9..980c525 100644 ---- a/include/linux/smp.h -+++ b/include/linux/smp.h -@@ -80,7 +80,6 @@ void __smp_call_function_single(int cpuid, struct call_single_data *data, - - int smp_call_function_any(const struct cpumask *mask, - smp_call_func_t func, void *info, int wait); -- - /* - * Generic and arch helpers - */ -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index d591b69..42efb3c 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4976,11 +4976,12 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -5203,11 +5203,12 @@ void __cpuinit init_idle(struct task_str #ifdef CONFIG_SMP void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) { @@ -95,14 +81,14 @@ index d591b69..42efb3c 100644 + if (!p->migrate_disable) { + if (p->sched_class && p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, new_mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(new_mask); ++ p->nr_cpus_allowed = cpumask_weight(new_mask); + } cpumask_copy(&p->cpus_allowed, new_mask); -- p->rt.nr_cpus_allowed = cpumask_weight(new_mask); +- p->nr_cpus_allowed = cpumask_weight(new_mask); } /* -@@ -5031,7 +5032,7 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) +@@ -5258,7 +5259,7 @@ int set_cpus_allowed_ptr(struct task_str do_set_cpus_allowed(p, new_mask); /* Can the task run on the task's current CPU? If so, we're done */ @@ -111,7 +97,7 @@ index d591b69..42efb3c 100644 goto out; dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); -@@ -5050,6 +5051,83 @@ out: +@@ -5277,6 +5278,83 @@ out: } EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); @@ -144,7 +130,7 @@ index d591b69..42efb3c 100644 + if (!cpumask_equal(&p->cpus_allowed, mask)) { + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); + } + task_rq_unlock(rq, p, &flags); + preempt_enable(); @@ -183,7 +169,7 @@ index d591b69..42efb3c 100644 + if (!cpumask_equal(&p->cpus_allowed, mask)) { + if (p->sched_class->set_cpus_allowed) + p->sched_class->set_cpus_allowed(p, mask); -+ p->rt.nr_cpus_allowed = cpumask_weight(mask); ++ p->nr_cpus_allowed = cpumask_weight(mask); + } + + task_rq_unlock(rq, p, &flags); @@ -195,11 +181,11 @@ index d591b69..42efb3c 100644 /* * Move (not current) task off this cpu, onto dest cpu. We're doing * this because either it can't run here any more (set_cpus_allowed() -diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c -index 4c0d0e5..0a846e7 100644 ---- a/lib/smp_processor_id.c -+++ b/lib/smp_processor_id.c -@@ -39,9 +39,9 @@ notrace unsigned int debug_smp_processor_id(void) +Index: linux-stable/lib/smp_processor_id.c +=================================================================== +--- linux-stable.orig/lib/smp_processor_id.c ++++ linux-stable/lib/smp_processor_id.c +@@ -39,9 +39,9 @@ notrace unsigned int debug_smp_processor if (!printk_ratelimit()) goto out_enable; diff --git a/debian/patches/features/all/rt/0126-sched-mmdrop-delayed.patch.patch b/debian/patches/features/all/rt/sched-mmdrop-delayed.patch similarity index 67% rename from debian/patches/features/all/rt/0126-sched-mmdrop-delayed.patch.patch rename to debian/patches/features/all/rt/sched-mmdrop-delayed.patch index 93f4c8d0f..a007da918 100644 --- a/debian/patches/features/all/rt/0126-sched-mmdrop-delayed.patch.patch +++ b/debian/patches/features/all/rt/sched-mmdrop-delayed.patch @@ -1,7 +1,6 @@ -From 585fd2cf2eb2cc2f1af23a454fceb6331921c0b8 Mon Sep 17 00:00:00 2001 +Subject: sched-mmdrop-delayed.patch From: Thomas Gleixner -Date: Mon, 6 Jun 2011 12:20:33 +0200 -Subject: [126/256] sched-mmdrop-delayed.patch +Date: Mon, 06 Jun 2011 12:20:33 +0200 Needs thread context (pgd_lock) -> ifdeffed. workqueues wont work with RT @@ -11,36 +10,36 @@ Signed-off-by: Thomas Gleixner include/linux/mm_types.h | 4 ++++ include/linux/sched.h | 12 ++++++++++++ kernel/fork.c | 15 ++++++++++++++- - kernel/sched/core.c | 21 +++++++++++++++++++-- - 4 files changed, 49 insertions(+), 3 deletions(-) + kernel/sched/core.c | 19 +++++++++++++++++-- + 4 files changed, 47 insertions(+), 3 deletions(-) -diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h -index e70ea9b..8574996 100644 ---- a/include/linux/mm_types.h -+++ b/include/linux/mm_types.h +Index: linux-stable/include/linux/mm_types.h +=================================================================== +--- linux-stable.orig/include/linux/mm_types.h ++++ linux-stable/include/linux/mm_types.h @@ -12,6 +12,7 @@ #include #include #include +#include + #include #include #include - -@@ -392,6 +393,9 @@ struct mm_struct { - #ifdef CONFIG_CPUMASK_OFFSTACK +@@ -409,6 +410,9 @@ struct mm_struct { struct cpumask cpumask_allocation; #endif + struct uprobes_state uprobes_state; +#ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head delayed_drop; +#endif }; static inline void mm_init_cpumask(struct mm_struct *mm) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 0fbffda..a198e77 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -2324,12 +2324,24 @@ extern struct mm_struct * mm_alloc(void); +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -2324,12 +2324,24 @@ extern struct mm_struct * mm_alloc(void) /* mmdrop drops the mm and the page tables */ extern void __mmdrop(struct mm_struct *); @@ -65,11 +64,11 @@ index 0fbffda..a198e77 100644 /* mmput gets rid of the mappings and all user-space */ extern void mmput(struct mm_struct *); /* Grab a reference to a task's mm, if it is not already going away */ -diff --git a/kernel/fork.c b/kernel/fork.c -index e13be8a..e6cf9db 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -207,7 +207,7 @@ EXPORT_SYMBOL_GPL(__put_task_struct); +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -249,7 +249,7 @@ EXPORT_SYMBOL_GPL(__put_task_struct); #else void __put_task_struct_cb(struct rcu_head *rhp) { @@ -78,7 +77,7 @@ index e13be8a..e6cf9db 100644 __put_task_struct(tsk); -@@ -574,6 +574,19 @@ void __mmdrop(struct mm_struct *mm) +@@ -608,6 +608,19 @@ void __mmdrop(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(__mmdrop); @@ -98,11 +97,11 @@ index e13be8a..e6cf9db 100644 /* * Decrement the use count and release all resources for an mm. */ -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index c0e6a70..f491ef7 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1934,8 +1934,12 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -1970,8 +1970,12 @@ static void finish_task_switch(struct rq finish_arch_post_lock_switch(); fire_sched_in_preempt_notifiers(current); @@ -116,7 +115,7 @@ index c0e6a70..f491ef7 100644 if (unlikely(prev_state == TASK_DEAD)) { /* * Remove function-return probe instances associated with this -@@ -5075,6 +5079,8 @@ static int migration_cpu_stop(void *data) +@@ -5302,6 +5306,8 @@ static int migration_cpu_stop(void *data #ifdef CONFIG_HOTPLUG_CPU @@ -125,7 +124,7 @@ index c0e6a70..f491ef7 100644 /* * Ensures that the idle task is using init_mm right before its cpu goes * offline. -@@ -5087,7 +5093,12 @@ void idle_task_exit(void) +@@ -5314,7 +5320,12 @@ void idle_task_exit(void) if (mm != &init_mm) switch_mm(mm, &init_mm, current); @@ -139,16 +138,14 @@ index c0e6a70..f491ef7 100644 } /* -@@ -5408,6 +5419,12 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) - migrate_nr_uninterruptible(rq); - calc_global_load_remove(rq); - break; -+ case CPU_DEAD: +@@ -5622,6 +5633,10 @@ migration_call(struct notifier_block *nf + + case CPU_DEAD: + calc_load_migrate(rq); + if (per_cpu(idle_last_mm, cpu)) { + mmdrop(per_cpu(idle_last_mm, cpu)); + per_cpu(idle_last_mm, cpu) = NULL; + } -+ break; + break; #endif } - diff --git a/debian/patches/features/all/rt/0149-sched-rt-Fix-migrate_enable-thinko.patch b/debian/patches/features/all/rt/sched-rt-fix-migrate_enable-thinko.patch similarity index 66% rename from debian/patches/features/all/rt/0149-sched-rt-Fix-migrate_enable-thinko.patch rename to debian/patches/features/all/rt/sched-rt-fix-migrate_enable-thinko.patch index 97f46438c..76fabf4b0 100644 --- a/debian/patches/features/all/rt/0149-sched-rt-Fix-migrate_enable-thinko.patch +++ b/debian/patches/features/all/rt/sched-rt-fix-migrate_enable-thinko.patch @@ -1,7 +1,6 @@ -From 7a11a2f07de6f75b3bd692921dea4f8ea611affd Mon Sep 17 00:00:00 2001 +Subject: sched, rt: Fix migrate_enable() thinko From: Mike Galbraith Date: Tue, 23 Aug 2011 16:12:43 +0200 -Subject: [149/256] sched, rt: Fix migrate_enable() thinko Assigning mask = tsk_cpus_allowed(p) after p->migrate_disable = 0 ensures that we won't see a mask change.. no push/pull, we stack tasks on one CPU. @@ -15,16 +14,17 @@ Cc: Paul E. McKenney Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1314108763.6689.4.camel@marge.simson.net Signed-off-by: Thomas Gleixner + --- kernel/sched/core.c | 4 +++- kernel/sched/debug.c | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 954dfa9..06b99e1 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -5128,12 +5128,14 @@ void migrate_enable(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -5355,12 +5355,14 @@ void migrate_enable(void) */ rq = this_rq(); raw_spin_lock_irqsave(&rq->lock, flags); @@ -39,12 +39,12 @@ index 954dfa9..06b99e1 100644 + mask = tsk_cpus_allowed(p); if (p->sched_class->set_cpus_allowed) p->sched_class->set_cpus_allowed(p, mask); - p->rt.nr_cpus_allowed = cpumask_weight(mask); -diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c -index 09acaa1..451512ff 100644 ---- a/kernel/sched/debug.c -+++ b/kernel/sched/debug.c -@@ -237,6 +237,9 @@ void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq) + p->nr_cpus_allowed = cpumask_weight(mask); +Index: linux-stable/kernel/sched/debug.c +=================================================================== +--- linux-stable.orig/kernel/sched/debug.c ++++ linux-stable/kernel/sched/debug.c +@@ -237,6 +237,9 @@ void print_rt_rq(struct seq_file *m, int P(rt_throttled); PN(rt_time); PN(rt_runtime); @@ -54,14 +54,14 @@ index 09acaa1..451512ff 100644 #undef PN #undef P -@@ -485,6 +488,10 @@ void proc_sched_show_task(struct task_struct *p, struct seq_file *m) +@@ -491,6 +494,10 @@ void proc_sched_show_task(struct task_st P(se.load.weight); P(policy); P(prio); +#ifdef CONFIG_PREEMPT_RT_FULL + P(migrate_disable); +#endif -+ P(rt.nr_cpus_allowed); ++ P(nr_cpus_allowed); #undef PN #undef __PN #undef P diff --git a/debian/patches/features/all/rt/0127-sched-rt-mutex-wakeup.patch.patch b/debian/patches/features/all/rt/sched-rt-mutex-wakeup.patch similarity index 76% rename from debian/patches/features/all/rt/0127-sched-rt-mutex-wakeup.patch.patch rename to debian/patches/features/all/rt/sched-rt-mutex-wakeup.patch index e0b681880..b7ee8e227 100644 --- a/debian/patches/features/all/rt/0127-sched-rt-mutex-wakeup.patch.patch +++ b/debian/patches/features/all/rt/sched-rt-mutex-wakeup.patch @@ -1,7 +1,6 @@ -From 1ad26e9ea3f939e309d3ef31161f6f6a4b023b09 Mon Sep 17 00:00:00 2001 +Subject: sched-rt-mutex-wakeup.patch From: Thomas Gleixner Date: Sat, 25 Jun 2011 09:21:04 +0200 -Subject: [127/256] sched-rt-mutex-wakeup.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/sched/core.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index a198e77..d177da5 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1109,6 +1109,7 @@ struct sched_domain; +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1080,6 +1080,7 @@ struct sched_domain; #define WF_SYNC 0x01 /* waker goes to sleep after wakup */ #define WF_FORK 0x02 /* child wakeup after fork */ #define WF_MIGRATED 0x04 /* internal use, task got migrated */ @@ -21,7 +20,7 @@ index a198e77..d177da5 100644 #define ENQUEUE_WAKEUP 1 #define ENQUEUE_HEAD 2 -@@ -1264,6 +1265,7 @@ enum perf_event_task_context { +@@ -1234,6 +1235,7 @@ enum perf_event_task_context { struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ @@ -29,7 +28,7 @@ index a198e77..d177da5 100644 void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ -@@ -2234,6 +2236,7 @@ extern void xtime_update(unsigned long ticks); +@@ -2220,6 +2222,7 @@ extern void xtime_update(unsigned long t extern int wake_up_state(struct task_struct *tsk, unsigned int state); extern int wake_up_process(struct task_struct *tsk); @@ -37,11 +36,11 @@ index a198e77..d177da5 100644 extern void wake_up_new_task(struct task_struct *tsk); #ifdef CONFIG_SMP extern void kick_process(struct task_struct *tsk); -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index f491ef7..720783a 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1586,8 +1586,25 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -1588,8 +1588,25 @@ try_to_wake_up(struct task_struct *p, un smp_wmb(); raw_spin_lock_irqsave(&p->pi_lock, flags); @@ -68,7 +67,7 @@ index f491ef7..720783a 100644 success = 1; /* we're going to change ->state */ cpu = task_cpu(p); -@@ -1659,6 +1676,18 @@ int wake_up_process(struct task_struct *p) +@@ -1695,6 +1712,18 @@ int wake_up_process(struct task_struct * } EXPORT_SYMBOL(wake_up_process); diff --git a/debian/patches/features/all/rt/0150-sched-teach-migrate_disable-about-atomic-contexts.patch b/debian/patches/features/all/rt/sched-teach-migrate_disable-about-atomic-contexts.patch similarity index 69% rename from debian/patches/features/all/rt/0150-sched-teach-migrate_disable-about-atomic-contexts.patch rename to debian/patches/features/all/rt/sched-teach-migrate_disable-about-atomic-contexts.patch index 169ccc6fd..0b3bd74e6 100644 --- a/debian/patches/features/all/rt/0150-sched-teach-migrate_disable-about-atomic-contexts.patch +++ b/debian/patches/features/all/rt/sched-teach-migrate_disable-about-atomic-contexts.patch @@ -1,7 +1,10 @@ -From 2ca12d4381688b8f8520ae6c18a74f823b5b295f Mon Sep 17 00:00:00 2001 +Subject: sched: Teach migrate_disable about atomic contexts +From: Peter Zijlstra +Date: Fri, 02 Sep 2011 14:41:37 +0200 + +Subject: sched: teach migrate_disable about atomic contexts From: Peter Zijlstra -Date: Fri, 2 Sep 2011 14:29:27 +0200 -Subject: [150/256] sched: teach migrate_disable about atomic contexts +Date: Fri Sep 02 14:29:27 CEST 2011 [] spin_bug+0x94/0xa8 [] do_raw_spin_lock+0x43/0xea @@ -34,25 +37,25 @@ Link: http://lkml.kernel.org/n/tip-wbot4vsmwhi8vmbf83hsclk6@git.kernel.org kernel/sched/core.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index cf6809b..01f2d96 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1304,6 +1304,9 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1277,6 +1277,9 @@ struct task_struct { unsigned int policy; #ifdef CONFIG_PREEMPT_RT_FULL int migrate_disable; -+#ifdef CONFIG_SCHED_DEBUG ++# ifdef CONFIG_SCHED_DEBUG + int migrate_disable_atomic; -+#endif ++# endif #endif + int nr_cpus_allowed; cpumask_t cpus_allowed; - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 06b99e1..d2cc5a0 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -5059,6 +5059,17 @@ void migrate_disable(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -5286,6 +5286,17 @@ void migrate_disable(void) unsigned long flags; struct rq *rq; @@ -70,7 +73,7 @@ index 06b99e1..d2cc5a0 100644 preempt_disable(); if (p->migrate_disable) { p->migrate_disable++; -@@ -5107,6 +5118,16 @@ void migrate_enable(void) +@@ -5334,6 +5345,16 @@ void migrate_enable(void) unsigned long flags; struct rq *rq; diff --git a/debian/patches/features/all/rt/0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch b/debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch similarity index 70% rename from debian/patches/features/all/rt/0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch rename to debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch index c9f0bef6d..2299dd819 100644 --- a/debian/patches/features/all/rt/0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch +++ b/debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch @@ -1,8 +1,6 @@ -From da5490969335713ca6076add89da5b7b473a09c3 Mon Sep 17 00:00:00 2001 +Subject: sched: ttwu: Return success when only changing the saved_state value From: Thomas Gleixner Date: Tue, 13 Dec 2011 21:42:19 +0100 -Subject: [134/256] sched: ttwu: Return success when only changing the - saved_state value When a task blocks on a rt lock, it saves the current state in p->saved_state, so a lock related wake up will not destroy the @@ -20,11 +18,11 @@ Cc: stable-rt@vger.kernel.org kernel/sched/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index e88cccc..d591b69 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1593,8 +1593,10 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -1595,8 +1595,10 @@ try_to_wake_up(struct task_struct *p, un * if the wakeup condition is true. */ if (!(wake_flags & WF_LOCK_SLEEPER)) { diff --git a/debian/patches/features/all/rt/scsi-fcoe-rt-aware.patch b/debian/patches/features/all/rt/scsi-fcoe-rt-aware.patch new file mode 100644 index 000000000..4713348f6 --- /dev/null +++ b/debian/patches/features/all/rt/scsi-fcoe-rt-aware.patch @@ -0,0 +1,117 @@ +Subject: scsi-fcoe-rt-aware.patch +From: Thomas Gleixner +Date: Sat, 12 Nov 2011 14:00:48 +0100 + +Signed-off-by: Thomas Gleixner +--- + drivers/scsi/fcoe/fcoe.c | 18 +++++++++--------- + drivers/scsi/fcoe/fcoe_ctlr.c | 4 ++-- + drivers/scsi/libfc/fc_exch.c | 4 ++-- + 3 files changed, 13 insertions(+), 13 deletions(-) + +Index: linux-stable/drivers/scsi/fcoe/fcoe.c +=================================================================== +--- linux-stable.orig/drivers/scsi/fcoe/fcoe.c ++++ linux-stable/drivers/scsi/fcoe/fcoe.c +@@ -1272,7 +1272,7 @@ static void fcoe_percpu_thread_destroy(u + struct sk_buff *skb; + #ifdef CONFIG_SMP + struct fcoe_percpu_s *p0; +- unsigned targ_cpu = get_cpu(); ++ unsigned targ_cpu = get_cpu_light(); + #endif /* CONFIG_SMP */ + + FCOE_DBG("Destroying receive thread for CPU %d\n", cpu); +@@ -1328,7 +1328,7 @@ static void fcoe_percpu_thread_destroy(u + kfree_skb(skb); + spin_unlock_bh(&p->fcoe_rx_list.lock); + } +- put_cpu(); ++ put_cpu_light(); + #else + /* + * This a non-SMP scenario where the singular Rx thread is +@@ -1546,11 +1546,11 @@ err2: + static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) + { + struct fcoe_percpu_s *fps; +- int rc; ++ int rc, cpu = get_cpu_light(); + +- fps = &get_cpu_var(fcoe_percpu); ++ fps = &per_cpu(fcoe_percpu, cpu); + rc = fcoe_get_paged_crc_eof(skb, tlen, fps); +- put_cpu_var(fcoe_percpu); ++ put_cpu_light(); + + return rc; + } +@@ -1745,11 +1745,11 @@ static inline int fcoe_filter_frames(str + return 0; + } + +- stats = per_cpu_ptr(lport->stats, get_cpu()); ++ stats = per_cpu_ptr(lport->stats, get_cpu_light()); + stats->InvalidCRCCount++; + if (stats->InvalidCRCCount < 5) + printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); +- put_cpu(); ++ put_cpu_light(); + return -EINVAL; + } + +@@ -1825,13 +1825,13 @@ static void fcoe_recv_frame(struct sk_bu + goto drop; + + if (!fcoe_filter_frames(lport, fp)) { +- put_cpu(); ++ put_cpu_light(); + fc_exch_recv(lport, fp); + return; + } + drop: + stats->ErrorFrames++; +- put_cpu(); ++ put_cpu_light(); + kfree_skb(skb); + } + +Index: linux-stable/drivers/scsi/fcoe/fcoe_ctlr.c +=================================================================== +--- linux-stable.orig/drivers/scsi/fcoe/fcoe_ctlr.c ++++ linux-stable/drivers/scsi/fcoe/fcoe_ctlr.c +@@ -792,7 +792,7 @@ static unsigned long fcoe_ctlr_age_fcfs( + + INIT_LIST_HEAD(&del_list); + +- stats = per_cpu_ptr(fip->lp->stats, get_cpu()); ++ stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); + + list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { + deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; +@@ -828,7 +828,7 @@ static unsigned long fcoe_ctlr_age_fcfs( + sel_time = fcf->time; + } + } +- put_cpu(); ++ put_cpu_light(); + + list_for_each_entry_safe(fcf, next, &del_list, list) { + /* Removes fcf from current list */ +Index: linux-stable/drivers/scsi/libfc/fc_exch.c +=================================================================== +--- linux-stable.orig/drivers/scsi/libfc/fc_exch.c ++++ linux-stable/drivers/scsi/libfc/fc_exch.c +@@ -730,10 +730,10 @@ static struct fc_exch *fc_exch_em_alloc( + } + memset(ep, 0, sizeof(*ep)); + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + pool = per_cpu_ptr(mp->pool, cpu); + spin_lock_bh(&pool->lock); +- put_cpu(); ++ put_cpu_light(); + + /* peek cache of free slot */ + if (pool->left != FC_XID_UNKNOWN) { diff --git a/debian/patches/features/all/rt/0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch b/debian/patches/features/all/rt/scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch similarity index 82% rename from debian/patches/features/all/rt/0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch rename to debian/patches/features/all/rt/scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch index 68a6bf813..575a5a7a7 100644 --- a/debian/patches/features/all/rt/0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch +++ b/debian/patches/features/all/rt/scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch @@ -1,7 +1,6 @@ -From 5a4b2e924ae169d59702be5635169c483bd1b15f Mon Sep 17 00:00:00 2001 +Subject: scsi: qla2xxx: Use local_irq_save_nort() in qla2x00_poll From: John Kacur Date: Fri, 27 Apr 2012 12:48:46 +0200 -Subject: [242/256] scsi: qla2xxx: Use local_irq_save_nort() in qla2x00_poll RT triggers the following: @@ -29,10 +28,10 @@ Signed-off-by: Thomas Gleixner drivers/scsi/qla2xxx/qla_inline.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h -index 6e45764..28d9a8d 100644 ---- a/drivers/scsi/qla2xxx/qla_inline.h -+++ b/drivers/scsi/qla2xxx/qla_inline.h +Index: linux-stable/drivers/scsi/qla2xxx/qla_inline.h +=================================================================== +--- linux-stable.orig/drivers/scsi/qla2xxx/qla_inline.h ++++ linux-stable/drivers/scsi/qla2xxx/qla_inline.h @@ -36,12 +36,12 @@ qla2x00_poll(struct rsp_que *rsp) { unsigned long flags; diff --git a/debian/patches/features/all/rt/0234-seqlock-Prevent-rt-starvation.patch b/debian/patches/features/all/rt/seqlock-prevent-rt-starvation.patch similarity index 81% rename from debian/patches/features/all/rt/0234-seqlock-Prevent-rt-starvation.patch rename to debian/patches/features/all/rt/seqlock-prevent-rt-starvation.patch index 44e7e34d1..3ea39fbcb 100644 --- a/debian/patches/features/all/rt/0234-seqlock-Prevent-rt-starvation.patch +++ b/debian/patches/features/all/rt/seqlock-prevent-rt-starvation.patch @@ -1,7 +1,6 @@ -From bc7c3dc37654e8cf7fb12264d7cf31e595d80c25 Mon Sep 17 00:00:00 2001 +Subject: seqlock: Prevent rt starvation From: Thomas Gleixner Date: Wed, 22 Feb 2012 12:03:30 +0100 -Subject: [234/256] seqlock: Prevent rt starvation If a low prio writer gets preempted while holding the seqlock write locked, a high prio reader spins forever on RT. @@ -16,16 +15,17 @@ possible. Signed-off-by: Thomas Gleixner Cc: stable-rt@vger.kernel.org + --- - include/linux/seqlock.h | 55 ++++++++++++++++++++++++++++++++++++++--------- - include/net/neighbour.h | 2 +- + include/linux/seqlock.h | 55 +++++++++++++++++++++++++++++++++++++++--------- + include/net/neighbour.h | 2 - 2 files changed, 46 insertions(+), 11 deletions(-) -diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h -index 1829905..c2dcae4 100644 ---- a/include/linux/seqlock.h -+++ b/include/linux/seqlock.h -@@ -146,18 +146,30 @@ static inline int read_seqcount_retry(const seqcount_t *s, unsigned start) +Index: linux-stable/include/linux/seqlock.h +=================================================================== +--- linux-stable.orig/include/linux/seqlock.h ++++ linux-stable/include/linux/seqlock.h +@@ -146,18 +146,30 @@ static inline int read_seqcount_retry(co * Sequence counter only version assumes that callers are using their * own mutexing. */ @@ -92,7 +92,7 @@ index 1829905..c2dcae4 100644 static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) { -@@ -216,36 +251,36 @@ static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) +@@ -216,36 +251,36 @@ static inline unsigned read_seqretry(con static inline void write_seqlock(seqlock_t *sl) { spin_lock(&sl->lock); @@ -135,7 +135,7 @@ index 1829905..c2dcae4 100644 spin_unlock_irq(&sl->lock); } -@@ -254,7 +289,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) +@@ -254,7 +289,7 @@ static inline unsigned long __write_seql unsigned long flags; spin_lock_irqsave(&sl->lock, flags); @@ -144,7 +144,7 @@ index 1829905..c2dcae4 100644 return flags; } -@@ -264,7 +299,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) +@@ -264,7 +299,7 @@ static inline unsigned long __write_seql static inline void write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) { @@ -153,11 +153,11 @@ index 1829905..c2dcae4 100644 spin_unlock_irqrestore(&sl->lock, flags); } -diff --git a/include/net/neighbour.h b/include/net/neighbour.h -index 34c996f..8e626fa 100644 ---- a/include/net/neighbour.h -+++ b/include/net/neighbour.h -@@ -394,7 +394,7 @@ struct neighbour_cb { +Index: linux-stable/include/net/neighbour.h +=================================================================== +--- linux-stable.orig/include/net/neighbour.h ++++ linux-stable/include/net/neighbour.h +@@ -385,7 +385,7 @@ struct neighbour_cb { #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) diff --git a/debian/patches/features/all/rt/0010-seqlock-Remove-unused-functions.patch b/debian/patches/features/all/rt/seqlock-remove-unused-functions.patch similarity index 69% rename from debian/patches/features/all/rt/0010-seqlock-Remove-unused-functions.patch rename to debian/patches/features/all/rt/seqlock-remove-unused-functions.patch index 0cecb23d1..7bbaaac84 100644 --- a/debian/patches/features/all/rt/0010-seqlock-Remove-unused-functions.patch +++ b/debian/patches/features/all/rt/seqlock-remove-unused-functions.patch @@ -1,18 +1,17 @@ -From fbb8f521da2e9e4a3ade472fa472491c58eb197b Mon Sep 17 00:00:00 2001 +Subject: seqlock: Remove unused functions From: Thomas Gleixner Date: Sat, 16 Jul 2011 18:38:22 +0200 -Subject: [010/256] seqlock: Remove unused functions Signed-off-by: Thomas Gleixner --- include/linux/seqlock.h | 21 --------------------- 1 file changed, 21 deletions(-) -diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h -index 600060e2..cb0599c 100644 ---- a/include/linux/seqlock.h -+++ b/include/linux/seqlock.h -@@ -69,17 +69,6 @@ static inline void write_sequnlock(seqlock_t *sl) +Index: linux-stable/include/linux/seqlock.h +=================================================================== +--- linux-stable.orig/include/linux/seqlock.h ++++ linux-stable/include/linux/seqlock.h +@@ -69,17 +69,6 @@ static inline void write_sequnlock(seqlo spin_unlock(&sl->lock); } @@ -30,7 +29,7 @@ index 600060e2..cb0599c 100644 /* Start of read calculation -- fetch last complete writer token */ static __always_inline unsigned read_seqbegin(const seqlock_t *sl) { -@@ -269,14 +258,4 @@ static inline void write_seqcount_barrier(seqcount_t *s) +@@ -269,14 +258,4 @@ static inline void write_seqcount_barrie #define write_sequnlock_bh(lock) \ do { write_sequnlock(lock); local_bh_enable(); } while(0) diff --git a/debian/patches/features/all/rt/0011-seqlock-Use-seqcount.patch b/debian/patches/features/all/rt/seqlock-use-seqcount.patch similarity index 89% rename from debian/patches/features/all/rt/0011-seqlock-Use-seqcount.patch rename to debian/patches/features/all/rt/seqlock-use-seqcount.patch index 887686411..c86cc9bf9 100644 --- a/debian/patches/features/all/rt/0011-seqlock-Use-seqcount.patch +++ b/debian/patches/features/all/rt/seqlock-use-seqcount.patch @@ -1,19 +1,18 @@ -From 4d3af0da43d7f2d1f2665ddd5e04a24173dca6fe Mon Sep 17 00:00:00 2001 +Subject: seqlock: Use seqcount From: Thomas Gleixner Date: Sat, 16 Jul 2011 18:40:26 +0200 -Subject: [011/256] seqlock: Use seqcount No point in having different implementations for the same thing. Signed-off-by: Thomas Gleixner --- - include/linux/seqlock.h | 174 +++++++++++++++++++++++++---------------------- - 1 file changed, 92 insertions(+), 82 deletions(-) + include/linux/seqlock.h | 176 +++++++++++++++++++++++++----------------------- + 1 file changed, 93 insertions(+), 83 deletions(-) -diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h -index cb0599c..1829905 100644 ---- a/include/linux/seqlock.h -+++ b/include/linux/seqlock.h +Index: linux-stable/include/linux/seqlock.h +=================================================================== +--- linux-stable.orig/include/linux/seqlock.h ++++ linux-stable/include/linux/seqlock.h @@ -30,81 +30,12 @@ #include #include @@ -96,7 +95,7 @@ index cb0599c..1829905 100644 typedef struct seqcount { unsigned sequence; } seqcount_t; -@@ -207,7 +138,6 @@ static inline int __read_seqcount_retry(const seqcount_t *s, unsigned start) +@@ -207,7 +138,6 @@ static inline int __read_seqcount_retry( static inline int read_seqcount_retry(const seqcount_t *s, unsigned start) { smp_rmb(); @@ -104,7 +103,7 @@ index cb0599c..1829905 100644 return __read_seqcount_retry(s, start); } -@@ -241,21 +171,101 @@ static inline void write_seqcount_barrier(seqcount_t *s) +@@ -241,21 +171,101 @@ static inline void write_seqcount_barrie s->sequence+=2; } @@ -113,10 +112,11 @@ index cb0599c..1829905 100644 + spinlock_t lock; +} seqlock_t; + -+/* + /* +- * Possible sw/hw IRQ protected versions of the interfaces. + * These macros triggered gcc-3.x compile-time problems. We think these are + * OK now. Be cautious. -+ */ + */ +#define __SEQLOCK_UNLOCKED(lockname) \ + { \ + .seqcount = SEQCNT_ZERO, \ @@ -145,12 +145,11 @@ index cb0599c..1829905 100644 + return read_seqcount_retry(&sl->seqcount, start); +} + - /* -- * Possible sw/hw IRQ protected versions of the interfaces. ++/* + * Lock out other writers and update the count. + * Acts like a normal spin_lock/unlock. + * Don't need preempt_disable() because that is in the spin_lock already. - */ ++ */ +static inline void write_seqlock(seqlock_t *sl) +{ + spin_lock(&sl->lock); @@ -202,14 +201,15 @@ index cb0599c..1829905 100644 - do { local_irq_disable(); write_seqlock(lock); } while (0) -#define write_seqlock_bh(lock) \ - do { local_bh_disable(); write_seqlock(lock); } while (0) -+ do { flags = __write_seqlock_irqsave(lock); } while (0) - +- -#define write_sequnlock_irqrestore(lock, flags) \ - do { write_sequnlock(lock); local_irq_restore(flags); } while(0) -#define write_sequnlock_irq(lock) \ - do { write_sequnlock(lock); local_irq_enable(); } while(0) -#define write_sequnlock_bh(lock) \ - do { write_sequnlock(lock); local_bh_enable(); } while(0) ++ do { flags = __write_seqlock_irqsave(lock); } while (0) ++ +static inline void +write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) +{ diff --git a/debian/patches/features/all/rt/series b/debian/patches/features/all/rt/series index 5d092eb4b..e1281003c 100644 --- a/debian/patches/features/all/rt/series +++ b/debian/patches/features/all/rt/series @@ -1,254 +1,602 @@ -0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch -0002-slab-lockdep-Annotate-all-slab-caches.patch -0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch -0004-tick-Add-tick-skew-boot-option.patch -0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch -0006-block-Shorten-interrupt-disabled-regions.patch -0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch -0008-mips-enable-interrupts-in-signal.patch.patch -0009-arm-enable-interrupts-in-signal-code.patch.patch -0010-seqlock-Remove-unused-functions.patch -0011-seqlock-Use-seqcount.patch -0012-timekeeping-Split-xtime_lock.patch -0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch -0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch -0015-signal-revert-ptrace-preempt-magic.patch.patch -0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch -0017-arm-Allow-forced-irq-threading.patch -0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch -0019-arm-omap-make-wakeupgen_lock-raw.patch.patch -0020-signals-Do-not-wakeup-self.patch -0021-posix-timers-Prevent-broadcast-signals.patch -0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch -0023-signal-x86-Delay-calling-signals-in-atomic.patch -0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch -0025-drivers-random-Reduce-preempt-disabled-region.patch -0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch -0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch -0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch -0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch -0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch -0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch -0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch -0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch -0034-mm-pagefault_disabled.patch -0035-mm-raw_pagefault_disable.patch -0036-filemap-fix-up.patch.patch -0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch -0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch -0039-suspend-Prevent-might-sleep-splats.patch -0040-OF-Fixup-resursive-locking-code-paths.patch -0041-of-convert-devtree-lock.patch.patch -0042-list-add-list-last-entry.patch.patch -0043-mm-page-alloc-use-list-last-entry.patch.patch -0044-mm-slab-move-debug-out.patch.patch -0045-rwsem-inlcude-fix.patch.patch -0046-sysctl-include-fix.patch.patch -0047-net-flip-lock-dep-thingy.patch.patch -0048-softirq-thread-do-softirq.patch.patch -0049-softirq-split-out-code.patch.patch -0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch -0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch -0052-locking-various-init-fixes.patch.patch -0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch -0054-latency-hist.patch.patch -0055-hwlatdetect.patch.patch -0056-localversion.patch.patch -0057-early-printk-consolidate.patch.patch -0058-printk-kill.patch.patch -0059-printk-force_early_printk-boot-param-to-help-with-de.patch -0060-rt-preempt-base-config.patch.patch -0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch -0062-rt-local_irq_-variants-depending-on-RT-RT.patch -0063-preempt-Provide-preempt_-_-no-rt-variants.patch -0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch -0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch -0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch -0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch -0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch -0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch -0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch -0071-usb-Use-local_irq_-_nort-variants.patch -0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch -0073-mm-scatterlist-dont-disable-irqs-on-RT.patch -0074-signal-fix-up-rcu-wreckage.patch.patch -0075-net-wireless-warn-nort.patch.patch -0076-mm-Replace-cgroup_page-bit-spinlock.patch -0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch -0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch -0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch -0080-genirq-Disable-random-call-on-preempt-rt.patch -0081-genirq-disable-irqpoll-on-rt.patch -0082-genirq-force-threading.patch.patch -0083-drivers-net-fix-livelock-issues.patch -0084-drivers-net-vortex-fix-locking-issues.patch -0085-drivers-net-gianfar-Make-RT-aware.patch -0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch -0087-local-var.patch.patch -0088-rt-local-irq-lock.patch.patch -0089-cpu-rt-variants.patch.patch -0090-mm-slab-wrap-functions.patch.patch -0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch -0092-mm-More-lock-breaks-in-slab.c.patch -0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch -0094-mm-page_alloc-reduce-lock-sections-further.patch -0095-mm-page-alloc-fix.patch.patch -0096-mm-convert-swap-to-percpu-locked.patch -0097-mm-make-vmstat-rt-aware.patch -0098-mm-shrink-the-page-frame-to-rt-size.patch -0099-ARM-Initialize-ptl-lock-for-vector-page.patch -0100-mm-Allow-only-slab-on-RT.patch -0101-radix-tree-rt-aware.patch.patch -0102-panic-disable-random-on-rt.patch -0103-ipc-Make-the-ipc-code-rt-aware.patch -0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch -0105-relay-fix-timer-madness.patch -0106-net-ipv4-route-use-locks-on-up-rt.patch.patch -0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch -0108-timers-prepare-for-full-preemption.patch -0109-timers-preempt-rt-support.patch -0110-timers-fix-timer-hotplug-on-rt.patch -0111-timers-mov-printk_tick-to-soft-interrupt.patch -0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch -0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch -0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch -0115-hrtimers-prepare-full-preemption.patch -0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch -0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch -0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch -0119-hrtimer-fix-reprogram-madness.patch.patch -0120-timer-fd-Prevent-live-lock.patch -0121-posix-timers-thread-posix-cpu-timers-on-rt.patch -0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch -0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch -0124-sched-delay-put-task.patch.patch -0125-sched-limit-nr-migrate.patch.patch -0126-sched-mmdrop-delayed.patch.patch -0127-sched-rt-mutex-wakeup.patch.patch -0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch -0129-sched-cond-resched.patch.patch -0130-cond-resched-softirq-fix.patch.patch -0131-cond-resched-lock-rt-tweak.patch.patch -0132-sched-disable-ttwu-queue.patch.patch -0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch -0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch -0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch -0136-stomp-machine-mark-stomper-thread.patch.patch -0137-stomp-machine-raw-lock.patch.patch -0138-hotplug-Lightweight-get-online-cpus.patch -0139-hotplug-sync_unplug-No.patch -0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch -0141-sched-migrate-disable.patch.patch -0142-hotplug-use-migrate-disable.patch.patch -0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch -0144-ftrace-migrate-disable-tracing.patch.patch -0145-tracing-Show-padding-as-unsigned-short.patch -0146-migrate-disable-rt-variant.patch.patch -0147-sched-Optimize-migrate_disable.patch -0148-sched-Generic-migrate_disable.patch -0149-sched-rt-Fix-migrate_enable-thinko.patch -0150-sched-teach-migrate_disable-about-atomic-contexts.patch -0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch -0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch -0153-sched-Have-migrate_disable-ignore-bounded-threads.patch -0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch -0155-ftrace-crap.patch.patch -0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch -0157-net-netif_rx_ni-migrate-disable.patch.patch -0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch -0159-lockdep-rt.patch.patch -0160-mutex-no-spin-on-rt.patch.patch -0161-softirq-local-lock.patch.patch -0162-softirq-Export-in_serving_softirq.patch -0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch -0164-softirq-Fix-unplug-deadlock.patch -0165-softirq-disable-softirq-stacks-for-rt.patch.patch -0166-softirq-make-fifo.patch.patch -0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch -0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch -0169-local-vars-migrate-disable.patch.patch -0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch -0171-rtmutex-lock-killable.patch.patch -0172-rtmutex-futex-prepare-rt.patch.patch -0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch -0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch -0175-spinlock-types-separate-raw.patch.patch -0176-rtmutex-avoid-include-hell.patch.patch -0177-rt-add-rt-spinlocks.patch.patch -0178-rt-add-rt-to-mutex-headers.patch.patch -0179-rwsem-add-rt-variant.patch.patch -0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch -0181-rwlocks-Fix-section-mismatch.patch -0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch -0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch -0184-rcu-Frob-softirq-test.patch -0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch -0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch -0187-rcu-more-fallout.patch.patch -0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch -0189-rcu-Fix-build-break.patch -0190-rt-rcutree-Move-misplaced-prototype.patch -0191-lglocks-rt.patch.patch -0192-serial-8250-Clean-up-the-locking-for-rt.patch -0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch -0194-drivers-tty-fix-omap-lock-crap.patch.patch -0195-rt-Improve-the-serial-console-PASS_LIMIT.patch -0196-fs-namespace-preemption-fix.patch -0197-mm-protect-activate-switch-mm.patch.patch -0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch -0199-fs-block-rt-support.patch.patch -0200-fs-ntfs-disable-interrupt-only-on-RT.patch -0201-x86-Convert-mce-timer-to-hrtimer.patch -0202-x86-stackprotector-Avoid-random-pool-on-rt.patch -0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch -0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch -0205-workqueue-use-get-cpu-light.patch.patch -0206-epoll.patch.patch -0207-mm-vmalloc.patch.patch -0208-workqueue-Fix-cpuhotplug-trainwreck.patch -0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch -0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch -0211-hotplug-stuff.patch.patch -0212-debugobjects-rt.patch.patch -0213-jump-label-rt.patch.patch -0214-skbufhead-raw-lock.patch.patch -0215-x86-no-perf-irq-work-rt.patch.patch -0216-console-make-rt-friendly.patch.patch -0217-fix-printk-flush-of-messages.patch -0218-power-use-generic-rwsem-on-rt.patch -0219-power-disable-highmem-on-rt.patch.patch -0220-arm-disable-highmem-on-rt.patch.patch -0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch -0222-mips-disable-highmem-on-rt.patch.patch -0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch -0224-ping-sysrq.patch.patch -0225-kgdb-serial-Short-term-workaround.patch -0226-add-sys-kernel-realtime-entry.patch -0227-mm-rt-kmap_atomic-scheduling.patch -0228-ipc-sem-Rework-semaphore-wakeups.patch -0229-x86-kvm-require-const-tsc-for-rt.patch.patch -0230-scsi-fcoe-rt-aware.patch.patch -0231-x86-crypto-Reduce-preempt-disabled-regions.patch -0232-dm-Make-rt-aware.patch -0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch -0234-seqlock-Prevent-rt-starvation.patch -0235-timer-Fix-hotplug-for-rt.patch -0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch -0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch -0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch -0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch -0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch -0241-softirq-Check-preemption-after-reenabling-interrupts.patch -0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch -0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch -0244-rt-Introduce-cpu_chill.patch -0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch -0246-net-Use-cpu_chill-instead-of-cpu_relax.patch -0247-ntp-Make-ntp_lock-raw.patch -0248-mips-remove-smp-reserve-lock.patch.patch -0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch -0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch -0251-genirq-Add-default-affinity-mask-command-line-option.patch -0252-kconfig-disable-a-few-options-rt.patch.patch -0253-kconfig-preempt-rt-full.patch.patch -0254-Linux-3.4.2-rt10-REBASE.patch +########################################################### +# DELTA against a known Linus release +########################################################### + +############################################################ +# UPSTREAM changes queued +############################################################ + +############################################################ +# UPSTREAM FIXES, patches pending +############################################################ + +############################################################ +# Stuff broken upstream, patches submitted +############################################################ +x86-kprobes-remove-bogus-preempt-enable.patch + +############################################################ +# Stuff which needs addressing upstream, but requires more +# information +############################################################ +x86-hpet-disable-msi-on-lenovo-w510.patch + +############################################################ +# Stuff broken upstream, need to be sent +############################################################ + +############################################################ +# Submitted on LKML +############################################################ +# SCHED BLOCK/WQ +block-shorten-interrupt-disabled-regions.patch + +# CHECKME sched-distangle-worker-accounting-from-rq-3elock.patch + +############################################################ +# Submitted to mips ML +############################################################ +mips-enable-interrupts-in-signal.patch + +############################################################ +# Submitted to ARM ML +############################################################ + +############################################################ +# Submitted on LKML +############################################################ + +# JBD + +# SCHED + +############################################################ +# Submitted on ppc-devel +############################################################ + +############################################################ +# Submitted to net-dev +############################################################ + +############################################################ +# Pending in tip +############################################################ + +# WATCHDOG + +# CLOCKSOURCE + +# RTMUTEX CLEANUP + +# RAW SPINLOCKS + +# X86 + +############################################################ +# Pending in peterz's scheduler queue +############################################################ + + +############################################################ +# Stuff which should go upstream ASAP +############################################################ + +# GENIRQ +genirq-add-default-mask-cmdline-option.patch + +# PPC +ppc-mark-low-level-handlers-no-thread.patch + +# Timekeeping / VDSO + +# SEQLOCK +seqlock-remove-unused-functions.patch +seqlock-use-seqcount.patch + +# RAW SPINLOCKS +timekeeping-split-xtime-lock.patch +intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch +ntp-make-ntp-lock-raw-sigh.patch + +# MM memcg + +# Tracing +tracing-account-for-preempt-off-in-preempt_schedule.patch + +# PTRACE/SIGNAL crap +signal-revert-ptrace-preempt-magic.patch + +# ARM IRQF_NO_TRHEAD / IRQ THREADING SUPPORT +arm-mark-pmu-interupt-no-thread.patch +arm-allow-irq-threading.patch +arm-convert-boot-lock-to-raw.patch +arm-omap-make-wakeupgen_lock-raw.patch + +# PREEMPT_ENABLE_NO_RESCHED + +# SIGNALS / POSIXTIMERS +signals-do-not-wake-self.patch +posix-timers-no-broadcast.patch +signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch +oleg-signal-rt-fix.patch + +# SCHED + +# GENERIC CMPXCHG +generic-cmpxchg-use-raw-local-irq.patch + +# SHORTEN PREEMPT DISABLED +drivers-random-reduce-preempt-disabled-region.patch + +# CLOCKSOURCE +arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch +clocksource-tclib-allow-higher-clockrates.patch + +# HW LATENCY DETECTOR - this really wants a rewrite +#hw-latency-detector.patch + +# DRIVERS NET +drivers-net-tulip-add-missing-pci-disable.patch +drivers-net-8139-disable-irq-nosync.patch +drivers-net-ehea-mark-rx-irq-no-thread.patch +drivers-net-at91-make-mdio-protection-rt-safe.patch + +# PREEMPT + +# PAGEFAULT DISABLE +mm-prepare-pf-disable-discoupling.patch +arch-use-pagefault-disabled.patch +peter_zijlstra-frob-pagefault_disable.patch +peterz-raw_pagefault_disable.patch +# highmem-explicitly-disable-preemption.patch -- peterz +filemap-fix-up.patch +mm-remove-preempt-count-from-pf.patch + +# HIGHMEM +x86-highmem-warn.patch + +# PM +suspend-prevernt-might-sleep-splats.patch + +# DEVICE TREE +of-fixup-recursive-locking.patch +of-convert-devtree-lock.patch + +# MM/LISTS +list-add-list-last-entry.patch +mm-page-alloc-use-list-last-entry.patch +mm-slab-move-debug-out.patch + +# INCLUDE MESS +pid-h-include-atomic-h.patch +sysctl-include-atomic-h.patch + +# NETWORKING +net-flip-lock-dep-thingy.patch + +# SOFTIRQ +softirq-thread-do-softirq.patch +softirq-split-out-code.patch + +# X86 +x86-io-apic-migra-no-unmask.patch +fix-rt-int3-x86_32-3.2-rt.patch + +# RCU + +# LOCKING INIT FIXES +locking-various-init-fixes.patch + +# PCI +pci-access-use-__wake_up_all_locked.patch + +##################################################### +# Stuff which should go mainline, but wants some care +##################################################### + +# SEQLOCK + +# ANON RW SEMAPHORES + +# TRACING +latency-hist.patch + +# HW latency detector +hwlatdetect.patch + +################################################## +# REAL RT STUFF starts here +################################################## + +# Add RT to version +localversion.patch + +# PRINTK +early-printk-consolidate.patch +printk-kill.patch +printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch + +# BASE RT CONFIG +rt-preempt-base-config.patch + +# WARN/BUG_ON_RT +bug-rt-dependend-variants.patch + +# LOCAL_IRQ_RT/NON_RT +local-irq-rt-depending-variants.patch + +# PREEMPT NORT +preempt-nort-rt-variants.patch + +# ANNOTATE local_irq_disable sites +ata-disable-interrupts-if-non-rt.patch +ide-use-nort-local-irq-variants.patch +infiniband-mellanox-ib-use-nort-irq.patch +inpt-gameport-use-local-irq-nort.patch +acpi-use-local-irq-nort.patch +user-use-local-irq-nort.patch +resource-counters-use-localirq-nort.patch +usb-hcd-use-local-irq-nort.patch +tty-use-local-irq-nort.patch +mm-scatterlist-dont-disable-irqs-on-RT.patch + +# Sigh +signal-fix-up-rcu-wreckage.patch + +# ANNOTATE BUG/WARNON +net-wireless-warn-nort.patch + +# BIT SPINLOCKS - SIGH +mm-cgroup-page-bit-spinlock.patch +fs-replace-bh_uptodate_lock-for-rt.patch +fs-jbd-replace-bh_state-lock.patch + +# GENIRQ +genirq-nodebug-shirq.patch +genirq-disable-irqpoll-on-rt.patch +genirq-force-threading.patch + +# DRIVERS NET +drivers-net-fix-livelock-issues.patch +drivers-net-vortex-fix-locking-issues.patch +drivers-net-gianfar-make-rt-aware.patch + +# DRIVERS USB +# Revisit. Looks weird +#usb-rt-support.patch +usb-fix-mouse-problem-copying-large-data.patch + +# LOCAL_IRQ_LOCKS +local-var.patch +rt-local-irq-lock.patch +cpu-rt-variants.patch + +# MM SLAB +mm-slab-wrap-functions.patch +mm-slab-more-lock-breaks.patch + +# MM PAGE_ALLOC +mm-page_alloc-rt-friendly-per-cpu-pages.patch +mm-page_alloc-reduce-lock-sections-further.patch +mm-page-alloc-fix.patch + +# MM SWAP +mm-convert-swap-to-percpu-locked.patch + +# MM vmstat +mm-make-vmstat-rt-aware.patch + +# MM memory +#mm-memory-rt.patch - ZAP... is unused +mm-shrink-the-page-frame-to-rt-size.patch +re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch + +# MM SLAB only +mm-allow-slab-rt.patch + +# Revisit for avr/frv/ia64/mn10300/sh/sparc ... +#mm-quicklists-percpu-locked.patch + +# RADIX TREE +radix-tree-rt-aware.patch + +# PANIC +panic-disable-random-on-rt.patch + +# IPC +ipc-make-rt-aware.patch +ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch + +# RELAY +relay-fix-timer-madness.patch + +# NETWORKING + +# WORKQUEUE SIGH + +# TIMERS +timers-prepare-for-full-preemption.patch +timers-preempt-rt-support.patch +timers-mov-printk_tick-to-soft-interrupt.patch +timer-delay-waking-softirqs-from-the-jiffy-tick.patch +timers-avoid-the-base-null-otptimization-on-rt.patch + +# More PRINTK +rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch + +# HRTIMERS +hrtimers-prepare-full-preemption.patch +hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch +peter_zijlstra-frob-hrtimer.patch +hrtimer-add-missing-debug_activate-aid.patch +hrtimer-fix-reprogram-madness.patch +timer-fd-avoid-live-lock.patch + +# POSIX-CPU-TIMERS +posix-timers-thread-posix-cpu-timers-on-rt.patch +posix-timers-shorten-cpu-timers-thread.patch +posix-timers-avoid-wakeups-when-no-timers-are-active.patch + +# SCHEDULER +sched-delay-put-task.patch +sched-limit-nr-migrate.patch +sched-mmdrop-delayed.patch +sched-rt-mutex-wakeup.patch +sched-might-sleep-do-not-account-rcu-depth.patch +# CHECKME sched-load-balance-break-on-rq-contention.patch +sched-cond-resched.patch +cond-resched-softirq-rt.patch +cond-resched-lock-rt-tweak.patch +sched-disable-ttwu-queue.patch +sched-disable-rt-group-sched-on-rt.patch +sched-ttwu-ensure-success-return-is-correct.patch + +# STOP MACHINE +stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch +stomp-machine-mark-stomper-thread.patch +stomp-machine-raw-lock.patch + +# MIGRATE DISABLE AND PER CPU +hotplug-light-get-online-cpus.patch +hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch +re-migrate_disable-race-with-cpu-hotplug-3f.patch +sched-migrate-disable.patch +hotplug-use-migrate-disable.patch +hotplug-call-cpu_unplug_begin-a-little-early.patch + +ftrace-migrate-disable-tracing.patch +rt-tracing-show-padding-as-unsigned-short.patch + +migrate-disable-rt-variant.patch +peter_zijlstra-frob-migrate_disable.patch +peter_zijlstra-frob-migrate_disable-2.patch +sched-rt-fix-migrate_enable-thinko.patch +sched-teach-migrate_disable-about-atomic-contexts.patch +rt-sched-postpone-actual-migration-disalbe-to-schedule.patch +rt-sched-do-not-compare-cpu-masks-in-scheduler.patch +rt-sched-have-migrate_disable-ignore-bounded-threads.patch +sched-clear-pf-thread-bound-on-fallback-rq.patch + +# FTRACE +ftrace-crap.patch +# CHECKME rt-ring-buffer-convert-reader_lock-from-raw_spin_lock-into-spin_lock.patch +# CHECKME rfc-ring-buffer-rt-check-for-irqs-disabled-before-grabbing-reader-lock.patch + +# NETWORKING +net-netif_rx_ni-migrate-disable.patch + +# NOHZ +softirq-sanitize-softirq-pending.patch + +# LOCKDEP +lockdep-no-softirq-accounting-on-rt.patch + +# SOFTIRQ local lock +mutex-no-spin-on-rt.patch +softirq-local-lock.patch +softirq-export-in-serving-softirq.patch +harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch +softirq-fix-unplug-deadlock.patch +softirq-disable-softirq-stacks-for-rt.patch +softirq-make-fifo.patch +tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch +irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch + +# LOCAL VARS and GETCPU STUFF +local-vars-migrate-disable.patch + +# RAID5 +md-raid5-percpu-handling-rt-aware.patch + +# RTMUTEX +rtmutex-lock-killable.patch + +# FUTEX/RTMUTEX +rtmutex-futex-prepare-rt.patch +futex-requeue-pi-fix.patch + +# RTMUTEX +rt-mutex-add-sleeping-spinlocks-support.patch +spinlock-types-separate-raw.patch +rtmutex-avoid-include-hell.patch +rt-add-rt-spinlock-to-headers.patch +rt-add-rt-to-mutex-headers.patch +rwsem-add-rt-variant.patch +rt-add-rt-locks.patch + +# RTMUTEX Fallout +tasklist-lock-fix-section-conflict.patch + +# NOHZ/RTMUTEX +timer-handle-idle-trylock-in-get-next-timer-irq.patch +timer.c-fix-build-fail-for-RT_FULL.patch + +# RCU +rcu-force-preempt-rcu-for-rt.patch +peter_zijlstra-frob-rcu.patch +rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch +rcu-tiny-merge-bh.patch +patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch +rcu-fix-build-break.patch +rt-rcutree-warn-fix.patch + +# LGLOCKS - lovely +lglocks-rt.patch + +# DRIVERS SERIAL +drivers-serial-cleanup-locking-for-rt.patch +drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch +drivers-tty-fix-omap-lock-crap.patch +rt-serial-warn-fix.patch + +# FS +fs-namespace-preemption-fix.patch +mm-protect-activate-switch-mm.patch +mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch +fs-block-rt-support.patch +fs-ntfs-disable-interrupt-non-rt.patch + +# X86 +x86-mce-timer-hrtimer.patch +x86-stackprot-no-random-on-rt.patch +# x86-no-highmem-with-rt.patch -- peterz +x86-use-gen-rwsem-spinlocks-rt.patch +x86-disable-debug-stack.patch + +# CPU get light +workqueue-use-get-cpu-light.patch +epoll-use-get-cpu-light.patch +mm-vmalloc-use-get-cpu-light.patch + +# WORKQUEUE more fixes +# CHECKME workqueue-sanity.patch +# CHECKME workqueue-fix-PF_THREAD_BOUND.patch +# CHECKME workqueue-hotplug-fix.patch +# CHECKME workqueue-more-hotplug-fallout.patch + +# DEBUGOBJECTS +debugobjects-rt.patch + +# JUMPLABEL +jump-label-rt.patch + +# NET +skbufhead-raw-lock.patch + +# PERF +perf-move-irq-work-to-softirq-in-rt.patch + +# CONSOLE. NEEDS more thought !!! +printk-rt-aware.patch + +# POWERC +power-use-generic-rwsem-on-rt.patch +power-disable-highmem-on-rt.patch + +# ARM +arm-disable-highmem-on-rt.patch +arm-at91-tclib-default-to-tclib-timer-for-rt.patch + +# MIPS +mips-disable-highmem-on-rt.patch + +# NETWORK livelock fix +net-tx-action-avoid-livelock-on-rt.patch + +# NETWORK DEBUGGING AID +ping-sysrq.patch + +# KGDB +kgb-serial-hackaround.patch + +# SYSFS - RT indicator +sysfs-realtime-entry.patch + +# KMAP/HIGHMEM +mm-rt-kmap-atomic-scheduling.patch + +# IPC +ipc-sem-rework-semaphore-wakeups.patch + +# SYSRQ + +# KVM require constant freq TSC (smp function call -> cpufreq) +x86-kvm-require-const-tsc-for-rt.patch + +# SCSI/FCOE +scsi-fcoe-rt-aware.patch + +# X86 crypto +x86-crypto-reduce-preempt-disabled-regions.patch + +# Device mapper +dm-make-rt-aware.patch + +# ACPI +# Dropped those two as they cause a scheduling in atomic failure and +# we have no clue why we made those locks raw in the first place. +# acpi-make-gbl-hardware-lock-raw.patch +# acpi-make-ec-lock-raw-as-well.patch + +# This one is just a follow up to the raw spin locks +# Simple raw spinlock based waitqueue +# wait-simple-version.patch +# acpi-gpe-use-wait-simple.patch + +# CPUMASK OFFSTACK +cpumask-disable-offstack-on-rt.patch + +# Various fixes - fold them back +seqlock-prevent-rt-starvation.patch +#fs-protect-opencoded-isize-seqcount.patch +#net-u64-stat-protect-seqcount.patch +rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch + +cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch + +softirq-preempt-fix-3-re.patch +scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch +upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch + +# FS LIVELOCK PREVENTION +rt-introduce-cpu-chill.patch +fs-dcache-use-cpu-chill-in-trylock-loops.patch +net-use-cpu-chill.patch + +# LOCKDEP +lockdep-selftest-convert-spinlock-to-raw-spinlock.patch +lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch + +rt-disable-rt-group-sched.patch +fs-jbd-pull-plug-when-waiting-for-space.patch +perf-make-swevent-hrtimer-irqsafe.patch +cpu-rt-rework-cpu-down.patch + +# Stable-rt stuff: Fold back when Steve grabbed it +random-make-it-work-on-rt.patch +softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch +mm-slab-fix-potential-deadlock.patch +mm-page-alloc-use-local-lock-on-target-cpu.patch +rt-rw-lockdep-annotations.patch +sched-better-debug-output-for-might-sleep.patch +stomp-machine-deal-clever-with-stopper-lock.patch + +# 3.6 specific updates +net-another-local-irq-disable-alloc-atomic-headache.patch +net-use-cpu-light-in-ip-send-unicast-reply.patch +peterz-srcu-crypto-chain.patch +crypto-make-core-static-and-init-scru-early.patch +x86-perf-uncore-deal-with-kfree.patch +softirq-make-serving-softirqs-a-task-flag.patch +softirq-split-handling-function.patch +softirq-split-locks.patch + +# Needs more thought +# block-wrap-raise-softirq-in-local-bh-to-avoid-context-switches.patch +# nohz-fix-sirq-fallout.patch + +# Enable full RT +rcu-tiny-solve-rt-mistery.patch +kconfig-disable-a-few-options-rt.patch +kconfig-preempt-rt-full.patch +#rt-replace-rt-spin-lock-to-raw-one-in-res_counter.patch diff --git a/debian/patches/features/all/rt/0074-signal-fix-up-rcu-wreckage.patch.patch b/debian/patches/features/all/rt/signal-fix-up-rcu-wreckage.patch similarity index 61% rename from debian/patches/features/all/rt/0074-signal-fix-up-rcu-wreckage.patch.patch rename to debian/patches/features/all/rt/signal-fix-up-rcu-wreckage.patch index bd779e038..5171fd5b2 100644 --- a/debian/patches/features/all/rt/0074-signal-fix-up-rcu-wreckage.patch.patch +++ b/debian/patches/features/all/rt/signal-fix-up-rcu-wreckage.patch @@ -1,18 +1,17 @@ -From dd353e8519898078c6fdb5df18362b69f3f88bfe Mon Sep 17 00:00:00 2001 +Subject: signal-fix-up-rcu-wreckage.patch From: Thomas Gleixner Date: Fri, 22 Jul 2011 08:07:08 +0200 -Subject: [074/256] signal-fix-up-rcu-wreckage.patch Signed-off-by: Thomas Gleixner --- kernel/signal.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/kernel/signal.c b/kernel/signal.c -index 65cb5b4..3d32651 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1401,12 +1401,12 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, +Index: linux-stable/kernel/signal.c +=================================================================== +--- linux-stable.orig/kernel/signal.c ++++ linux-stable/kernel/signal.c +@@ -1394,12 +1394,12 @@ struct sighand_struct *__lock_task_sigha struct sighand_struct *sighand; for (;;) { @@ -27,7 +26,7 @@ index 65cb5b4..3d32651 100644 break; } -@@ -1417,7 +1417,7 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, +@@ -1410,7 +1410,7 @@ struct sighand_struct *__lock_task_sigha } spin_unlock(&sighand->siglock); rcu_read_unlock(); diff --git a/debian/patches/features/all/rt/0015-signal-revert-ptrace-preempt-magic.patch.patch b/debian/patches/features/all/rt/signal-revert-ptrace-preempt-magic.patch similarity index 62% rename from debian/patches/features/all/rt/0015-signal-revert-ptrace-preempt-magic.patch.patch rename to debian/patches/features/all/rt/signal-revert-ptrace-preempt-magic.patch index fa7ea48d2..87a663b4f 100644 --- a/debian/patches/features/all/rt/0015-signal-revert-ptrace-preempt-magic.patch.patch +++ b/debian/patches/features/all/rt/signal-revert-ptrace-preempt-magic.patch @@ -1,18 +1,17 @@ -From 62a95221e057c426137cdcce9f252716b532e3de Mon Sep 17 00:00:00 2001 +Subject: signal-revert-ptrace-preempt-magic.patch From: Thomas Gleixner Date: Wed, 21 Sep 2011 19:57:12 +0200 -Subject: [015/256] signal-revert-ptrace-preempt-magic.patch Signed-off-by: Thomas Gleixner --- kernel/signal.c | 8 -------- 1 file changed, 8 deletions(-) -diff --git a/kernel/signal.c b/kernel/signal.c -index 17afcaf..6b5071f 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1909,15 +1909,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) +Index: linux-stable/kernel/signal.c +=================================================================== +--- linux-stable.orig/kernel/signal.c ++++ linux-stable/kernel/signal.c +@@ -1898,15 +1898,7 @@ static void ptrace_stop(int exit_code, i if (gstop_done && ptrace_reparented(current)) do_notify_parent_cldstop(current, false, why); diff --git a/debian/patches/features/all/rt/0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch b/debian/patches/features/all/rt/signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch similarity index 70% rename from debian/patches/features/all/rt/0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch rename to debian/patches/features/all/rt/signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch index c898dbbb2..8f230db48 100644 --- a/debian/patches/features/all/rt/0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch +++ b/debian/patches/features/all/rt/signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch @@ -1,25 +1,25 @@ -From 1b1af762f485c34db690823e315a89a67f840181 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:56 -0500 -Subject: [022/256] signals: Allow rt tasks to cache one sigqueue struct +Subject: signals: Allow rt tasks to cache one sigqueue struct To avoid allocation allow rt tasks to cache one sigqueue struct in task struct. Signed-off-by: Thomas Gleixner + --- - include/linux/sched.h | 1 + - include/linux/signal.h | 1 + - kernel/exit.c | 2 +- - kernel/fork.c | 1 + - kernel/signal.c | 83 +++++++++++++++++++++++++++++++++++++++++++++--- + include/linux/sched.h | 1 + include/linux/signal.h | 1 + kernel/exit.c | 2 - + kernel/fork.c | 1 + kernel/signal.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 83 insertions(+), 5 deletions(-) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 81a173c..b546194 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1435,6 +1435,7 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1403,6 +1403,7 @@ struct task_struct { /* signal handlers */ struct signal_struct *signal; struct sighand_struct *sighand; @@ -27,11 +27,11 @@ index 81a173c..b546194 100644 sigset_t blocked, real_blocked; sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ -diff --git a/include/linux/signal.h b/include/linux/signal.h -index 7987ce74..24cc7a4 100644 ---- a/include/linux/signal.h -+++ b/include/linux/signal.h -@@ -229,6 +229,7 @@ static inline void init_sigpending(struct sigpending *sig) +Index: linux-stable/include/linux/signal.h +=================================================================== +--- linux-stable.orig/include/linux/signal.h ++++ linux-stable/include/linux/signal.h +@@ -229,6 +229,7 @@ static inline void init_sigpending(struc } extern void flush_sigqueue(struct sigpending *queue); @@ -39,11 +39,11 @@ index 7987ce74..24cc7a4 100644 /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ static inline int valid_signal(unsigned long sig) -diff --git a/kernel/exit.c b/kernel/exit.c -index d8bd3b42..35ab292 100644 ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -143,7 +143,7 @@ static void __exit_signal(struct task_struct *tsk) +Index: linux-stable/kernel/exit.c +=================================================================== +--- linux-stable.orig/kernel/exit.c ++++ linux-stable/kernel/exit.c +@@ -155,7 +155,7 @@ static void __exit_signal(struct task_st * Do this under ->siglock, we can race with another thread * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. */ @@ -52,11 +52,11 @@ index d8bd3b42..35ab292 100644 tsk->sighand = NULL; spin_unlock(&sighand->siglock); -diff --git a/kernel/fork.c b/kernel/fork.c -index 8163333..b767e68 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1206,6 +1206,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -1239,6 +1239,7 @@ static struct task_struct *copy_process( spin_lock_init(&p->alloc_lock); init_sigpending(&p->pending); @@ -64,11 +64,11 @@ index 8163333..b767e68 100644 p->utime = p->stime = p->gtime = 0; p->utimescaled = p->stimescaled = 0; -diff --git a/kernel/signal.c b/kernel/signal.c -index 099746c..a05a4db 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -345,13 +345,45 @@ static bool task_participate_group_stop(struct task_struct *task) +Index: linux-stable/kernel/signal.c +=================================================================== +--- linux-stable.orig/kernel/signal.c ++++ linux-stable/kernel/signal.c +@@ -346,13 +346,45 @@ static bool task_participate_group_stop( return false; } @@ -115,7 +115,7 @@ index 099746c..a05a4db 100644 { struct sigqueue *q = NULL; struct user_struct *user; -@@ -368,7 +400,10 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi +@@ -369,7 +401,10 @@ __sigqueue_alloc(int sig, struct task_st if (override_rlimit || atomic_read(&user->sigpending) <= task_rlimit(t, RLIMIT_SIGPENDING)) { @@ -127,7 +127,7 @@ index 099746c..a05a4db 100644 } else { print_dropped_signal(sig); } -@@ -385,6 +420,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi +@@ -386,6 +421,13 @@ __sigqueue_alloc(int sig, struct task_st return q; } @@ -141,7 +141,7 @@ index 099746c..a05a4db 100644 static void __sigqueue_free(struct sigqueue *q) { if (q->flags & SIGQUEUE_PREALLOC) -@@ -394,6 +436,21 @@ static void __sigqueue_free(struct sigqueue *q) +@@ -395,6 +437,21 @@ static void __sigqueue_free(struct sigqu kmem_cache_free(sigqueue_cachep, q); } @@ -163,7 +163,7 @@ index 099746c..a05a4db 100644 void flush_sigqueue(struct sigpending *queue) { struct sigqueue *q; -@@ -407,6 +464,21 @@ void flush_sigqueue(struct sigpending *queue) +@@ -408,6 +465,21 @@ void flush_sigqueue(struct sigpending *q } /* @@ -185,7 +185,7 @@ index 099746c..a05a4db 100644 * Flush all pending signals for a task. */ void __flush_signals(struct task_struct *t) -@@ -555,7 +627,7 @@ static void collect_signal(int sig, struct sigpending *list, siginfo_t *info) +@@ -556,7 +628,7 @@ static void collect_signal(int sig, stru still_pending: list_del_init(&first->list); copy_siginfo(info, &first->info); @@ -194,7 +194,7 @@ index 099746c..a05a4db 100644 } else { /* * Ok, it wasn't in the queue. This must be -@@ -601,6 +673,8 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) +@@ -602,6 +674,8 @@ int dequeue_signal(struct task_struct *t { int signr; @@ -203,7 +203,7 @@ index 099746c..a05a4db 100644 /* We only dequeue private signals from ourselves, we don't let * signalfd steal them */ -@@ -1557,7 +1631,8 @@ EXPORT_SYMBOL(kill_pid); +@@ -1548,7 +1622,8 @@ EXPORT_SYMBOL(kill_pid); */ struct sigqueue *sigqueue_alloc(void) { diff --git a/debian/patches/features/all/rt/0020-signals-Do-not-wakeup-self.patch b/debian/patches/features/all/rt/signals-do-not-wake-self.patch similarity index 62% rename from debian/patches/features/all/rt/0020-signals-Do-not-wakeup-self.patch rename to debian/patches/features/all/rt/signals-do-not-wake-self.patch index 2c136149b..411045e93 100644 --- a/debian/patches/features/all/rt/0020-signals-Do-not-wakeup-self.patch +++ b/debian/patches/features/all/rt/signals-do-not-wake-self.patch @@ -1,21 +1,21 @@ -From d593d9a98592b53916884a81482f8102d7d591cf Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:44 -0500 -Subject: [020/256] signals: Do not wakeup self +Subject: signals: Do not wakeup self Signals which are delivered by current to current can do without waking up current :) Signed-off-by: Thomas Gleixner + --- kernel/signal.c | 3 +++ 1 file changed, 3 insertions(+) -diff --git a/kernel/signal.c b/kernel/signal.c -index 6b5071f..099746c 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -683,6 +683,9 @@ void signal_wake_up(struct task_struct *t, int resume) +Index: linux-stable/kernel/signal.c +=================================================================== +--- linux-stable.orig/kernel/signal.c ++++ linux-stable/kernel/signal.c +@@ -684,6 +684,9 @@ void signal_wake_up(struct task_struct * set_tsk_thread_flag(t, TIF_SIGPENDING); diff --git a/debian/patches/features/all/rt/0214-skbufhead-raw-lock.patch.patch b/debian/patches/features/all/rt/skbufhead-raw-lock.patch similarity index 71% rename from debian/patches/features/all/rt/0214-skbufhead-raw-lock.patch.patch rename to debian/patches/features/all/rt/skbufhead-raw-lock.patch index f250561a4..28a52ce68 100644 --- a/debian/patches/features/all/rt/0214-skbufhead-raw-lock.patch.patch +++ b/debian/patches/features/all/rt/skbufhead-raw-lock.patch @@ -1,7 +1,6 @@ -From b27d25a2928bb69b76ba3be5b4a2416a8106e7b2 Mon Sep 17 00:00:00 2001 +Subject: skbufhead-raw-lock.patch From: Thomas Gleixner Date: Tue, 12 Jul 2011 15:38:34 +0200 -Subject: [214/256] skbufhead-raw-lock.patch Signed-off-by: Thomas Gleixner --- @@ -10,22 +9,22 @@ Signed-off-by: Thomas Gleixner net/core/dev.c | 26 ++++++++++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index 33900a5..1fcc9ba 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -1734,6 +1734,7 @@ struct softnet_data { - unsigned dropped; +Index: linux-stable/include/linux/netdevice.h +=================================================================== +--- linux-stable.orig/include/linux/netdevice.h ++++ linux-stable/include/linux/netdevice.h +@@ -1765,6 +1765,7 @@ struct softnet_data { + unsigned int dropped; struct sk_buff_head input_pkt_queue; struct napi_struct backlog; + struct sk_buff_head tofree_queue; }; static inline void input_queue_head_incr(struct softnet_data *sd) -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h -index c168907..1a9b025 100644 ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h +Index: linux-stable/include/linux/skbuff.h +=================================================================== +--- linux-stable.orig/include/linux/skbuff.h ++++ linux-stable/include/linux/skbuff.h @@ -132,6 +132,7 @@ struct sk_buff_head { __u32 qlen; @@ -34,7 +33,7 @@ index c168907..1a9b025 100644 }; struct sk_buff; -@@ -967,6 +968,12 @@ static inline void skb_queue_head_init(struct sk_buff_head *list) +@@ -995,6 +996,12 @@ static inline void skb_queue_head_init(s __skb_queue_head_init(list); } @@ -47,11 +46,11 @@ index c168907..1a9b025 100644 static inline void skb_queue_head_init_class(struct sk_buff_head *list, struct lock_class_key *class) { -diff --git a/net/core/dev.c b/net/core/dev.c -index 8b645be..4e15710 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -220,14 +220,14 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -221,14 +221,14 @@ static inline struct hlist_head *dev_ind static inline void rps_lock(struct softnet_data *sd) { #ifdef CONFIG_RPS @@ -68,7 +67,7 @@ index 8b645be..4e15710 100644 #endif } -@@ -3327,7 +3327,7 @@ static void flush_backlog(void *arg) +@@ -3399,7 +3399,7 @@ static void flush_backlog(void *arg) skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) { if (skb->dev == dev) { __skb_unlink(skb, &sd->input_pkt_queue); @@ -77,7 +76,7 @@ index 8b645be..4e15710 100644 input_queue_head_incr(sd); } } -@@ -3336,10 +3336,13 @@ static void flush_backlog(void *arg) +@@ -3408,10 +3408,13 @@ static void flush_backlog(void *arg) skb_queue_walk_safe(&sd->process_queue, skb, tmp) { if (skb->dev == dev) { __skb_unlink(skb, &sd->process_queue); @@ -92,7 +91,7 @@ index 8b645be..4e15710 100644 } static int napi_gro_complete(struct sk_buff *skb) -@@ -3823,10 +3826,17 @@ static void net_rx_action(struct softirq_action *h) +@@ -3900,10 +3903,17 @@ static void net_rx_action(struct softirq struct softnet_data *sd = &__get_cpu_var(softnet_data); unsigned long time_limit = jiffies + 2; int budget = netdev_budget; @@ -110,7 +109,7 @@ index 8b645be..4e15710 100644 while (!list_empty(&sd->poll_list)) { struct napi_struct *n; int work, weight; -@@ -6253,6 +6263,9 @@ static int dev_cpu_callback(struct notifier_block *nfb, +@@ -6334,6 +6344,9 @@ static int dev_cpu_callback(struct notif netif_rx(skb); input_queue_head_incr(oldsd); } @@ -120,7 +119,7 @@ index 8b645be..4e15710 100644 return NOTIFY_OK; } -@@ -6516,8 +6529,9 @@ static int __init net_dev_init(void) +@@ -6598,8 +6611,9 @@ static int __init net_dev_init(void) struct softnet_data *sd = &per_cpu(softnet_data, i); memset(sd, 0, sizeof(*sd)); diff --git a/debian/patches/features/all/rt/0165-softirq-disable-softirq-stacks-for-rt.patch.patch b/debian/patches/features/all/rt/softirq-disable-softirq-stacks-for-rt.patch similarity index 57% rename from debian/patches/features/all/rt/0165-softirq-disable-softirq-stacks-for-rt.patch.patch rename to debian/patches/features/all/rt/softirq-disable-softirq-stacks-for-rt.patch index 4ce0782bd..c1e3500a4 100644 --- a/debian/patches/features/all/rt/0165-softirq-disable-softirq-stacks-for-rt.patch.patch +++ b/debian/patches/features/all/rt/softirq-disable-softirq-stacks-for-rt.patch @@ -1,7 +1,6 @@ -From 0a78fc3e819a0fbd2eb4a5e9c9741c6ba9c43a4f Mon Sep 17 00:00:00 2001 +Subject: softirq-disable-softirq-stacks-for-rt.patch From: Thomas Gleixner Date: Mon, 18 Jul 2011 13:59:17 +0200 -Subject: [165/256] softirq-disable-softirq-stacks-for-rt.patch Signed-off-by: Thomas Gleixner --- @@ -16,11 +15,11 @@ Signed-off-by: Thomas Gleixner include/linux/interrupt.h | 3 +-- 9 files changed, 17 insertions(+), 3 deletions(-) -diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c -index 641da9e..7841465 100644 ---- a/arch/powerpc/kernel/irq.c -+++ b/arch/powerpc/kernel/irq.c -@@ -538,6 +538,7 @@ void irq_ctx_init(void) +Index: linux-stable/arch/powerpc/kernel/irq.c +=================================================================== +--- linux-stable.orig/arch/powerpc/kernel/irq.c ++++ linux-stable/arch/powerpc/kernel/irq.c +@@ -584,6 +584,7 @@ void irq_ctx_init(void) } } @@ -28,7 +27,7 @@ index 641da9e..7841465 100644 static inline void do_softirq_onstack(void) { struct thread_info *curtp, *irqtp; -@@ -574,6 +575,7 @@ void do_softirq(void) +@@ -620,6 +621,7 @@ void do_softirq(void) local_irq_restore(flags); } @@ -36,10 +35,10 @@ index 641da9e..7841465 100644 irq_hw_number_t virq_to_hw(unsigned int virq) { -diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S -index 7cd07b4..46c6073 100644 ---- a/arch/powerpc/kernel/misc_32.S -+++ b/arch/powerpc/kernel/misc_32.S +Index: linux-stable/arch/powerpc/kernel/misc_32.S +=================================================================== +--- linux-stable.orig/arch/powerpc/kernel/misc_32.S ++++ linux-stable/arch/powerpc/kernel/misc_32.S @@ -36,6 +36,7 @@ .text @@ -56,10 +55,10 @@ index 7cd07b4..46c6073 100644 _GLOBAL(call_handle_irq) mflr r0 -diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S -index 616921e..2961d75 100644 ---- a/arch/powerpc/kernel/misc_64.S -+++ b/arch/powerpc/kernel/misc_64.S +Index: linux-stable/arch/powerpc/kernel/misc_64.S +=================================================================== +--- linux-stable.orig/arch/powerpc/kernel/misc_64.S ++++ linux-stable/arch/powerpc/kernel/misc_64.S @@ -29,6 +29,7 @@ .text @@ -76,10 +75,10 @@ index 616921e..2961d75 100644 _GLOBAL(call_handle_irq) ld r8,0(r6) -diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c -index a3ee919..9127bc0 100644 ---- a/arch/sh/kernel/irq.c -+++ b/arch/sh/kernel/irq.c +Index: linux-stable/arch/sh/kernel/irq.c +=================================================================== +--- linux-stable.orig/arch/sh/kernel/irq.c ++++ linux-stable/arch/sh/kernel/irq.c @@ -149,6 +149,7 @@ void irq_ctx_exit(int cpu) hardirq_ctx[cpu] = NULL; } @@ -96,11 +95,11 @@ index a3ee919..9127bc0 100644 #else static inline void handle_one_irq(unsigned int irq) { -diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c -index dff2c3d..618d4c2 100644 ---- a/arch/sparc/kernel/irq_64.c -+++ b/arch/sparc/kernel/irq_64.c -@@ -698,6 +698,7 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs) +Index: linux-stable/arch/sparc/kernel/irq_64.c +=================================================================== +--- linux-stable.orig/arch/sparc/kernel/irq_64.c ++++ linux-stable/arch/sparc/kernel/irq_64.c +@@ -698,6 +698,7 @@ void __irq_entry handler_irq(int pil, st set_irq_regs(old_regs); } @@ -116,11 +115,11 @@ index dff2c3d..618d4c2 100644 #ifdef CONFIG_HOTPLUG_CPU void fixup_irqs(void) -diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S -index cdc79b5..1bfb07b 100644 ---- a/arch/x86/kernel/entry_64.S -+++ b/arch/x86/kernel/entry_64.S -@@ -1240,6 +1240,7 @@ ENTRY(kernel_execve) +Index: linux-stable/arch/x86/kernel/entry_64.S +=================================================================== +--- linux-stable.orig/arch/x86/kernel/entry_64.S ++++ linux-stable/arch/x86/kernel/entry_64.S +@@ -1252,6 +1252,7 @@ ENTRY(kernel_execve) CFI_ENDPROC END(kernel_execve) @@ -128,7 +127,7 @@ index cdc79b5..1bfb07b 100644 /* Call softirq on interrupt stack. Interrupts are off. */ ENTRY(call_softirq) CFI_STARTPROC -@@ -1259,6 +1260,7 @@ ENTRY(call_softirq) +@@ -1271,6 +1272,7 @@ ENTRY(call_softirq) ret CFI_ENDPROC END(call_softirq) @@ -136,10 +135,10 @@ index cdc79b5..1bfb07b 100644 #ifdef CONFIG_XEN zeroentry xen_hypervisor_callback xen_do_hypervisor_callback -diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c -index 58b7f27..a7b4e1b 100644 ---- a/arch/x86/kernel/irq_32.c -+++ b/arch/x86/kernel/irq_32.c +Index: linux-stable/arch/x86/kernel/irq_32.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/irq_32.c ++++ linux-stable/arch/x86/kernel/irq_32.c @@ -149,6 +149,7 @@ void __cpuinit irq_ctx_init(int cpu) cpu, per_cpu(hardirq_ctx, cpu), per_cpu(softirq_ctx, cpu)); } @@ -156,11 +155,11 @@ index 58b7f27..a7b4e1b 100644 bool handle_irq(unsigned irq, struct pt_regs *regs) { -diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c -index d04d3ec..831f247 100644 ---- a/arch/x86/kernel/irq_64.c -+++ b/arch/x86/kernel/irq_64.c -@@ -88,7 +88,7 @@ bool handle_irq(unsigned irq, struct pt_regs *regs) +Index: linux-stable/arch/x86/kernel/irq_64.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/irq_64.c ++++ linux-stable/arch/x86/kernel/irq_64.c +@@ -88,7 +88,7 @@ bool handle_irq(unsigned irq, struct pt_ return true; } @@ -174,11 +173,11 @@ index d04d3ec..831f247 100644 local_irq_restore(flags); } +#endif -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index e53bd8b..5dde591 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -454,10 +454,9 @@ struct softirq_action +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -448,10 +448,9 @@ struct softirq_action void (*action)(struct softirq_action *); }; diff --git a/debian/patches/features/all/rt/0162-softirq-Export-in_serving_softirq.patch b/debian/patches/features/all/rt/softirq-export-in-serving-softirq.patch similarity index 69% rename from debian/patches/features/all/rt/0162-softirq-Export-in_serving_softirq.patch rename to debian/patches/features/all/rt/softirq-export-in-serving-softirq.patch index 910b639f8..0ddf8acd7 100644 --- a/debian/patches/features/all/rt/0162-softirq-Export-in_serving_softirq.patch +++ b/debian/patches/features/all/rt/softirq-export-in-serving-softirq.patch @@ -1,7 +1,6 @@ -From 87e052e01a12050b98d72bbbce9e31321ab891a7 Mon Sep 17 00:00:00 2001 +Subject: softirq: Export in_serving_softirq() From: John Kacur Date: Mon, 14 Nov 2011 02:44:43 +0100 -Subject: [162/256] softirq: Export in_serving_softirq() ERROR: "in_serving_softirq" [net/sched/cls_cgroup.ko] undefined! @@ -12,15 +11,16 @@ Cc: Paul McKenney Cc: stable-rt@vger.kernel.org Link: http://lkml.kernel.org/r/1321235083-21756-2-git-send-email-jkacur@redhat.com Signed-off-by: Thomas Gleixner + --- kernel/softirq.c | 1 + 1 file changed, 1 insertion(+) -diff --git a/kernel/softirq.c b/kernel/softirq.c -index a6207be..5741cf7 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -439,6 +439,7 @@ int in_serving_softirq(void) +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -448,6 +448,7 @@ int in_serving_softirq(void) preempt_enable(); return res; } diff --git a/debian/patches/features/all/rt/0164-softirq-Fix-unplug-deadlock.patch b/debian/patches/features/all/rt/softirq-fix-unplug-deadlock.patch similarity index 78% rename from debian/patches/features/all/rt/0164-softirq-Fix-unplug-deadlock.patch rename to debian/patches/features/all/rt/softirq-fix-unplug-deadlock.patch index 2d2c34a31..302ee53cc 100644 --- a/debian/patches/features/all/rt/0164-softirq-Fix-unplug-deadlock.patch +++ b/debian/patches/features/all/rt/softirq-fix-unplug-deadlock.patch @@ -1,7 +1,10 @@ -From 47d14a163f22cc98ed1066403b17b834766de351 Mon Sep 17 00:00:00 2001 +Subject: softirq: Fix unplug deadlock +From: Peter Zijlstra +Date: Fri, 30 Sep 2011 15:59:16 +0200 + +Subject: [RT] softirq: Fix unplug deadlock From: Peter Zijlstra -Date: Fri, 30 Sep 2011 15:52:14 +0200 -Subject: [164/256] softirq: Fix unplug deadlock +Date: Fri Sep 30 15:52:14 CEST 2011 If ksoftirqd gets woken during hot-unplug, __thread_do_softirq() will call pin_current_cpu() which will block on the held cpu_hotplug.lock. @@ -27,11 +30,11 @@ Signed-off-by: Thomas Gleixner kernel/softirq.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 5741cf7..d1fdb91 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -1078,9 +1078,8 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb, +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -1087,9 +1087,8 @@ static int __cpuinit cpu_callback(struct int hotcpu = (unsigned long)hcpu; struct task_struct *p; @@ -42,7 +45,7 @@ index 5741cf7..d1fdb91 100644 p = kthread_create_on_node(run_ksoftirqd, hcpu, cpu_to_node(hotcpu), -@@ -1093,19 +1092,16 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb, +@@ -1102,19 +1101,16 @@ static int __cpuinit cpu_callback(struct per_cpu(ksoftirqd, hotcpu) = p; break; case CPU_ONLINE: diff --git a/debian/patches/features/all/rt/softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch b/debian/patches/features/all/rt/softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch new file mode 100644 index 000000000..5f0cdf3b7 --- /dev/null +++ b/debian/patches/features/all/rt/softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch @@ -0,0 +1,135 @@ +Subject: softirq: Init softirq local lock after per cpu section is set up +From: Steven Rostedt +Date: Thu, 04 Oct 2012 11:02:04 -0400 + +I discovered this bug when booting 3.4-rt on my powerpc box. It crashed +with the following report: + +------------[ cut here ]------------ +kernel BUG at /work/rt/stable-rt.git/kernel/rtmutex_common.h:75! +Oops: Exception in kernel mode, sig: 5 [#1] +PREEMPT SMP NR_CPUS=64 NUMA PA Semi PWRficient +Modules linked in: +NIP: c0000000004aa03c LR: c0000000004aa01c CTR: c00000000009b2ac +REGS: c00000003e8d7950 TRAP: 0700 Not tainted (3.4.11-test-rt19) +MSR: 9000000000029032 CR: 24000082 XER: 20000000 +SOFTE: 0 +TASK = c00000003e8fdcd0[11] 'ksoftirqd/1' THREAD: c00000003e8d4000 CPU: 1 +GPR00: 0000000000000001 c00000003e8d7bd0 c000000000d6cbb0 0000000000000000 +GPR04: c00000003e8fdcd0 0000000000000000 0000000024004082 c000000000011454 +GPR08: 0000000000000000 0000000080000001 c00000003e8fdcd1 0000000000000000 +GPR12: 0000000024000084 c00000000fff0280 ffffffffffffffff 000000003ffffad8 +GPR16: ffffffffffffffff 000000000072c798 0000000000000060 0000000000000000 +GPR20: 0000000000642741 000000000072c858 000000003ffffaf0 0000000000000417 +GPR24: 000000000072dcd0 c00000003e7ff990 0000000000000000 0000000000000001 +GPR28: 0000000000000000 c000000000792340 c000000000ccec78 c000000001182338 +NIP [c0000000004aa03c] .wakeup_next_waiter+0x44/0xb8 +LR [c0000000004aa01c] .wakeup_next_waiter+0x24/0xb8 +Call Trace: +[c00000003e8d7bd0] [c0000000004aa01c] .wakeup_next_waiter+0x24/0xb8 (unreliable) +[c00000003e8d7c60] [c0000000004a0320] .rt_spin_lock_slowunlock+0x8c/0xe4 +[c00000003e8d7ce0] [c0000000004a07cc] .rt_spin_unlock+0x54/0x64 +[c00000003e8d7d60] [c0000000000636bc] .__thread_do_softirq+0x130/0x174 +[c00000003e8d7df0] [c00000000006379c] .run_ksoftirqd+0x9c/0x1a4 +[c00000003e8d7ea0] [c000000000080b68] .kthread+0xa8/0xb4 +[c00000003e8d7f90] [c00000000001c2f8] .kernel_thread+0x54/0x70 +Instruction dump: +60000000 e86d01c8 38630730 4bff7061 60000000 ebbf0008 7c7c1b78 e81d0040 +7fe00278 7c000074 7800d182 68000001 <0b000000> e88d01c8 387d0010 38840738 + +The rtmutex_common.h:75 is: + +rt_mutex_top_waiter(struct rt_mutex *lock) +{ + struct rt_mutex_waiter *w; + + w = plist_first_entry(&lock->wait_list, struct rt_mutex_waiter, + list_entry); + BUG_ON(w->lock != lock); + + return w; +} + +Where the waiter->lock is corrupted. I saw various other random bugs +that all had to with the softirq lock and plist. As plist needs to be +initialized before it is used I investigated how this lock is +initialized. It's initialized with: + +void __init softirq_early_init(void) +{ + local_irq_lock_init(local_softirq_lock); +} + +Where: + +#define local_irq_lock_init(lvar) \ + do { \ + int __cpu; \ + for_each_possible_cpu(__cpu) \ + spin_lock_init(&per_cpu(lvar, __cpu).lock); \ + } while (0) + +As the softirq lock is a local_irq_lock, which is a per_cpu lock, the +initialization is done to all per_cpu versions of the lock. But lets +look at where the softirq_early_init() is called from. + +In init/main.c: start_kernel() + +/* + * Interrupts are still disabled. Do necessary setups, then + * enable them + */ + softirq_early_init(); + tick_init(); + boot_cpu_init(); + page_address_init(); + printk(KERN_NOTICE "%s", linux_banner); + setup_arch(&command_line); + mm_init_owner(&init_mm, &init_task); + mm_init_cpumask(&init_mm); + setup_command_line(command_line); + setup_nr_cpu_ids(); + setup_per_cpu_areas(); + smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ + +One of the first things that is called is the initialization of the +softirq lock. But if you look further down, we see the per_cpu areas +have not been set up yet. Thus initializing a local_irq_lock() before +the per_cpu section is set up, may not work as it is initializing the +per cpu locks before the per cpu exists. + +By moving the softirq_early_init() right after setup_per_cpu_areas(), +the kernel boots fine. + +Signed-off-by: Steven Rostedt +Cc: Clark Williams +Cc: John Kacur +Cc: Carsten Emde +Cc: vomlehn@texas.net +Link: http://lkml.kernel.org/r/1349362924.6755.18.camel@gandalf.local.home +Signed-off-by: Thomas Gleixner + +--- + init/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux-stable/init/main.c +=================================================================== +--- linux-stable.orig/init/main.c ++++ linux-stable/init/main.c +@@ -491,7 +491,6 @@ asmlinkage void __init start_kernel(void + * Interrupts are still disabled. Do necessary setups, then + * enable them + */ +- softirq_early_init(); + tick_init(); + boot_cpu_init(); + page_address_init(); +@@ -502,6 +501,7 @@ asmlinkage void __init start_kernel(void + setup_command_line(command_line); + setup_nr_cpu_ids(); + setup_per_cpu_areas(); ++ softirq_early_init(); + smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ + + build_all_zonelists(NULL, NULL); diff --git a/debian/patches/features/all/rt/0161-softirq-local-lock.patch.patch b/debian/patches/features/all/rt/softirq-local-lock.patch similarity index 80% rename from debian/patches/features/all/rt/0161-softirq-local-lock.patch.patch rename to debian/patches/features/all/rt/softirq-local-lock.patch index 1917638f7..640d88c75 100644 --- a/debian/patches/features/all/rt/0161-softirq-local-lock.patch.patch +++ b/debian/patches/features/all/rt/softirq-local-lock.patch @@ -1,21 +1,20 @@ -From 1f07442472223feea29df54cfe6dd782aaeef0db Mon Sep 17 00:00:00 2001 +Subject: softirq-local-lock.patch From: Thomas Gleixner Date: Tue, 28 Jun 2011 15:57:18 +0200 -Subject: [161/256] softirq-local-lock.patch Signed-off-by: Thomas Gleixner --- - include/linux/hardirq.h | 16 ++++- - include/linux/interrupt.h | 12 ++++ - include/linux/sched.h | 1 + - init/main.c | 1 + - kernel/softirq.c | 166 ++++++++++++++++++++++++++++++++++++++++++++- + include/linux/hardirq.h | 16 +++- + include/linux/interrupt.h | 12 +++ + include/linux/sched.h | 1 + init/main.c | 1 + kernel/softirq.c | 166 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 191 insertions(+), 5 deletions(-) -diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h -index bb7f309..cbd7c99 100644 ---- a/include/linux/hardirq.h -+++ b/include/linux/hardirq.h +Index: linux-stable/include/linux/hardirq.h +=================================================================== +--- linux-stable.orig/include/linux/hardirq.h ++++ linux-stable/include/linux/hardirq.h @@ -60,7 +60,11 @@ #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) #define NMI_OFFSET (1UL << NMI_SHIFT) @@ -56,11 +55,11 @@ index bb7f309..cbd7c99 100644 /* * Are we in NMI context? -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index d3b1727..e53bd8b 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -456,7 +456,13 @@ struct softirq_action +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -450,7 +450,13 @@ struct softirq_action asmlinkage void do_softirq(void); asmlinkage void __do_softirq(void); @@ -74,7 +73,7 @@ index d3b1727..e53bd8b 100644 extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void softirq_init(void); extern void __raise_softirq_irqoff(unsigned int nr); -@@ -643,6 +649,12 @@ void tasklet_hrtimer_cancel(struct tasklet_hrtimer *ttimer) +@@ -637,6 +643,12 @@ void tasklet_hrtimer_cancel(struct taskl tasklet_kill(&ttimer->tasklet); } @@ -87,11 +86,11 @@ index d3b1727..e53bd8b 100644 /* * Autoprobing for irqs: * -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 01f2d96..372c15d 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1645,6 +1645,7 @@ struct task_struct { +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1617,6 +1617,7 @@ struct task_struct { #endif #ifdef CONFIG_PREEMPT_RT_BASE struct rcu_head put_rcu; @@ -99,11 +98,11 @@ index 01f2d96..372c15d 100644 #endif }; -diff --git a/init/main.c b/init/main.c -index 7896ec9..f07f2b0 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -490,6 +490,7 @@ asmlinkage void __init start_kernel(void) +Index: linux-stable/init/main.c +=================================================================== +--- linux-stable.orig/init/main.c ++++ linux-stable/init/main.c +@@ -491,6 +491,7 @@ asmlinkage void __init start_kernel(void * Interrupts are still disabled. Do necessary setups, then * enable them */ @@ -111,10 +110,10 @@ index 7896ec9..f07f2b0 100644 tick_init(); boot_cpu_init(); page_address_init(); -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 6f84f09..a6207be 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c @@ -24,6 +24,7 @@ #include #include @@ -123,7 +122,7 @@ index 6f84f09..a6207be 100644 #define CREATE_TRACE_POINTS #include -@@ -165,6 +166,7 @@ static void handle_pending_softirqs(u32 pending, int cpu) +@@ -165,6 +166,7 @@ static void handle_pending_softirqs(u32 local_irq_disable(); } @@ -131,7 +130,7 @@ index 6f84f09..a6207be 100644 /* * preempt_count and SOFTIRQ_OFFSET usage: * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving -@@ -368,6 +370,162 @@ asmlinkage void do_softirq(void) +@@ -377,6 +379,162 @@ asmlinkage void do_softirq(void) #endif @@ -294,7 +293,7 @@ index 6f84f09..a6207be 100644 /* * Enter an interrupt context. */ -@@ -381,9 +539,9 @@ void irq_enter(void) +@@ -390,9 +548,9 @@ void irq_enter(void) * Prevent raise_softirq from needlessly waking up ksoftirqd * here, as softirq will be serviced on return from interrupt. */ @@ -306,7 +305,7 @@ index 6f84f09..a6207be 100644 } __irq_enter(); -@@ -391,6 +549,7 @@ void irq_enter(void) +@@ -400,6 +558,7 @@ void irq_enter(void) static inline void invoke_softirq(void) { @@ -314,7 +313,7 @@ index 6f84f09..a6207be 100644 if (!force_irqthreads) { #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED __do_softirq(); -@@ -403,6 +562,9 @@ static inline void invoke_softirq(void) +@@ -412,6 +571,9 @@ static inline void invoke_softirq(void) wakeup_softirqd(); __local_bh_enable(SOFTIRQ_OFFSET); } diff --git a/debian/patches/features/all/rt/0166-softirq-make-fifo.patch.patch b/debian/patches/features/all/rt/softirq-make-fifo.patch similarity index 74% rename from debian/patches/features/all/rt/0166-softirq-make-fifo.patch.patch rename to debian/patches/features/all/rt/softirq-make-fifo.patch index 9c34b6fb4..9286dc5e7 100644 --- a/debian/patches/features/all/rt/0166-softirq-make-fifo.patch.patch +++ b/debian/patches/features/all/rt/softirq-make-fifo.patch @@ -1,18 +1,17 @@ -From fc0e323ce062c258ce7a7d0eca1a6a0570b1f168 Mon Sep 17 00:00:00 2001 +Subject: softirq-make-fifo.patch From: Thomas Gleixner Date: Thu, 21 Jul 2011 21:06:43 +0200 -Subject: [166/256] softirq-make-fifo.patch Signed-off-by: Thomas Gleixner --- kernel/softirq.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) -diff --git a/kernel/softirq.c b/kernel/softirq.c -index d1fdb91..86561c0 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -372,6 +372,8 @@ asmlinkage void do_softirq(void) +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -381,6 +381,8 @@ asmlinkage void do_softirq(void) static inline void local_bh_disable_nort(void) { local_bh_disable(); } static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } @@ -21,7 +20,7 @@ index d1fdb91..86561c0 100644 #else /* !PREEMPT_RT_FULL */ -@@ -526,6 +528,20 @@ static int ksoftirqd_do_softirq(int cpu) +@@ -535,6 +537,20 @@ static int ksoftirqd_do_softirq(int cpu) static inline void local_bh_disable_nort(void) { } static inline void _local_bh_enable_nort(void) { } @@ -42,7 +41,7 @@ index d1fdb91..86561c0 100644 #endif /* PREEMPT_RT_FULL */ /* * Enter an interrupt context. -@@ -977,6 +993,8 @@ void __init softirq_init(void) +@@ -986,6 +1002,8 @@ void __init softirq_init(void) static int run_ksoftirqd(void * __bind_cpu) { @@ -51,7 +50,7 @@ index d1fdb91..86561c0 100644 set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { -@@ -1002,6 +1020,7 @@ static int run_ksoftirqd(void * __bind_cpu) +@@ -1011,6 +1029,7 @@ static int run_ksoftirqd(void * __bind_c wait_to_die: preempt_enable(); diff --git a/debian/patches/features/all/rt/softirq-make-serving-softirqs-a-task-flag.patch b/debian/patches/features/all/rt/softirq-make-serving-softirqs-a-task-flag.patch new file mode 100644 index 000000000..e290a6747 --- /dev/null +++ b/debian/patches/features/all/rt/softirq-make-serving-softirqs-a-task-flag.patch @@ -0,0 +1,78 @@ +Subject: softirq: Make serving softirqs a task flag +From: Thomas Gleixner +Date: Thu, 04 Oct 2012 14:30:25 +0100 + +Avoid the percpu softirq_runner pointer magic by using a task flag. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 1 + + kernel/softirq.c | 20 +++----------------- + 2 files changed, 4 insertions(+), 17 deletions(-) + +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1845,6 +1845,7 @@ extern void thread_group_times(struct ta + #define PF_MEMALLOC 0x00000800 /* Allocating memory */ + #define PF_NPROC_EXCEEDED 0x00001000 /* set_user noticed that RLIMIT_NPROC was exceeded */ + #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ ++#define PF_IN_SOFTIRQ 0x00004000 /* Task is serving softirq */ + #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ + #define PF_FROZEN 0x00010000 /* frozen for system suspend */ + #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -392,7 +392,6 @@ static inline void ksoftirqd_clr_sched_p + * On RT we serialize softirq execution with a cpu local lock + */ + static DEFINE_LOCAL_IRQ_LOCK(local_softirq_lock); +-static DEFINE_PER_CPU(struct task_struct *, local_softirq_runner); + + static void __do_softirq_common(int need_rcu_bh_qs); + +@@ -447,22 +446,9 @@ void _local_bh_enable(void) + } + EXPORT_SYMBOL(_local_bh_enable); + +-/* For tracing */ +-int notrace __in_softirq(void) +-{ +- if (__get_cpu_var(local_softirq_lock).owner == current) +- return __get_cpu_var(local_softirq_lock).nestcnt; +- return 0; +-} +- + int in_serving_softirq(void) + { +- int res; +- +- preempt_disable(); +- res = __get_cpu_var(local_softirq_runner) == current; +- preempt_enable(); +- return res; ++ return current->flags & PF_IN_SOFTIRQ; + } + EXPORT_SYMBOL(in_serving_softirq); + +@@ -480,7 +466,7 @@ static void __do_softirq_common(int need + /* Reset the pending bitmask before enabling irqs */ + set_softirq_pending(0); + +- __get_cpu_var(local_softirq_runner) = current; ++ current->flags |= PF_IN_SOFTIRQ; + + lockdep_softirq_enter(); + +@@ -491,7 +477,7 @@ static void __do_softirq_common(int need + wakeup_softirqd(); + + lockdep_softirq_exit(); +- __get_cpu_var(local_softirq_runner) = NULL; ++ current->flags &= ~PF_IN_SOFTIRQ; + + current->softirq_nestcnt--; + } diff --git a/debian/patches/features/all/rt/0241-softirq-Check-preemption-after-reenabling-interrupts.patch b/debian/patches/features/all/rt/softirq-preempt-fix-3-re.patch similarity index 69% rename from debian/patches/features/all/rt/0241-softirq-Check-preemption-after-reenabling-interrupts.patch rename to debian/patches/features/all/rt/softirq-preempt-fix-3-re.patch index f05cff921..040053e82 100644 --- a/debian/patches/features/all/rt/0241-softirq-Check-preemption-after-reenabling-interrupts.patch +++ b/debian/patches/features/all/rt/softirq-preempt-fix-3-re.patch @@ -1,7 +1,6 @@ -From d0af9326880d64fe4c2d2940e692c6bc93031d64 Mon Sep 17 00:00:00 2001 +Subject: softirq: Check preemption after reenabling interrupts From: Thomas Gleixner -Date: Sun, 13 Nov 2011 17:17:09 +0100 -Subject: [241/256] softirq: Check preemption after reenabling interrupts +Date: Sun, 13 Nov 2011 17:17:09 +0100 (CET) raise_softirq_irqoff() disables interrupts and wakes the softirq daemon, but after reenabling interrupts there is no preemption check, @@ -21,11 +20,11 @@ Cc: stable-rt@vger.kernel.org net/core/dev.c | 6 ++++++ 4 files changed, 15 insertions(+) -diff --git a/block/blk-iopoll.c b/block/blk-iopoll.c -index 58916af..f7ca9b4 100644 ---- a/block/blk-iopoll.c -+++ b/block/blk-iopoll.c -@@ -38,6 +38,7 @@ void blk_iopoll_sched(struct blk_iopoll *iop) +Index: linux-stable/block/blk-iopoll.c +=================================================================== +--- linux-stable.orig/block/blk-iopoll.c ++++ linux-stable/block/blk-iopoll.c +@@ -38,6 +38,7 @@ void blk_iopoll_sched(struct blk_iopoll list_add_tail(&iop->list, &__get_cpu_var(blk_cpu_iopoll)); __raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ); local_irq_restore(flags); @@ -33,7 +32,7 @@ index 58916af..f7ca9b4 100644 } EXPORT_SYMBOL(blk_iopoll_sched); -@@ -135,6 +136,7 @@ static void blk_iopoll_softirq(struct softirq_action *h) +@@ -135,6 +136,7 @@ static void blk_iopoll_softirq(struct so __raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ); local_irq_enable(); @@ -41,7 +40,7 @@ index 58916af..f7ca9b4 100644 } /** -@@ -204,6 +206,7 @@ static int __cpuinit blk_iopoll_cpu_notify(struct notifier_block *self, +@@ -204,6 +206,7 @@ static int __cpuinit blk_iopoll_cpu_noti &__get_cpu_var(blk_cpu_iopoll)); __raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ); local_irq_enable(); @@ -49,10 +48,10 @@ index 58916af..f7ca9b4 100644 } return NOTIFY_OK; -diff --git a/block/blk-softirq.c b/block/blk-softirq.c -index 467c8de..3fe2368 100644 ---- a/block/blk-softirq.c -+++ b/block/blk-softirq.c +Index: linux-stable/block/blk-softirq.c +=================================================================== +--- linux-stable.orig/block/blk-softirq.c ++++ linux-stable/block/blk-softirq.c @@ -51,6 +51,7 @@ static void trigger_softirq(void *data) raise_softirq_irqoff(BLOCK_SOFTIRQ); @@ -61,7 +60,7 @@ index 467c8de..3fe2368 100644 } /* -@@ -93,6 +94,7 @@ static int __cpuinit blk_cpu_notify(struct notifier_block *self, +@@ -93,6 +94,7 @@ static int __cpuinit blk_cpu_notify(stru &__get_cpu_var(blk_cpu_done)); raise_softirq_irqoff(BLOCK_SOFTIRQ); local_irq_enable(); @@ -77,10 +76,10 @@ index 467c8de..3fe2368 100644 } /** -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 5af46d0..5e71285 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h +Index: linux-stable/include/linux/preempt.h +=================================================================== +--- linux-stable.orig/include/linux/preempt.h ++++ linux-stable/include/linux/preempt.h @@ -56,8 +56,10 @@ do { \ #ifndef CONFIG_PREEMPT_RT_BASE @@ -100,11 +99,11 @@ index 5af46d0..5e71285 100644 #endif /* CONFIG_PREEMPT_COUNT */ -diff --git a/net/core/dev.c b/net/core/dev.c -index 252c15a..292930b 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -1807,6 +1807,7 @@ static inline void __netif_reschedule(struct Qdisc *q) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -1836,6 +1836,7 @@ static inline void __netif_reschedule(st sd->output_queue_tailp = &q->next_sched; raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_restore(flags); @@ -112,7 +111,7 @@ index 252c15a..292930b 100644 } void __netif_schedule(struct Qdisc *q) -@@ -1828,6 +1829,7 @@ void dev_kfree_skb_irq(struct sk_buff *skb) +@@ -1857,6 +1858,7 @@ void dev_kfree_skb_irq(struct sk_buff *s sd->completion_queue = skb; raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_restore(flags); @@ -120,7 +119,7 @@ index 252c15a..292930b 100644 } } EXPORT_SYMBOL(dev_kfree_skb_irq); -@@ -2897,6 +2899,7 @@ enqueue: +@@ -2927,6 +2929,7 @@ enqueue: rps_unlock(sd); local_irq_restore(flags); @@ -128,7 +127,7 @@ index 252c15a..292930b 100644 atomic_long_inc(&skb->dev->rx_dropped); kfree_skb(skb); -@@ -3710,6 +3713,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd) +@@ -3787,6 +3790,7 @@ static void net_rps_action_and_irq_enabl } else #endif local_irq_enable(); @@ -136,7 +135,7 @@ index 252c15a..292930b 100644 } static int process_backlog(struct napi_struct *napi, int quota) -@@ -3782,6 +3786,7 @@ void __napi_schedule(struct napi_struct *n) +@@ -3859,6 +3863,7 @@ void __napi_schedule(struct napi_struct local_irq_save(flags); ____napi_schedule(&__get_cpu_var(softnet_data), n); local_irq_restore(flags); @@ -144,7 +143,7 @@ index 252c15a..292930b 100644 } EXPORT_SYMBOL(__napi_schedule); -@@ -6283,6 +6288,7 @@ static int dev_cpu_callback(struct notifier_block *nfb, +@@ -6364,6 +6369,7 @@ static int dev_cpu_callback(struct notif raise_softirq_irqoff(NET_TX_SOFTIRQ); local_irq_enable(); diff --git a/debian/patches/features/all/rt/0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch b/debian/patches/features/all/rt/softirq-sanitize-softirq-pending.patch similarity index 74% rename from debian/patches/features/all/rt/0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch rename to debian/patches/features/all/rt/softirq-sanitize-softirq-pending.patch index ddaf6403c..ecc72b066 100644 --- a/debian/patches/features/all/rt/0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch +++ b/debian/patches/features/all/rt/softirq-sanitize-softirq-pending.patch @@ -1,20 +1,20 @@ -From 13b3cd058255b7a21cf6b1380ac872b6abea55ea Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 13:16:38 -0500 -Subject: [158/256] softirq: Sanitize softirq pending for NOHZ/RT +Subject: softirq: Sanitize softirq pending for NOHZ/RT Signed-off-by: Thomas Gleixner + --- - include/linux/interrupt.h | 2 ++ - kernel/softirq.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ - kernel/time/tick-sched.c | 8 +----- + include/linux/interrupt.h | 2 + + kernel/softirq.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++ + kernel/time/tick-sched.c | 8 ------ 3 files changed, 64 insertions(+), 7 deletions(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 9027bde..d3b1727 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -464,6 +464,8 @@ extern void __raise_softirq_irqoff(unsigned int nr); +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -458,6 +458,8 @@ extern void __raise_softirq_irqoff(unsig extern void raise_softirq_irqoff(unsigned int nr); extern void raise_softirq(unsigned int nr); @@ -23,10 +23,10 @@ index 9027bde..d3b1727 100644 /* This is the worklist that queues up per-cpu softirq work. * * send_remote_sendirq() adds work to these lists, and -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 6ec3a78..6f84f09 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c @@ -61,6 +61,67 @@ char *softirq_to_name[NR_SOFTIRQS] = { "TASKLET", "SCHED", "HRTIMER", "RCU" }; @@ -95,12 +95,12 @@ index 6ec3a78..6f84f09 100644 /* * we cannot loop indefinitely here to avoid userspace starvation, * but we also don't want to introduce a worst case 1/HZ latency -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 5d409b0..9f958cb 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -307,13 +307,7 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts) - return; +Index: linux-stable/kernel/time/tick-sched.c +=================================================================== +--- linux-stable.orig/kernel/time/tick-sched.c ++++ linux-stable/kernel/time/tick-sched.c +@@ -438,13 +438,7 @@ static bool can_stop_idle_tick(int cpu, + return false; if (unlikely(local_softirq_pending() && cpu_online(cpu))) { - static int ratelimit; @@ -111,6 +111,6 @@ index 5d409b0..9f958cb 100644 - ratelimit++; - } + softirq_check_pending_idle(); - return; + return false; } diff --git a/debian/patches/features/all/rt/softirq-split-handling-function.patch b/debian/patches/features/all/rt/softirq-split-handling-function.patch new file mode 100644 index 000000000..f81c0292d --- /dev/null +++ b/debian/patches/features/all/rt/softirq-split-handling-function.patch @@ -0,0 +1,70 @@ +Subject: softirq: Split handling function +From: Thomas Gleixner +Date: Thu, 04 Oct 2012 15:33:53 +0100 + +Split out the inner handling function, so RT can reuse it. + +Signed-off-by: Thomas Gleixner +--- + kernel/softirq.c | 43 +++++++++++++++++++++++-------------------- + 1 file changed, 23 insertions(+), 20 deletions(-) + +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -139,31 +139,34 @@ static void wakeup_softirqd(void) + wake_up_process(tsk); + } + +-static void handle_pending_softirqs(u32 pending, int cpu, int need_rcu_bh_qs) ++static void handle_softirq(unsigned int vec_nr, int cpu, int need_rcu_bh_qs) + { +- struct softirq_action *h = softirq_vec; ++ struct softirq_action *h = softirq_vec + vec_nr; + unsigned int prev_count = preempt_count(); + +- local_irq_enable(); +- for ( ; pending; h++, pending >>= 1) { +- unsigned int vec_nr = h - softirq_vec; ++ kstat_incr_softirqs_this_cpu(vec_nr); ++ trace_softirq_entry(vec_nr); ++ h->action(h); ++ trace_softirq_exit(vec_nr); ++ ++ if (unlikely(prev_count != preempt_count())) { ++ pr_err("softirq %u %s %p preempt count leak: %08x -> %08x\n", ++ vec_nr, softirq_to_name[vec_nr], h->action, ++ prev_count, (unsigned int) preempt_count()); ++ preempt_count() = prev_count; ++ } ++ if (need_rcu_bh_qs) ++ rcu_bh_qs(cpu); ++} + +- if (!(pending & 1)) +- continue; ++static void handle_pending_softirqs(u32 pending, int cpu, int need_rcu_bh_qs) ++{ ++ unsigned int vec_nr; + +- kstat_incr_softirqs_this_cpu(vec_nr); +- trace_softirq_entry(vec_nr); +- h->action(h); +- trace_softirq_exit(vec_nr); +- if (unlikely(prev_count != preempt_count())) { +- printk(KERN_ERR +- "huh, entered softirq %u %s %p with preempt_count %08x exited with %08x?\n", +- vec_nr, softirq_to_name[vec_nr], h->action, +- prev_count, (unsigned int) preempt_count()); +- preempt_count() = prev_count; +- } +- if (need_rcu_bh_qs) +- rcu_bh_qs(cpu); ++ local_irq_enable(); ++ for (vec_nr = 0; pending; vec_nr++, pending >>= 1) { ++ if (pending & 1) ++ handle_softirq(vec_nr, cpu, need_rcu_bh_qs); + } + local_irq_disable(); + } diff --git a/debian/patches/features/all/rt/softirq-split-locks.patch b/debian/patches/features/all/rt/softirq-split-locks.patch new file mode 100644 index 000000000..b9f3625ec --- /dev/null +++ b/debian/patches/features/all/rt/softirq-split-locks.patch @@ -0,0 +1,443 @@ +Subject: softirq: Split softirq locks +From: Thomas Gleixner +Date: Thu, 04 Oct 2012 14:20:47 +0100 + +The 3.x RT series removed the split softirq implementation in favour +of pushing softirq processing into the context of the thread which +raised it. Though this prevents us from handling the various softirqs +at different priorities. Now instead of reintroducing the split +softirq threads we split the locks which serialize the softirq +processing. + +If a softirq is raised in context of a thread, then the softirq is +noted on a per thread field, if the thread is in a bh disabled +region. If the softirq is raised from hard interrupt context, then the +bit is set in the flag field of ksoftirqd and ksoftirqd is invoked. +When a thread leaves a bh disabled region, then it tries to execute +the softirqs which have been raised in its own context. It acquires +the per softirq / per cpu lock for the softirq and then checks, +whether the softirq is still pending in the per cpu +local_softirq_pending() field. If yes, it runs the softirq. If no, +then some other task executed it already. This allows for zero config +softirq elevation in the context of user space tasks or interrupt +threads. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 1 + kernel/softirq.c | 281 ++++++++++++++++++++++++++++++++------------------ + 2 files changed, 183 insertions(+), 99 deletions(-) + +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1619,6 +1619,7 @@ struct task_struct { + #ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head put_rcu; + int softirq_nestcnt; ++ unsigned int softirqs_raised; + #endif + #if defined CONFIG_PREEMPT_RT_FULL && defined CONFIG_HIGHMEM + int kmap_idx; +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c +@@ -159,6 +159,7 @@ static void handle_softirq(unsigned int + rcu_bh_qs(cpu); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + static void handle_pending_softirqs(u32 pending, int cpu, int need_rcu_bh_qs) + { + unsigned int vec_nr; +@@ -171,7 +172,6 @@ static void handle_pending_softirqs(u32 + local_irq_disable(); + } + +-#ifndef CONFIG_PREEMPT_RT_FULL + /* + * preempt_count and SOFTIRQ_OFFSET usage: + * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving +@@ -384,28 +384,117 @@ asmlinkage void do_softirq(void) + + #endif + ++/* ++ * This function must run with irqs disabled! ++ */ ++void raise_softirq_irqoff(unsigned int nr) ++{ ++ __raise_softirq_irqoff(nr); ++ ++ /* ++ * If we're in an interrupt or softirq, we're done ++ * (this also catches softirq-disabled code). We will ++ * actually run the softirq once we return from ++ * the irq or softirq. ++ * ++ * Otherwise we wake up ksoftirqd to make sure we ++ * schedule the softirq soon. ++ */ ++ if (!in_interrupt()) ++ wakeup_softirqd(); ++} ++ ++void __raise_softirq_irqoff(unsigned int nr) ++{ ++ trace_softirq_raise(nr); ++ or_softirq_pending(1UL << nr); ++} ++ + static inline void local_bh_disable_nort(void) { local_bh_disable(); } + static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } + static inline void ksoftirqd_set_sched_params(void) { } + static inline void ksoftirqd_clr_sched_params(void) { } + ++static inline int ksoftirqd_softirq_pending(void) ++{ ++ return local_softirq_pending(); ++} ++ + #else /* !PREEMPT_RT_FULL */ + + /* +- * On RT we serialize softirq execution with a cpu local lock ++ * On RT we serialize softirq execution with a cpu local lock per softirq + */ +-static DEFINE_LOCAL_IRQ_LOCK(local_softirq_lock); ++static DEFINE_PER_CPU(struct local_irq_lock [NR_SOFTIRQS], local_softirq_locks); + +-static void __do_softirq_common(int need_rcu_bh_qs); ++void __init softirq_early_init(void) ++{ ++ int i; + +-void __do_softirq(void) ++ for (i = 0; i < NR_SOFTIRQS; i++) ++ local_irq_lock_init(local_softirq_locks[i]); ++} ++ ++static void lock_softirq(int which) + { +- __do_softirq_common(0); ++ __local_lock(&__get_cpu_var(local_softirq_locks[which])); + } + +-void __init softirq_early_init(void) ++static void unlock_softirq(int which) ++{ ++ __local_unlock(&__get_cpu_var(local_softirq_locks[which])); ++} ++ ++static void do_single_softirq(int which, int need_rcu_bh_qs) ++{ ++ unsigned long old_flags = current->flags; ++ ++ current->flags &= ~PF_MEMALLOC; ++ account_system_vtime(current); ++ current->flags |= PF_IN_SOFTIRQ; ++ lockdep_softirq_enter(); ++ local_irq_enable(); ++ handle_softirq(which, smp_processor_id(), need_rcu_bh_qs); ++ local_irq_disable(); ++ lockdep_softirq_exit(); ++ current->flags &= ~PF_IN_SOFTIRQ; ++ account_system_vtime(current); ++ tsk_restore_flags(current, old_flags, PF_MEMALLOC); ++} ++ ++/* ++ * Called with interrupts disabled. Process softirqs which were raised ++ * in current context (or on behalf of ksoftirqd). ++ */ ++static void do_current_softirqs(int need_rcu_bh_qs) + { +- local_irq_lock_init(local_softirq_lock); ++ while (current->softirqs_raised) { ++ int i = __ffs(current->softirqs_raised); ++ unsigned int pending, mask = (1U << i); ++ ++ current->softirqs_raised &= ~mask; ++ local_irq_enable(); ++ ++ /* ++ * If the lock is contended, we boost the owner to ++ * process the softirq or leave the critical section ++ * now. ++ */ ++ lock_softirq(i); ++ local_irq_disable(); ++ /* ++ * Check with the local_softirq_pending() bits, ++ * whether we need to process this still or if someone ++ * else took care of it. ++ */ ++ pending = local_softirq_pending(); ++ if (pending & mask) { ++ set_softirq_pending(pending & ~mask); ++ do_single_softirq(i, need_rcu_bh_qs); ++ } ++ unlock_softirq(i); ++ WARN_ON(current->softirq_nestcnt != 1); ++ } + } + + void local_bh_disable(void) +@@ -420,17 +509,11 @@ void local_bh_enable(void) + if (WARN_ON(current->softirq_nestcnt == 0)) + return; + +- if ((current->softirq_nestcnt == 1) && +- local_softirq_pending() && +- local_trylock(local_softirq_lock)) { ++ local_irq_disable(); ++ if (current->softirq_nestcnt == 1 && current->softirqs_raised) ++ do_current_softirqs(1); ++ local_irq_enable(); + +- local_irq_disable(); +- if (local_softirq_pending()) +- __do_softirq(); +- local_irq_enable(); +- local_unlock(local_softirq_lock); +- WARN_ON(current->softirq_nestcnt != 1); +- } + current->softirq_nestcnt--; + migrate_enable(); + } +@@ -455,37 +538,8 @@ int in_serving_softirq(void) + } + EXPORT_SYMBOL(in_serving_softirq); + +-/* +- * Called with bh and local interrupts disabled. For full RT cpu must +- * be pinned. +- */ +-static void __do_softirq_common(int need_rcu_bh_qs) +-{ +- u32 pending = local_softirq_pending(); +- int cpu = smp_processor_id(); +- +- current->softirq_nestcnt++; +- +- /* Reset the pending bitmask before enabling irqs */ +- set_softirq_pending(0); +- +- current->flags |= PF_IN_SOFTIRQ; +- +- lockdep_softirq_enter(); +- +- handle_pending_softirqs(pending, cpu, need_rcu_bh_qs); +- +- pending = local_softirq_pending(); +- if (pending) +- wakeup_softirqd(); +- +- lockdep_softirq_exit(); +- current->flags &= ~PF_IN_SOFTIRQ; +- +- current->softirq_nestcnt--; +-} +- +-static int __thread_do_softirq(int cpu) ++/* Called with preemption disabled */ ++static int ksoftirqd_do_softirq(int cpu) + { + /* + * Prevent the current cpu from going offline. +@@ -496,45 +550,90 @@ static int __thread_do_softirq(int cpu) + */ + pin_current_cpu(); + /* +- * If called from ksoftirqd (cpu >= 0) we need to check +- * whether we are on the wrong cpu due to cpu offlining. If +- * called via thread_do_softirq() no action required. ++ * We need to check whether we are on the wrong cpu due to cpu ++ * offlining. + */ +- if (cpu >= 0 && cpu_is_offline(cpu)) { ++ if (cpu_is_offline(cpu)) { + unpin_current_cpu(); + return -1; + } + preempt_enable(); +- local_lock(local_softirq_lock); + local_irq_disable(); +- /* +- * We cannot switch stacks on RT as we want to be able to +- * schedule! +- */ +- if (local_softirq_pending()) +- __do_softirq_common(cpu >= 0); +- local_unlock(local_softirq_lock); +- unpin_current_cpu(); +- preempt_disable(); ++ current->softirq_nestcnt++; ++ do_current_softirqs(1); ++ current->softirq_nestcnt--; + local_irq_enable(); ++ ++ preempt_disable(); ++ unpin_current_cpu(); + return 0; + } + + /* +- * Called from netif_rx_ni(). Preemption enabled. ++ * Called from netif_rx_ni(). Preemption enabled, but migration ++ * disabled. So the cpu can't go away under us. + */ + void thread_do_softirq(void) + { +- if (!in_serving_softirq()) { +- preempt_disable(); +- __thread_do_softirq(-1); +- preempt_enable(); ++ if (!in_serving_softirq() && current->softirqs_raised) { ++ current->softirq_nestcnt++; ++ do_current_softirqs(0); ++ current->softirq_nestcnt--; + } + } + +-static int ksoftirqd_do_softirq(int cpu) ++void __raise_softirq_irqoff(unsigned int nr) ++{ ++ trace_softirq_raise(nr); ++ or_softirq_pending(1UL << nr); ++ ++ /* ++ * If we are not in a hard interrupt and inside a bh disabled ++ * region, we simply raise the flag on current. local_bh_enable() ++ * will make sure that the softirq is executed. Otherwise we ++ * delegate it to ksoftirqd. ++ */ ++ if (!in_irq() && current->softirq_nestcnt) ++ current->softirqs_raised |= (1U << nr); ++ else if (__this_cpu_read(ksoftirqd)) ++ __this_cpu_read(ksoftirqd)->softirqs_raised |= (1U << nr); ++} ++ ++/* ++ * This function must run with irqs disabled! ++ */ ++void raise_softirq_irqoff(unsigned int nr) ++{ ++ __raise_softirq_irqoff(nr); ++ ++ /* ++ * If we're in an hard interrupt we let irq return code deal ++ * with the wakeup of ksoftirqd. ++ */ ++ if (in_irq()) ++ return; ++ ++ /* ++ * If we are in thread context but outside of a bh disabled ++ * region, we need to wake ksoftirqd as well. ++ * ++ * CHECKME: Some of the places which do that could be wrapped ++ * into local_bh_disable/enable pairs. Though it's unclear ++ * whether this is worth the effort. To find those places just ++ * raise a WARN() if the condition is met. ++ */ ++ if (!current->softirq_nestcnt) ++ wakeup_softirqd(); ++} ++ ++void do_raise_softirq_irqoff(unsigned int nr) ++{ ++ raise_softirq_irqoff(nr); ++} ++ ++static inline int ksoftirqd_softirq_pending(void) + { +- return __thread_do_softirq(cpu); ++ return current->softirqs_raised; + } + + static inline void local_bh_disable_nort(void) { } +@@ -545,6 +644,10 @@ static inline void ksoftirqd_set_sched_p + struct sched_param param = { .sched_priority = 1 }; + + sched_setscheduler(current, SCHED_FIFO, ¶m); ++ /* Take over all pending softirqs when starting */ ++ local_irq_disable(); ++ current->softirqs_raised = local_softirq_pending(); ++ local_irq_enable(); + } + + static inline void ksoftirqd_clr_sched_params(void) +@@ -591,8 +694,14 @@ static inline void invoke_softirq(void) + wakeup_softirqd(); + __local_bh_enable(SOFTIRQ_OFFSET); + } +-#else ++#else /* PREEMPT_RT_FULL */ ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ if (__this_cpu_read(ksoftirqd) && ++ __this_cpu_read(ksoftirqd)->softirqs_raised) + wakeup_softirqd(); ++ local_irq_restore(flags); + #endif + } + +@@ -616,26 +725,6 @@ void irq_exit(void) + sched_preempt_enable_no_resched(); + } + +-/* +- * This function must run with irqs disabled! +- */ +-inline void raise_softirq_irqoff(unsigned int nr) +-{ +- __raise_softirq_irqoff(nr); +- +- /* +- * If we're in an interrupt or softirq, we're done +- * (this also catches softirq-disabled code). We will +- * actually run the softirq once we return from +- * the irq or softirq. +- * +- * Otherwise we wake up ksoftirqd to make sure we +- * schedule the softirq soon. +- */ +- if (!in_interrupt()) +- wakeup_softirqd(); +-} +- + void raise_softirq(unsigned int nr) + { + unsigned long flags; +@@ -645,12 +734,6 @@ void raise_softirq(unsigned int nr) + local_irq_restore(flags); + } + +-void __raise_softirq_irqoff(unsigned int nr) +-{ +- trace_softirq_raise(nr); +- or_softirq_pending(1UL << nr); +-} +- + void open_softirq(int nr, void (*action)(struct softirq_action *)) + { + softirq_vec[nr].action = action; +@@ -1102,12 +1185,12 @@ static int run_ksoftirqd(void * __bind_c + + while (!kthread_should_stop()) { + preempt_disable(); +- if (!local_softirq_pending()) ++ if (!ksoftirqd_softirq_pending()) + schedule_preempt_disabled(); + + __set_current_state(TASK_RUNNING); + +- while (local_softirq_pending()) { ++ while (ksoftirqd_softirq_pending()) { + if (ksoftirqd_do_softirq((long) __bind_cpu)) + goto wait_to_die; + sched_preempt_enable_no_resched(); diff --git a/debian/patches/features/all/rt/0049-softirq-split-out-code.patch.patch b/debian/patches/features/all/rt/softirq-split-out-code.patch similarity index 88% rename from debian/patches/features/all/rt/0049-softirq-split-out-code.patch.patch rename to debian/patches/features/all/rt/softirq-split-out-code.patch index cda0e1530..4e5e405a5 100644 --- a/debian/patches/features/all/rt/0049-softirq-split-out-code.patch.patch +++ b/debian/patches/features/all/rt/softirq-split-out-code.patch @@ -1,17 +1,16 @@ -From 3721a6f40ccd5334d85fc368b28927ba01a2546e Mon Sep 17 00:00:00 2001 +Subject: softirq-split-out-code.patch From: Thomas Gleixner Date: Tue, 28 Jun 2011 15:46:49 +0200 -Subject: [049/256] softirq-split-out-code.patch Signed-off-by: Thomas Gleixner --- - kernel/softirq.c | 94 ++++++++++++++++++++++++++++++------------------------ + kernel/softirq.c | 94 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 42 deletions(-) -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 671f959..6ec3a78 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c @@ -76,6 +76,34 @@ static void wakeup_softirqd(void) wake_up_process(tsk); } @@ -55,7 +54,7 @@ index 671f959..6ec3a78 100644 __u32 pending; int max_restart = MAX_SOFTIRQ_RESTART; int cpu; -@@ -215,7 +242,7 @@ asmlinkage void __do_softirq(void) +@@ -223,7 +250,7 @@ asmlinkage void __do_softirq(void) account_system_vtime(current); __local_bh_disable((unsigned long)__builtin_return_address(0), @@ -64,7 +63,7 @@ index 671f959..6ec3a78 100644 lockdep_softirq_enter(); cpu = smp_processor_id(); -@@ -223,36 +250,7 @@ restart: +@@ -231,36 +258,7 @@ restart: /* Reset the pending bitmask before enabling irqs */ set_softirq_pending(0); @@ -102,8 +101,8 @@ index 671f959..6ec3a78 100644 pending = local_softirq_pending(); if (pending && --max_restart) -@@ -267,6 +265,26 @@ restart: - __local_bh_enable(SOFTIRQ_OFFSET); +@@ -276,6 +274,26 @@ restart: + tsk_restore_flags(current, old_flags, PF_MEMALLOC); } +/* @@ -129,7 +128,7 @@ index 671f959..6ec3a78 100644 #ifndef __ARCH_HAS_DO_SOFTIRQ asmlinkage void do_softirq(void) -@@ -739,22 +757,14 @@ static int run_ksoftirqd(void * __bind_cpu) +@@ -748,22 +766,14 @@ static int run_ksoftirqd(void * __bind_c while (!kthread_should_stop()) { preempt_disable(); diff --git a/debian/patches/features/all/rt/0048-softirq-thread-do-softirq.patch.patch b/debian/patches/features/all/rt/softirq-thread-do-softirq.patch similarity index 57% rename from debian/patches/features/all/rt/0048-softirq-thread-do-softirq.patch.patch rename to debian/patches/features/all/rt/softirq-thread-do-softirq.patch index 16736b46a..7746fe253 100644 --- a/debian/patches/features/all/rt/0048-softirq-thread-do-softirq.patch.patch +++ b/debian/patches/features/all/rt/softirq-thread-do-softirq.patch @@ -1,7 +1,6 @@ -From 5f6e092d66f44cd34d42dfe5bebaa8599c1b8337 Mon Sep 17 00:00:00 2001 +Subject: softirq-thread-do-softirq.patch From: Thomas Gleixner Date: Tue, 28 Jun 2011 15:44:15 +0200 -Subject: [048/256] softirq-thread-do-softirq.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner net/core/dev.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 2aea5d2..02c3c4f 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -452,6 +452,7 @@ struct softirq_action +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -446,6 +446,7 @@ struct softirq_action asmlinkage void do_softirq(void); asmlinkage void __do_softirq(void); @@ -21,11 +20,11 @@ index 2aea5d2..02c3c4f 100644 extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void softirq_init(void); extern void __raise_softirq_irqoff(unsigned int nr); -diff --git a/net/core/dev.c b/net/core/dev.c -index 99e1d75..ca7a845 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -2963,7 +2963,7 @@ int netif_rx_ni(struct sk_buff *skb) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -2993,7 +2993,7 @@ int netif_rx_ni(struct sk_buff *skb) preempt_disable(); err = netif_rx(skb); if (local_softirq_pending()) diff --git a/debian/patches/features/all/rt/0175-spinlock-types-separate-raw.patch.patch b/debian/patches/features/all/rt/spinlock-types-separate-raw.patch similarity index 81% rename from debian/patches/features/all/rt/0175-spinlock-types-separate-raw.patch.patch rename to debian/patches/features/all/rt/spinlock-types-separate-raw.patch index ccf5473c8..dff05b60b 100644 --- a/debian/patches/features/all/rt/0175-spinlock-types-separate-raw.patch.patch +++ b/debian/patches/features/all/rt/spinlock-types-separate-raw.patch @@ -1,22 +1,19 @@ -From 9ff9b0b7b9fafebd9d11112ead4c24ec4d8fe5bd Mon Sep 17 00:00:00 2001 +Subject: spinlock-types-separate-raw.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 19:34:01 +0200 -Subject: [175/256] spinlock-types-separate-raw.patch Signed-off-by: Thomas Gleixner --- - include/linux/rwlock_types.h | 4 ++ - include/linux/spinlock_types.h | 74 +---------------------------------- + include/linux/rwlock_types.h | 4 + + include/linux/spinlock_types.h | 74 ------------------------------------ include/linux/spinlock_types_nort.h | 33 ++++++++++++++++ - include/linux/spinlock_types_raw.h | 56 ++++++++++++++++++++++++++ + include/linux/spinlock_types_raw.h | 56 +++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 72 deletions(-) - create mode 100644 include/linux/spinlock_types_nort.h - create mode 100644 include/linux/spinlock_types_raw.h -diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h -index cc0072e..5317cd9 100644 ---- a/include/linux/rwlock_types.h -+++ b/include/linux/rwlock_types.h +Index: linux-stable/include/linux/rwlock_types.h +=================================================================== +--- linux-stable.orig/include/linux/rwlock_types.h ++++ linux-stable/include/linux/rwlock_types.h @@ -1,6 +1,10 @@ #ifndef __LINUX_RWLOCK_TYPES_H #define __LINUX_RWLOCK_TYPES_H @@ -28,10 +25,10 @@ index cc0072e..5317cd9 100644 /* * include/linux/rwlock_types.h - generic rwlock type definitions * and initializers -diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h -index 73548eb..5c8664d 100644 ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h +Index: linux-stable/include/linux/spinlock_types.h +=================================================================== +--- linux-stable.orig/include/linux/spinlock_types.h ++++ linux-stable/include/linux/spinlock_types.h @@ -9,79 +9,9 @@ * Released under the General Public License (GPL). */ @@ -114,11 +111,10 @@ index 73548eb..5c8664d 100644 #include -diff --git a/include/linux/spinlock_types_nort.h b/include/linux/spinlock_types_nort.h -new file mode 100644 -index 0000000..f1dac1f +Index: linux-stable/include/linux/spinlock_types_nort.h +=================================================================== --- /dev/null -+++ b/include/linux/spinlock_types_nort.h ++++ linux-stable/include/linux/spinlock_types_nort.h @@ -0,0 +1,33 @@ +#ifndef __LINUX_SPINLOCK_TYPES_NORT_H +#define __LINUX_SPINLOCK_TYPES_NORT_H @@ -153,11 +149,10 @@ index 0000000..f1dac1f +#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) + +#endif -diff --git a/include/linux/spinlock_types_raw.h b/include/linux/spinlock_types_raw.h -new file mode 100644 -index 0000000..edffc4d +Index: linux-stable/include/linux/spinlock_types_raw.h +=================================================================== --- /dev/null -+++ b/include/linux/spinlock_types_raw.h ++++ linux-stable/include/linux/spinlock_types_raw.h @@ -0,0 +1,56 @@ +#ifndef __LINUX_SPINLOCK_TYPES_RAW_H +#define __LINUX_SPINLOCK_TYPES_RAW_H diff --git a/debian/patches/features/all/rt/stomp-machine-deal-clever-with-stopper-lock.patch b/debian/patches/features/all/rt/stomp-machine-deal-clever-with-stopper-lock.patch new file mode 100644 index 000000000..74388ddc9 --- /dev/null +++ b/debian/patches/features/all/rt/stomp-machine-deal-clever-with-stopper-lock.patch @@ -0,0 +1,60 @@ +Subject: stomp_machine: Use mutex_trylock when called from inactive cpu +From: Thomas Gleixner +Date: Wed, 03 Oct 2012 17:21:53 +0100 + +If the stop machinery is called from inactive CPU we cannot use +mutex_lock, because some other stomp machine invokation might be in +progress and the mutex can be contended. We cannot schedule from this +context, so trylock and loop. + +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +--- + kernel/stop_machine.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +Index: linux-stable/kernel/stop_machine.c +=================================================================== +--- linux-stable.orig/kernel/stop_machine.c ++++ linux-stable/kernel/stop_machine.c +@@ -158,7 +158,7 @@ static DEFINE_PER_CPU(struct cpu_stop_wo + + static void queue_stop_cpus_work(const struct cpumask *cpumask, + cpu_stop_fn_t fn, void *arg, +- struct cpu_stop_done *done) ++ struct cpu_stop_done *done, bool inactive) + { + struct cpu_stop_work *work; + unsigned int cpu; +@@ -175,7 +175,12 @@ static void queue_stop_cpus_work(const s + * Make sure that all work is queued on all cpus before we + * any of the cpus can execute it. + */ +- mutex_lock(&stopper_lock); ++ if (!inactive) { ++ mutex_lock(&stopper_lock); ++ } else { ++ while (!mutex_trylock(&stopper_lock)) ++ cpu_relax(); ++ } + for_each_cpu(cpu, cpumask) + cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu), + &per_cpu(stop_cpus_work, cpu)); +@@ -188,7 +193,7 @@ static int __stop_cpus(const struct cpum + struct cpu_stop_done done; + + cpu_stop_init_done(&done, cpumask_weight(cpumask)); +- queue_stop_cpus_work(cpumask, fn, arg, &done); ++ queue_stop_cpus_work(cpumask, fn, arg, &done, false); + wait_for_stop_done(&done); + return done.executed ? done.ret : -ENOENT; + } +@@ -601,7 +606,7 @@ int stop_machine_from_inactive_cpu(int ( + set_state(&smdata, STOPMACHINE_PREPARE); + cpu_stop_init_done(&done, num_active_cpus()); + queue_stop_cpus_work(cpu_active_mask, stop_machine_cpu_stop, &smdata, +- &done); ++ &done, true); + ret = stop_machine_cpu_stop(&smdata); + + /* Busy wait for completion. */ diff --git a/debian/patches/features/all/rt/0136-stomp-machine-mark-stomper-thread.patch.patch b/debian/patches/features/all/rt/stomp-machine-mark-stomper-thread.patch similarity index 58% rename from debian/patches/features/all/rt/0136-stomp-machine-mark-stomper-thread.patch.patch rename to debian/patches/features/all/rt/stomp-machine-mark-stomper-thread.patch index c27ecee98..c933698ed 100644 --- a/debian/patches/features/all/rt/0136-stomp-machine-mark-stomper-thread.patch.patch +++ b/debian/patches/features/all/rt/stomp-machine-mark-stomper-thread.patch @@ -1,7 +1,6 @@ -From 8b7e90abe179dec1e183273d7f6677943b0d2fcc Mon Sep 17 00:00:00 2001 +Subject: stomp-machine-mark-stomper-thread.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 19:53:19 +0200 -Subject: [136/256] stomp-machine-mark-stomper-thread.patch Signed-off-by: Thomas Gleixner --- @@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner kernel/stop_machine.c | 1 + 2 files changed, 2 insertions(+) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index a6b9a6d..cdfc16e 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1864,6 +1864,7 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * +Index: linux-stable/include/linux/sched.h +=================================================================== +--- linux-stable.orig/include/linux/sched.h ++++ linux-stable/include/linux/sched.h +@@ -1836,6 +1836,7 @@ extern void thread_group_times(struct ta #define PF_FROZEN 0x00010000 /* frozen for system suspend */ #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ #define PF_KSWAPD 0x00040000 /* I am kswapd */ @@ -21,11 +20,11 @@ index a6b9a6d..cdfc16e 100644 #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_KTHREAD 0x00200000 /* I am a kernel thread */ #define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ -diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c -index 61779f8..484a335 100644 ---- a/kernel/stop_machine.c -+++ b/kernel/stop_machine.c -@@ -327,6 +327,7 @@ static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb, +Index: linux-stable/kernel/stop_machine.c +=================================================================== +--- linux-stable.orig/kernel/stop_machine.c ++++ linux-stable/kernel/stop_machine.c +@@ -327,6 +327,7 @@ static int __cpuinit cpu_stop_cpu_callba if (IS_ERR(p)) return notifier_from_errno(PTR_ERR(p)); get_task_struct(p); diff --git a/debian/patches/features/all/rt/0137-stomp-machine-raw-lock.patch.patch b/debian/patches/features/all/rt/stomp-machine-raw-lock.patch similarity index 80% rename from debian/patches/features/all/rt/0137-stomp-machine-raw-lock.patch.patch rename to debian/patches/features/all/rt/stomp-machine-raw-lock.patch index fcbd44b77..51898f6ab 100644 --- a/debian/patches/features/all/rt/0137-stomp-machine-raw-lock.patch.patch +++ b/debian/patches/features/all/rt/stomp-machine-raw-lock.patch @@ -1,17 +1,16 @@ -From 788f2922ddf4ac99ce73c5fa847eabad78d0cebd Mon Sep 17 00:00:00 2001 +Subject: stomp-machine-raw-lock.patch From: Thomas Gleixner Date: Wed, 29 Jun 2011 11:01:51 +0200 -Subject: [137/256] stomp-machine-raw-lock.patch Signed-off-by: Thomas Gleixner --- - kernel/stop_machine.c | 58 ++++++++++++++++++++++++++++++++++--------------- + kernel/stop_machine.c | 58 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 17 deletions(-) -diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c -index 484a335..561ba3a 100644 ---- a/kernel/stop_machine.c -+++ b/kernel/stop_machine.c +Index: linux-stable/kernel/stop_machine.c +=================================================================== +--- linux-stable.orig/kernel/stop_machine.c ++++ linux-stable/kernel/stop_machine.c @@ -29,12 +29,12 @@ struct cpu_stop_done { atomic_t nr_todo; /* nr left to execute */ bool executed; /* actually executed? */ @@ -27,7 +26,7 @@ index 484a335..561ba3a 100644 bool enabled; /* is this stopper enabled? */ struct list_head works; /* list of pending works */ struct task_struct *thread; /* stopper thread */ -@@ -47,7 +47,7 @@ static void cpu_stop_init_done(struct cpu_stop_done *done, unsigned int nr_todo) +@@ -47,7 +47,7 @@ static void cpu_stop_init_done(struct cp { memset(done, 0, sizeof(*done)); atomic_set(&done->nr_todo, nr_todo); @@ -36,7 +35,7 @@ index 484a335..561ba3a 100644 } /* signal completion unless @done is NULL */ -@@ -56,8 +56,10 @@ static void cpu_stop_signal_done(struct cpu_stop_done *done, bool executed) +@@ -56,8 +56,10 @@ static void cpu_stop_signal_done(struct if (done) { if (executed) done->executed = true; @@ -49,7 +48,7 @@ index 484a335..561ba3a 100644 } } -@@ -67,7 +69,7 @@ static void cpu_stop_queue_work(struct cpu_stopper *stopper, +@@ -67,7 +69,7 @@ static void cpu_stop_queue_work(struct c { unsigned long flags; @@ -58,7 +57,7 @@ index 484a335..561ba3a 100644 if (stopper->enabled) { list_add_tail(&work->list, &stopper->works); -@@ -75,7 +77,23 @@ static void cpu_stop_queue_work(struct cpu_stopper *stopper, +@@ -75,7 +77,23 @@ static void cpu_stop_queue_work(struct c } else cpu_stop_signal_done(work->done, false); @@ -83,7 +82,7 @@ index 484a335..561ba3a 100644 } /** -@@ -109,7 +127,7 @@ int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg) +@@ -109,7 +127,7 @@ int stop_one_cpu(unsigned int cpu, cpu_s cpu_stop_init_done(&done, 1); cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu), &work); @@ -92,7 +91,7 @@ index 484a335..561ba3a 100644 return done.executed ? done.ret : -ENOENT; } -@@ -171,7 +189,7 @@ static int __stop_cpus(const struct cpumask *cpumask, +@@ -171,7 +189,7 @@ static int __stop_cpus(const struct cpum cpu_stop_init_done(&done, cpumask_weight(cpumask)); queue_stop_cpus_work(cpumask, fn, arg, &done); @@ -131,7 +130,7 @@ index 484a335..561ba3a 100644 } else schedule(); -@@ -337,9 +361,9 @@ static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb, +@@ -337,9 +361,9 @@ static int __cpuinit cpu_stop_cpu_callba /* strictly unnecessary, as first user will wake it */ wake_up_process(stopper->thread); /* mark enabled */ @@ -143,7 +142,7 @@ index 484a335..561ba3a 100644 break; #ifdef CONFIG_HOTPLUG_CPU -@@ -352,11 +376,11 @@ static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb, +@@ -352,11 +376,11 @@ static int __cpuinit cpu_stop_cpu_callba /* kill the stopper */ kthread_stop(stopper->thread); /* drain remaining works */ @@ -166,7 +165,7 @@ index 484a335..561ba3a 100644 INIT_LIST_HEAD(&stopper->works); } -@@ -581,7 +605,7 @@ int stop_machine_from_inactive_cpu(int (*fn)(void *), void *data, +@@ -581,7 +605,7 @@ int stop_machine_from_inactive_cpu(int ( ret = stop_machine_cpu_stop(&smdata); /* Busy wait for completion. */ diff --git a/debian/patches/features/all/rt/0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch b/debian/patches/features/all/rt/stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch similarity index 76% rename from debian/patches/features/all/rt/0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch rename to debian/patches/features/all/rt/stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch index 738791554..f5f6c19df 100644 --- a/debian/patches/features/all/rt/0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch +++ b/debian/patches/features/all/rt/stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch @@ -1,7 +1,6 @@ -From f6659d411c2ebfc6f8c2dd2b94eb25f24566c12a Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:27 -0500 -Subject: [135/256] stop_machine: convert stop_machine_run() to PREEMPT_RT +Subject: stop_machine: convert stop_machine_run() to PREEMPT_RT Instead of playing with non-preemption, introduce explicit startup serialization. This is more robust and cleaner as @@ -9,15 +8,16 @@ well. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- kernel/stop_machine.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) -diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c -index 2f194e9..61779f8 100644 ---- a/kernel/stop_machine.c -+++ b/kernel/stop_machine.c -@@ -135,6 +135,7 @@ void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, +Index: linux-stable/kernel/stop_machine.c +=================================================================== +--- linux-stable.orig/kernel/stop_machine.c ++++ linux-stable/kernel/stop_machine.c +@@ -135,6 +135,7 @@ void stop_one_cpu_nowait(unsigned int cp /* static data for stop_cpus */ static DEFINE_MUTEX(stop_cpus_mutex); @@ -25,7 +25,7 @@ index 2f194e9..61779f8 100644 static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work); static void queue_stop_cpus_work(const struct cpumask *cpumask, -@@ -153,15 +154,14 @@ static void queue_stop_cpus_work(const struct cpumask *cpumask, +@@ -153,15 +154,14 @@ static void queue_stop_cpus_work(const s } /* diff --git a/debian/patches/features/all/rt/0039-suspend-Prevent-might-sleep-splats.patch b/debian/patches/features/all/rt/suspend-prevernt-might-sleep-splats.patch similarity index 59% rename from debian/patches/features/all/rt/0039-suspend-Prevent-might-sleep-splats.patch rename to debian/patches/features/all/rt/suspend-prevernt-might-sleep-splats.patch index 9cdaa10ea..3ae719228 100644 --- a/debian/patches/features/all/rt/0039-suspend-Prevent-might-sleep-splats.patch +++ b/debian/patches/features/all/rt/suspend-prevernt-might-sleep-splats.patch @@ -1,7 +1,6 @@ -From 64a6f8ab2972b1cd7aba1d703437b8fe70063303 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 15 Jul 2010 10:29:00 +0200 -Subject: [039/256] suspend: Prevent might sleep splats +Subject: suspend: Prevent might sleep splats timekeeping suspend/resume calls read_persistant_clock() which takes rtc_lock. That results in might sleep warnings because at that point @@ -17,30 +16,30 @@ and restoring it to SYSTEM_RUNNING afer sysdev_resume(). Needs to be revisited. Signed-off-by: Thomas Gleixner + --- - include/linux/kernel.h | 2 +- + include/linux/kernel.h | 1 + kernel/power/hibernate.c | 7 +++++++ kernel/power/suspend.c | 4 ++++ - 3 files changed, 12 insertions(+), 1 deletion(-) + 3 files changed, 12 insertions(+) -diff --git a/include/linux/kernel.h b/include/linux/kernel.h -index 645231c..e43a4a2 100644 ---- a/include/linux/kernel.h -+++ b/include/linux/kernel.h -@@ -374,7 +374,7 @@ extern enum system_states { +Index: linux-stable/include/linux/kernel.h +=================================================================== +--- linux-stable.orig/include/linux/kernel.h ++++ linux-stable/include/linux/kernel.h +@@ -385,6 +385,7 @@ extern enum system_states { SYSTEM_HALT, SYSTEM_POWER_OFF, SYSTEM_RESTART, -- SYSTEM_SUSPEND_DISK, + SYSTEM_SUSPEND, } system_state; #define TAINT_PROPRIETARY_MODULE 0 -diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c -index e09dfbf..1aa6e1f 100644 ---- a/kernel/power/hibernate.c -+++ b/kernel/power/hibernate.c -@@ -270,6 +270,8 @@ static int create_image(int platform_mode) +Index: linux-stable/kernel/power/hibernate.c +=================================================================== +--- linux-stable.orig/kernel/power/hibernate.c ++++ linux-stable/kernel/power/hibernate.c +@@ -275,6 +275,8 @@ static int create_image(int platform_mod local_irq_disable(); @@ -49,7 +48,7 @@ index e09dfbf..1aa6e1f 100644 error = syscore_suspend(); if (error) { printk(KERN_ERR "PM: Some system devices failed to power down, " -@@ -297,6 +299,7 @@ static int create_image(int platform_mode) +@@ -302,6 +304,7 @@ static int create_image(int platform_mod syscore_resume(); Enable_irqs: @@ -57,7 +56,7 @@ index e09dfbf..1aa6e1f 100644 local_irq_enable(); Enable_cpus: -@@ -420,6 +423,7 @@ static int resume_target_kernel(bool platform_mode) +@@ -427,6 +430,7 @@ static int resume_target_kernel(bool pla goto Enable_cpus; local_irq_disable(); @@ -65,7 +64,7 @@ index e09dfbf..1aa6e1f 100644 error = syscore_suspend(); if (error) -@@ -453,6 +457,7 @@ static int resume_target_kernel(bool platform_mode) +@@ -460,6 +464,7 @@ static int resume_target_kernel(bool pla syscore_resume(); Enable_irqs: @@ -73,7 +72,7 @@ index e09dfbf..1aa6e1f 100644 local_irq_enable(); Enable_cpus: -@@ -532,6 +537,7 @@ int hibernation_platform_enter(void) +@@ -542,6 +547,7 @@ int hibernation_platform_enter(void) goto Platform_finish; local_irq_disable(); @@ -81,7 +80,7 @@ index e09dfbf..1aa6e1f 100644 syscore_suspend(); if (pm_wakeup_pending()) { error = -EAGAIN; -@@ -544,6 +550,7 @@ int hibernation_platform_enter(void) +@@ -554,6 +560,7 @@ int hibernation_platform_enter(void) Power_up: syscore_resume(); @@ -89,11 +88,11 @@ index e09dfbf..1aa6e1f 100644 local_irq_enable(); enable_nonboot_cpus(); -diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c -index 396d262..d4fb331 100644 ---- a/kernel/power/suspend.c -+++ b/kernel/power/suspend.c -@@ -164,6 +164,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) +Index: linux-stable/kernel/power/suspend.c +=================================================================== +--- linux-stable.orig/kernel/power/suspend.c ++++ linux-stable/kernel/power/suspend.c +@@ -165,6 +165,8 @@ static int suspend_enter(suspend_state_t arch_suspend_disable_irqs(); BUG_ON(!irqs_disabled()); @@ -102,7 +101,7 @@ index 396d262..d4fb331 100644 error = syscore_suspend(); if (!error) { *wakeup = pm_wakeup_pending(); -@@ -174,6 +176,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) +@@ -175,6 +177,8 @@ static int suspend_enter(suspend_state_t syscore_resume(); } diff --git a/debian/patches/features/all/rt/0046-sysctl-include-fix.patch.patch b/debian/patches/features/all/rt/sysctl-include-atomic-h.patch similarity index 59% rename from debian/patches/features/all/rt/0046-sysctl-include-fix.patch.patch rename to debian/patches/features/all/rt/sysctl-include-atomic-h.patch index b6f9845be..426a6d2f6 100644 --- a/debian/patches/features/all/rt/0046-sysctl-include-fix.patch.patch +++ b/debian/patches/features/all/rt/sysctl-include-atomic-h.patch @@ -1,17 +1,16 @@ -From a8e516eff1ffd16b863d136964f1b0537d6037b1 Mon Sep 17 00:00:00 2001 +Subject: sysctl-include-fix.patch From: Thomas Gleixner Date: Mon, 14 Nov 2011 10:52:34 +0100 -Subject: [046/256] sysctl-include-fix.patch Signed-off-by: Thomas Gleixner --- include/linux/sysctl.h | 1 + 1 file changed, 1 insertion(+) -diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h -index c34b4c8..4fbc9f7 100644 ---- a/include/linux/sysctl.h -+++ b/include/linux/sysctl.h +Index: linux-stable/include/linux/sysctl.h +=================================================================== +--- linux-stable.orig/include/linux/sysctl.h ++++ linux-stable/include/linux/sysctl.h @@ -933,6 +933,7 @@ enum #include #include diff --git a/debian/patches/features/all/rt/0226-add-sys-kernel-realtime-entry.patch b/debian/patches/features/all/rt/sysfs-realtime-entry.patch similarity index 76% rename from debian/patches/features/all/rt/0226-add-sys-kernel-realtime-entry.patch rename to debian/patches/features/all/rt/sysfs-realtime-entry.patch index dae39d27b..5645db2d3 100644 --- a/debian/patches/features/all/rt/0226-add-sys-kernel-realtime-entry.patch +++ b/debian/patches/features/all/rt/sysfs-realtime-entry.patch @@ -1,7 +1,6 @@ -From 336159d79ec5b0b15dccae3ea19328d433042f47 Mon Sep 17 00:00:00 2001 +Subject: add /sys/kernel/realtime entry From: Clark Williams -Date: Sat, 30 Jul 2011 21:55:53 -0500 -Subject: [226/256] add /sys/kernel/realtime entry +Date: Sat Jul 30 21:55:53 2011 -0500 Add a /sys/kernel entry to indicate that the kernel is a realtime kernel. @@ -18,10 +17,10 @@ Signed-off-by: Peter Zijlstra kernel/ksysfs.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) -diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c -index 4e316e1..a546d33 100644 ---- a/kernel/ksysfs.c -+++ b/kernel/ksysfs.c +Index: linux-stable/kernel/ksysfs.c +=================================================================== +--- linux-stable.orig/kernel/ksysfs.c ++++ linux-stable/kernel/ksysfs.c @@ -133,6 +133,15 @@ KERNEL_ATTR_RO(vmcoreinfo); #endif /* CONFIG_KEXEC */ @@ -38,7 +37,7 @@ index 4e316e1..a546d33 100644 /* whether file capabilities are enabled */ static ssize_t fscaps_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) -@@ -182,6 +191,9 @@ static struct attribute * kernel_attrs[] = { +@@ -182,6 +191,9 @@ static struct attribute * kernel_attrs[] &kexec_crash_size_attr.attr, &vmcoreinfo_attr.attr, #endif diff --git a/debian/patches/features/all/rt/0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch b/debian/patches/features/all/rt/tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch similarity index 90% rename from debian/patches/features/all/rt/0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch rename to debian/patches/features/all/rt/tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch index 8798cd177..20d98fe25 100644 --- a/debian/patches/features/all/rt/0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch +++ b/debian/patches/features/all/rt/tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch @@ -1,8 +1,6 @@ -From 32cb0e7fe45357b698e1a95cc33bfefd6ea9bd71 Mon Sep 17 00:00:00 2001 +Subject: tasklet: Prevent tasklets from going into infinite spin in RT From: Ingo Molnar -Date: Tue, 29 Nov 2011 20:18:22 -0500 -Subject: [167/256] tasklet: Prevent tasklets from going into infinite spin in - RT +Date: Tue Nov 29 20:18:22 2011 -0500 When CONFIG_PREEMPT_RT_FULL is enabled, tasklets run as threads, and spinlocks turn are mutexes. But this can cause issues with @@ -11,21 +9,21 @@ if a tasklets are disabled with tasklet_disable(), the tasklet count is increased. When a tasklet runs, it checks this counter and if it is set, it adds itself back on the softirq queue and returns. - + The problem arises in RT because ksoftirq will see that a softirq is ready to run (the tasklet softirq just re-armed itself), and will not sleep, but instead run the softirqs again. The tasklet softirq will still see that the count is non-zero and will not execute the tasklet and requeue itself on the softirq again, which will cause ksoftirqd to run it again and again and again. - + It gets worse because ksoftirqd runs as a real-time thread. If it preempted the task that disabled tasklets, and that task has migration disabled, or can't run for other reasons, the tasklet softirq will never run because the count will never be zero, and ksoftirqd will go into an infinite loop. As an RT task, it this becomes a big problem. - + This is a hack solution to have tasklet_disable stop tasklets, and when a tasklet runs, instead of requeueing the tasklet softirqd it delays it. When tasklet_enable() is called, and tasklets are @@ -33,20 +31,21 @@ waiting, then the tasklet_enable() will kick the tasklets to continue. This prevents the lock up from ksoftirq going into an infinite loop. [ rostedt@goodmis.org: ported to 3.0-rt ] - + Signed-off-by: Ingo Molnar Signed-off-by: Steven Rostedt Signed-off-by: Thomas Gleixner + --- - include/linux/interrupt.h | 39 ++++----- - kernel/softirq.c | 208 ++++++++++++++++++++++++++++++++------------- + include/linux/interrupt.h | 39 ++++---- + kernel/softirq.c | 208 +++++++++++++++++++++++++++++++++------------- 2 files changed, 170 insertions(+), 77 deletions(-) -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 5dde591..be33625 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -511,8 +511,9 @@ extern void __send_remote_softirq(struct call_single_data *cp, int cpu, +Index: linux-stable/include/linux/interrupt.h +=================================================================== +--- linux-stable.orig/include/linux/interrupt.h ++++ linux-stable/include/linux/interrupt.h +@@ -505,8 +505,9 @@ extern void __send_remote_softirq(struct to be executed on some cpu at least once after this. * If the tasklet is already scheduled, but its execution is still not started, it will be executed only once. @@ -58,7 +57,7 @@ index 5dde591..be33625 100644 * Tasklet is strictly serialized wrt itself, but not wrt another tasklets. If client needs some intertask synchronization, he makes it with spinlocks. -@@ -537,27 +538,36 @@ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } +@@ -531,27 +532,36 @@ struct tasklet_struct name = { NULL, 0, enum { TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */ @@ -101,7 +100,7 @@ index 5dde591..be33625 100644 #define tasklet_unlock_wait(t) do { } while (0) #define tasklet_unlock(t) do { } while (0) #endif -@@ -606,17 +616,8 @@ static inline void tasklet_disable(struct tasklet_struct *t) +@@ -600,17 +610,8 @@ static inline void tasklet_disable(struc smp_mb(); } @@ -121,10 +120,10 @@ index 5dde591..be33625 100644 extern void tasklet_kill(struct tasklet_struct *t); extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 86561c0..aec7d69 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c +Index: linux-stable/kernel/softirq.c +=================================================================== +--- linux-stable.orig/kernel/softirq.c ++++ linux-stable/kernel/softirq.c @@ -21,6 +21,7 @@ #include #include @@ -133,7 +132,7 @@ index 86561c0..aec7d69 100644 #include #include #include -@@ -656,15 +657,45 @@ struct tasklet_head +@@ -665,15 +666,45 @@ struct tasklet_head static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec); @@ -183,7 +182,7 @@ index 86561c0..aec7d69 100644 local_irq_restore(flags); } -@@ -675,10 +706,7 @@ void __tasklet_hi_schedule(struct tasklet_struct *t) +@@ -684,10 +715,7 @@ void __tasklet_hi_schedule(struct taskle unsigned long flags; local_irq_save(flags); @@ -195,7 +194,7 @@ index 86561c0..aec7d69 100644 local_irq_restore(flags); } -@@ -686,50 +714,119 @@ EXPORT_SYMBOL(__tasklet_hi_schedule); +@@ -695,50 +723,119 @@ EXPORT_SYMBOL(__tasklet_hi_schedule); void __tasklet_hi_schedule_first(struct tasklet_struct *t) { @@ -341,7 +340,7 @@ index 86561c0..aec7d69 100644 static void tasklet_hi_action(struct softirq_action *a) { struct tasklet_struct *list; -@@ -740,29 +837,7 @@ static void tasklet_hi_action(struct softirq_action *a) +@@ -749,29 +846,7 @@ static void tasklet_hi_action(struct sof __this_cpu_write(tasklet_hi_vec.tail, &__get_cpu_var(tasklet_hi_vec).head); local_irq_enable(); @@ -372,7 +371,7 @@ index 86561c0..aec7d69 100644 } -@@ -785,7 +860,7 @@ void tasklet_kill(struct tasklet_struct *t) +@@ -794,7 +869,7 @@ void tasklet_kill(struct tasklet_struct while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { do { @@ -381,7 +380,7 @@ index 86561c0..aec7d69 100644 } while (test_bit(TASKLET_STATE_SCHED, &t->state)); } tasklet_unlock_wait(t); -@@ -991,6 +1066,23 @@ void __init softirq_init(void) +@@ -1000,6 +1075,23 @@ void __init softirq_init(void) open_softirq(HI_SOFTIRQ, tasklet_hi_action); } diff --git a/debian/patches/features/all/rt/0181-rwlocks-Fix-section-mismatch.patch b/debian/patches/features/all/rt/tasklist-lock-fix-section-conflict.patch similarity index 71% rename from debian/patches/features/all/rt/0181-rwlocks-Fix-section-mismatch.patch rename to debian/patches/features/all/rt/tasklist-lock-fix-section-conflict.patch index eff28a9a3..0516c09ac 100644 --- a/debian/patches/features/all/rt/0181-rwlocks-Fix-section-mismatch.patch +++ b/debian/patches/features/all/rt/tasklist-lock-fix-section-conflict.patch @@ -1,16 +1,12 @@ -From 4e527692e6bd21dafd6202aeb28df65f12bbcfd1 Mon Sep 17 00:00:00 2001 +Subject: rwlocks: Fix section mismatch From: John Kacur -Date: Mon, 19 Sep 2011 11:09:27 +0200 -Subject: [181/256] rwlocks: Fix section mismatch -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +Date: Mon, 19 Sep 2011 11:09:27 +0200 (CEST) This fixes the following build error for the preempt-rt kernel. make kernel/fork.o CC kernel/fork.o -kernel/fork.c:90: error: section of ¡tasklist_lock¢ conflicts with previous declaration +kernel/fork.c:90: error: section of ¡tasklist_lock¢ conflicts with previous declaration make[2]: *** [kernel/fork.o] Error 1 make[1]: *** [kernel/fork.o] Error 2 @@ -37,10 +33,10 @@ Signed-off-by: Thomas Gleixner kernel/fork.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) -diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h -index 5317cd9..d0da966 100644 ---- a/include/linux/rwlock_types.h -+++ b/include/linux/rwlock_types.h +Index: linux-stable/include/linux/rwlock_types.h +=================================================================== +--- linux-stable.orig/include/linux/rwlock_types.h ++++ linux-stable/include/linux/rwlock_types.h @@ -47,6 +47,7 @@ typedef struct { RW_DEP_MAP_INIT(lockname) } #endif @@ -50,11 +46,11 @@ index 5317cd9..d0da966 100644 + rwlock_t name __cacheline_aligned_in_smp = __RW_LOCK_UNLOCKED(name) #endif /* __LINUX_RWLOCK_TYPES_H */ -diff --git a/kernel/fork.c b/kernel/fork.c -index e6cf9db..ec2ff23 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -91,7 +91,7 @@ int max_threads; /* tunable limit on nr_threads */ +Index: linux-stable/kernel/fork.c +=================================================================== +--- linux-stable.orig/kernel/fork.c ++++ linux-stable/kernel/fork.c +@@ -93,7 +93,7 @@ int max_threads; /* tunable limit on nr DEFINE_PER_CPU(unsigned long, process_counts) = 0; diff --git a/debian/patches/features/all/rt/timekeeping-split-xtime-lock.patch b/debian/patches/features/all/rt/timekeeping-split-xtime-lock.patch new file mode 100644 index 000000000..7fb90dbfd --- /dev/null +++ b/debian/patches/features/all/rt/timekeeping-split-xtime-lock.patch @@ -0,0 +1,527 @@ +Subject: timekeeping: Split xtime_lock +From: Thomas Gleixner +Date: Thu, 01 Mar 2012 15:14:06 +0100 + +xtime_lock is going to be split apart in mainline, so we can shorten +the seqcount protected regions and avoid updating seqcount in some +code pathes. This is a straight forward split, so we can avoid the +whole mess with raw seqlocks for RT. + +Signed-off-by: Thomas Gleixner +--- + kernel/time/jiffies.c | 4 - + kernel/time/tick-common.c | 10 ++- + kernel/time/tick-internal.h | 3 - + kernel/time/tick-sched.c | 16 +++--- + kernel/time/timekeeping.c | 116 +++++++++++++++++++++++++------------------- + 5 files changed, 88 insertions(+), 61 deletions(-) + +Index: linux-stable/kernel/time/jiffies.c +=================================================================== +--- linux-stable.orig/kernel/time/jiffies.c ++++ linux-stable/kernel/time/jiffies.c +@@ -74,9 +74,9 @@ u64 get_jiffies_64(void) + u64 ret; + + do { +- seq = read_seqbegin(&xtime_lock); ++ seq = read_seqcount_begin(&xtime_seq); + ret = jiffies_64; +- } while (read_seqretry(&xtime_lock, seq)); ++ } while (read_seqcount_retry(&xtime_seq, seq)); + return ret; + } + EXPORT_SYMBOL(get_jiffies_64); +Index: linux-stable/kernel/time/tick-common.c +=================================================================== +--- linux-stable.orig/kernel/time/tick-common.c ++++ linux-stable/kernel/time/tick-common.c +@@ -63,13 +63,15 @@ int tick_is_oneshot_available(void) + static void tick_periodic(int cpu) + { + if (tick_do_timer_cpu == cpu) { +- write_seqlock(&xtime_lock); ++ raw_spin_lock(&xtime_lock); ++ write_seqcount_begin(&xtime_seq); + + /* Keep track of the next tick event */ + tick_next_period = ktime_add(tick_next_period, tick_period); + + do_timer(1); +- write_sequnlock(&xtime_lock); ++ write_seqcount_end(&xtime_seq); ++ raw_spin_unlock(&xtime_lock); + } + + update_process_times(user_mode(get_irq_regs())); +@@ -130,9 +132,9 @@ void tick_setup_periodic(struct clock_ev + ktime_t next; + + do { +- seq = read_seqbegin(&xtime_lock); ++ seq = read_seqcount_begin(&xtime_seq); + next = tick_next_period; +- } while (read_seqretry(&xtime_lock, seq)); ++ } while (read_seqcount_retry(&xtime_seq, seq)); + + clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); + +Index: linux-stable/kernel/time/tick-internal.h +=================================================================== +--- linux-stable.orig/kernel/time/tick-internal.h ++++ linux-stable/kernel/time/tick-internal.h +@@ -141,4 +141,5 @@ static inline int tick_device_is_functio + #endif + + extern void do_timer(unsigned long ticks); +-extern seqlock_t xtime_lock; ++extern raw_spinlock_t xtime_lock; ++extern seqcount_t xtime_seq; +Index: linux-stable/kernel/time/tick-sched.c +=================================================================== +--- linux-stable.orig/kernel/time/tick-sched.c ++++ linux-stable/kernel/time/tick-sched.c +@@ -56,7 +56,8 @@ static void tick_do_update_jiffies64(kti + return; + + /* Reevalute with xtime_lock held */ +- write_seqlock(&xtime_lock); ++ raw_spin_lock(&xtime_lock); ++ write_seqcount_begin(&xtime_seq); + + delta = ktime_sub(now, last_jiffies_update); + if (delta.tv64 >= tick_period.tv64) { +@@ -79,7 +80,8 @@ static void tick_do_update_jiffies64(kti + /* Keep the tick_next_period variable up to date */ + tick_next_period = ktime_add(last_jiffies_update, tick_period); + } +- write_sequnlock(&xtime_lock); ++ write_seqcount_end(&xtime_seq); ++ raw_spin_unlock(&xtime_lock); + } + + /* +@@ -89,12 +91,14 @@ static ktime_t tick_init_jiffy_update(vo + { + ktime_t period; + +- write_seqlock(&xtime_lock); ++ raw_spin_lock(&xtime_lock); ++ write_seqcount_begin(&xtime_seq); + /* Did we start the jiffies update yet ? */ + if (last_jiffies_update.tv64 == 0) + last_jiffies_update = tick_next_period; + period = last_jiffies_update; +- write_sequnlock(&xtime_lock); ++ write_seqcount_end(&xtime_seq); ++ raw_spin_unlock(&xtime_lock); + return period; + } + +@@ -282,11 +286,11 @@ static ktime_t tick_nohz_stop_sched_tick + + /* Read jiffies and the time when jiffies were updated last */ + do { +- seq = read_seqbegin(&xtime_lock); ++ seq = read_seqcount_begin(&xtime_seq); + last_update = last_jiffies_update; + last_jiffies = jiffies; + time_delta = timekeeping_max_deferment(); +- } while (read_seqretry(&xtime_lock, seq)); ++ } while (read_seqcount_retry(&xtime_seq, seq)); + + if (rcu_needs_cpu(cpu, &rcu_delta_jiffies) || printk_needs_cpu(cpu) || + arch_needs_cpu(cpu)) { +Index: linux-stable/kernel/time/timekeeping.c +=================================================================== +--- linux-stable.orig/kernel/time/timekeeping.c ++++ linux-stable/kernel/time/timekeeping.c +@@ -74,7 +74,8 @@ struct timekeeper { + /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ + struct timespec raw_time; + /* Seqlock for all timekeeper values */ +- seqlock_t lock; ++ seqcount_t seq; ++ raw_spinlock_t lock; + }; + + static struct timekeeper timekeeper; +@@ -83,7 +84,8 @@ static struct timekeeper timekeeper; + * This read-write spinlock protects us from races in SMP while + * playing with xtime. + */ +-__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock); ++__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(xtime_lock); ++seqcount_t xtime_seq; + + /* flag for if timekeeping is suspended */ + int __read_mostly timekeeping_suspended; +@@ -300,12 +302,12 @@ void getnstimeofday(struct timespec *ts) + WARN_ON(timekeeping_suspended); + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + ts->tv_sec = tk->xtime_sec; + nsecs = timekeeping_get_ns(tk); + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + ts->tv_nsec = 0; + timespec_add_ns(ts, nsecs); +@@ -321,11 +323,11 @@ ktime_t ktime_get(void) + WARN_ON(timekeeping_suspended); + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + secs = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; + nsecs = timekeeping_get_ns(tk) + tk->wall_to_monotonic.tv_nsec; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + /* + * Use ktime_set/ktime_add_ns to create a proper ktime on + * 32-bit architectures without CONFIG_KTIME_SCALAR. +@@ -352,12 +354,12 @@ void ktime_get_ts(struct timespec *ts) + WARN_ON(timekeeping_suspended); + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + ts->tv_sec = tk->xtime_sec; + nsec = timekeeping_get_ns(tk); + tomono = tk->wall_to_monotonic; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + ts->tv_sec += tomono.tv_sec; + ts->tv_nsec = 0; +@@ -385,7 +387,7 @@ void getnstime_raw_and_real(struct times + WARN_ON_ONCE(timekeeping_suspended); + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + *ts_raw = tk->raw_time; + ts_real->tv_sec = tk->xtime_sec; +@@ -394,7 +396,7 @@ void getnstime_raw_and_real(struct times + nsecs_raw = timekeeping_get_ns_raw(tk); + nsecs_real = timekeeping_get_ns(tk); + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + timespec_add_ns(ts_raw, nsecs_raw); + timespec_add_ns(ts_real, nsecs_real); +@@ -434,7 +436,8 @@ int do_settimeofday(const struct timespe + if (!timespec_valid_strict(tv)) + return -EINVAL; + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + timekeeping_forward_now(tk); + +@@ -448,7 +451,8 @@ int do_settimeofday(const struct timespe + + timekeeping_update(tk, true); + +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + /* signal hrtimers about time change */ + clock_was_set(); +@@ -473,7 +477,8 @@ int timekeeping_inject_offset(struct tim + if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) + return -EINVAL; + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + timekeeping_forward_now(tk); + +@@ -490,7 +495,8 @@ int timekeeping_inject_offset(struct tim + error: /* even if we error out, we forwarded the time, so call update */ + timekeeping_update(tk, true); + +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + /* signal hrtimers about time change */ + clock_was_set(); +@@ -512,7 +518,8 @@ static int change_clocksource(void *data + + new = (struct clocksource *) data; + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + timekeeping_forward_now(tk); + if (!new->enable || new->enable(new) == 0) { +@@ -523,7 +530,8 @@ static int change_clocksource(void *data + } + timekeeping_update(tk, true); + +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + return 0; + } +@@ -573,11 +581,11 @@ void getrawmonotonic(struct timespec *ts + s64 nsecs; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + nsecs = timekeeping_get_ns_raw(tk); + *ts = tk->raw_time; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + timespec_add_ns(ts, nsecs); + } +@@ -593,11 +601,11 @@ int timekeeping_valid_for_hres(void) + int ret; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + ret = tk->clock->flags & CLOCK_SOURCE_VALID_FOR_HRES; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + return ret; + } +@@ -612,11 +620,11 @@ u64 timekeeping_max_deferment(void) + u64 ret; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + ret = tk->clock->max_idle_ns; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + return ret; + } +@@ -677,11 +685,13 @@ void __init timekeeping_init(void) + boot.tv_nsec = 0; + } + +- seqlock_init(&tk->lock); ++ raw_spin_lock_init(&tk->lock); ++ seqcount_init(&tk->seq); + + ntp_init(); + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + clock = clocksource_default_clock(); + if (clock->enable) + clock->enable(clock); +@@ -700,7 +710,8 @@ void __init timekeeping_init(void) + tmp.tv_nsec = 0; + tk_set_sleep_time(tk, tmp); + +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + } + + /* time in seconds when suspend began */ +@@ -747,7 +758,8 @@ void timekeeping_inject_sleeptime(struct + if (!(ts.tv_sec == 0 && ts.tv_nsec == 0)) + return; + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + timekeeping_forward_now(tk); + +@@ -755,7 +767,8 @@ void timekeeping_inject_sleeptime(struct + + timekeeping_update(tk, true); + +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + /* signal hrtimers about time change */ + clock_was_set(); +@@ -778,7 +791,8 @@ static void timekeeping_resume(void) + + clocksource_resume(); + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) { + ts = timespec_sub(ts, timekeeping_suspend_time); +@@ -789,7 +803,8 @@ static void timekeeping_resume(void) + tk->ntp_error = 0; + timekeeping_suspended = 0; + timekeeping_update(tk, false); +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + touch_softlockup_watchdog(); + +@@ -808,7 +823,8 @@ static int timekeeping_suspend(void) + + read_persistent_clock(&timekeeping_suspend_time); + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + timekeeping_forward_now(tk); + timekeeping_suspended = 1; + +@@ -831,7 +847,8 @@ static int timekeeping_suspend(void) + timekeeping_suspend_time = + timespec_add(timekeeping_suspend_time, delta_delta); + } +- write_sequnlock_irqrestore(&tk->lock, flags); ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + + clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); + clocksource_suspend(); +@@ -1141,7 +1158,8 @@ static void update_wall_time(void) + unsigned long flags; + s64 remainder; + +- write_seqlock_irqsave(&tk->lock, flags); ++ raw_spin_lock_irqsave(&tk->lock, flags); ++ write_seqcount_begin(&tk->seq); + + /* Make sure we're fully resumed: */ + if (unlikely(timekeeping_suspended)) +@@ -1205,8 +1223,8 @@ static void update_wall_time(void) + timekeeping_update(tk, false); + + out: +- write_sequnlock_irqrestore(&tk->lock, flags); +- ++ write_seqcount_end(&tk->seq); ++ raw_spin_unlock_irqrestore(&tk->lock, flags); + } + + /** +@@ -1253,13 +1271,13 @@ void get_monotonic_boottime(struct times + WARN_ON(timekeeping_suspended); + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + ts->tv_sec = tk->xtime_sec; + nsec = timekeeping_get_ns(tk); + tomono = tk->wall_to_monotonic; + sleep = tk->total_sleep_time; + +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + ts->tv_sec += tomono.tv_sec + sleep.tv_sec; + ts->tv_nsec = 0; +@@ -1318,10 +1336,10 @@ struct timespec current_kernel_time(void + unsigned long seq; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + now = tk_xtime(tk); +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + return now; + } +@@ -1334,11 +1352,11 @@ struct timespec get_monotonic_coarse(voi + unsigned long seq; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + now = tk_xtime(tk); + mono = tk->wall_to_monotonic; +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + set_normalized_timespec(&now, now.tv_sec + mono.tv_sec, + now.tv_nsec + mono.tv_nsec); +@@ -1371,11 +1389,11 @@ void get_xtime_and_monotonic_and_sleep_o + unsigned long seq; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + *xtim = tk_xtime(tk); + *wtom = tk->wall_to_monotonic; + *sleep = tk->total_sleep_time; +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + } + + #ifdef CONFIG_HIGH_RES_TIMERS +@@ -1395,14 +1413,14 @@ ktime_t ktime_get_update_offsets(ktime_t + u64 secs, nsecs; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + + secs = tk->xtime_sec; + nsecs = timekeeping_get_ns(tk); + + *offs_real = tk->offs_real; + *offs_boot = tk->offs_boot; +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + now = ktime_add_ns(ktime_set(secs, 0), nsecs); + now = ktime_sub(now, *offs_real); +@@ -1420,9 +1438,9 @@ ktime_t ktime_get_monotonic_offset(void) + struct timespec wtom; + + do { +- seq = read_seqbegin(&tk->lock); ++ seq = read_seqcount_begin(&tk->seq); + wtom = tk->wall_to_monotonic; +- } while (read_seqretry(&tk->lock, seq)); ++ } while (read_seqcount_retry(&tk->seq, seq)); + + return timespec_to_ktime(wtom); + } +@@ -1436,7 +1454,9 @@ EXPORT_SYMBOL_GPL(ktime_get_monotonic_of + */ + void xtime_update(unsigned long ticks) + { +- write_seqlock(&xtime_lock); ++ raw_spin_lock(&xtime_lock); ++ write_seqcount_begin(&xtime_seq); + do_timer(ticks); +- write_sequnlock(&xtime_lock); ++ write_seqcount_end(&xtime_seq); ++ raw_spin_unlock(&xtime_lock); + } diff --git a/debian/patches/features/all/rt/0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch b/debian/patches/features/all/rt/timer-delay-waking-softirqs-from-the-jiffy-tick.patch similarity index 89% rename from debian/patches/features/all/rt/0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch rename to debian/patches/features/all/rt/timer-delay-waking-softirqs-from-the-jiffy-tick.patch index ffbd9603c..f34740312 100644 --- a/debian/patches/features/all/rt/0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch +++ b/debian/patches/features/all/rt/timer-delay-waking-softirqs-from-the-jiffy-tick.patch @@ -1,7 +1,6 @@ -From e829401695c05815c8135aff08b12203d8dfd62d Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 21 Aug 2009 11:56:45 +0200 -Subject: [112/256] timer: delay waking softirqs from the jiffy tick +Subject: timer: delay waking softirqs from the jiffy tick People were complaining about broken balancing with the recent -rt series. @@ -52,15 +51,16 @@ behaviour. Signed-off-by: Peter Zijlstra Signed-off-by: Thomas Gleixner + --- kernel/timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/timer.c b/kernel/timer.c -index e069d9f..8e410fc 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1384,13 +1384,13 @@ void update_process_times(int user_tick) +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -1398,13 +1398,13 @@ void update_process_times(int user_tick) /* Note: this timer irq context must be accounted for as well. */ account_process_tick(p, user_tick); diff --git a/debian/patches/features/all/rt/0120-timer-fd-Prevent-live-lock.patch b/debian/patches/features/all/rt/timer-fd-avoid-live-lock.patch similarity index 69% rename from debian/patches/features/all/rt/0120-timer-fd-Prevent-live-lock.patch rename to debian/patches/features/all/rt/timer-fd-avoid-live-lock.patch index e33db4715..8f6afe7f3 100644 --- a/debian/patches/features/all/rt/0120-timer-fd-Prevent-live-lock.patch +++ b/debian/patches/features/all/rt/timer-fd-avoid-live-lock.patch @@ -1,7 +1,6 @@ -From 0af6efbe1030ca203bda5ed92f2870f5b104d2b8 Mon Sep 17 00:00:00 2001 +Subject: timer-fd: Prevent live lock From: Thomas Gleixner Date: Wed, 25 Jan 2012 11:08:40 +0100 -Subject: [120/256] timer-fd: Prevent live lock If hrtimer_try_to_cancel() requires a retry, then depending on the priority setting te retry loop might prevent timer callback completion @@ -15,11 +14,11 @@ Cc: stable-rt@vger.kernel.org fs/timerfd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/fs/timerfd.c b/fs/timerfd.c -index dffeb37..57f0e4e 100644 ---- a/fs/timerfd.c -+++ b/fs/timerfd.c -@@ -313,7 +313,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, +Index: linux-stable/fs/timerfd.c +=================================================================== +--- linux-stable.orig/fs/timerfd.c ++++ linux-stable/fs/timerfd.c +@@ -313,7 +313,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, uf if (hrtimer_try_to_cancel(&ctx->tmr) >= 0) break; spin_unlock_irq(&ctx->wqh.lock); diff --git a/debian/patches/features/all/rt/0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch b/debian/patches/features/all/rt/timer-handle-idle-trylock-in-get-next-timer-irq.patch similarity index 56% rename from debian/patches/features/all/rt/0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch rename to debian/patches/features/all/rt/timer-handle-idle-trylock-in-get-next-timer-irq.patch index a421ddee1..e7cb3318c 100644 --- a/debian/patches/features/all/rt/0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch +++ b/debian/patches/features/all/rt/timer-handle-idle-trylock-in-get-next-timer-irq.patch @@ -1,7 +1,6 @@ -From 59b62bae6e0cd7be660a38a8b93e873fec85e078 Mon Sep 17 00:00:00 2001 +Subject: timer-handle-idle-trylock-in-get-next-timer-irq.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 22:08:38 +0200 -Subject: [182/256] timer-handle-idle-trylock-in-get-next-timer-irq.patch Signed-off-by: Thomas Gleixner --- @@ -10,11 +9,11 @@ Signed-off-by: Thomas Gleixner kernel/timer.c | 7 ++++--- 3 files changed, 16 insertions(+), 10 deletions(-) -diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h -index 205ca95..3b555b4 100644 ---- a/include/linux/spinlock_rt.h -+++ b/include/linux/spinlock_rt.h -@@ -51,7 +51,17 @@ extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); +Index: linux-stable/include/linux/spinlock_rt.h +=================================================================== +--- linux-stable.orig/include/linux/spinlock_rt.h ++++ linux-stable/include/linux/spinlock_rt.h +@@ -53,7 +53,17 @@ extern void __lockfunc __rt_spin_unlock( #define spin_lock_irq(lock) spin_lock(lock) @@ -33,10 +32,10 @@ index 205ca95..3b555b4 100644 #ifdef CONFIG_LOCKDEP # define spin_lock_nested(lock, subclass) \ -diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c -index f9baaae..921c90b 100644 ---- a/kernel/rtmutex.c -+++ b/kernel/rtmutex.c +Index: linux-stable/kernel/rtmutex.c +=================================================================== +--- linux-stable.orig/kernel/rtmutex.c ++++ linux-stable/kernel/rtmutex.c @@ -861,15 +861,10 @@ EXPORT_SYMBOL(rt_spin_unlock_wait); int __lockfunc rt_spin_trylock(spinlock_t *lock) @@ -54,25 +53,29 @@ index f9baaae..921c90b 100644 return ret; } EXPORT_SYMBOL(rt_spin_trylock); -diff --git a/kernel/timer.c b/kernel/timer.c -index cc2588b..f6f2958 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1373,13 +1373,14 @@ unsigned long get_next_timer_interrupt(unsigned long now) +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -1391,9 +1391,10 @@ unsigned long get_next_timer_interrupt(u /* * On PREEMPT_RT we cannot sleep here. If the trylock does not * succeed then we return the worst-case 'expires in 1 tick' - * value: -+ * value. We use the rt functions here directly to avoid a ++ * value. We use the rt functions here directly to avoid a + * migrate_disable() call. */ -- if (spin_trylock(&base->lock)) { -+ if (spin_do_trylock(&base->lock)) { - if (time_before_eq(base->next_timer, base->timer_jiffies)) +- if (!spin_trylock(&base->lock)) ++ if (!spin_do_trylock(&base->lock)) + return now + 1; + #else + spin_lock(&base->lock); +@@ -1403,7 +1404,7 @@ unsigned long get_next_timer_interrupt(u base->next_timer = __next_timer_interrupt(base); expires = base->next_timer; -- spin_unlock(&base->lock); -+ rt_spin_unlock(&base->lock); - } else { - expires = now + 1; } +- spin_unlock(&base->lock); ++ rt_spin_unlock(&base->lock); + + if (time_before_eq(expires, now)) + return now; diff --git a/debian/patches/features/all/rt/timer.c-fix-build-fail-for-RT_FULL.patch b/debian/patches/features/all/rt/timer.c-fix-build-fail-for-RT_FULL.patch new file mode 100644 index 000000000..0b33214d0 --- /dev/null +++ b/debian/patches/features/all/rt/timer.c-fix-build-fail-for-RT_FULL.patch @@ -0,0 +1,45 @@ +From 1f9b191467b70ed79480294395ad99145fea1b5a Mon Sep 17 00:00:00 2001 +From: Paul Gortmaker +Date: Tue, 9 Oct 2012 20:20:10 -0400 +Subject: [PATCH] timer.c: fix build fail for ! RT_FULL +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The patch "timer-handle-idle-trylock-in-get-next-timer-irq.patch" +introduces a use of rt_spin_unlock outside of the RT_FULL, but +since we have: + + #ifdef CONFIG_PREEMPT_RT_FULL + # include + #else /* PREEMPT_RT_FULL */ + +we will not get the definition for !RT_FULL and instead see: + +kernel/timer.c: In function ‘get_next_timer_interrupt’: +kernel/timer.c:1407: error: implicit declaration of function ‘rt_spin_unlock’ +make[2]: *** [kernel/timer.o] Error 1 + +Extend the ifdef usage to cover the unlock case too. + +Signed-off-by: Paul Gortmaker + +diff --git a/kernel/timer.c b/kernel/timer.c +index 00f1d4f..e81d197 100644 +--- a/kernel/timer.c ++++ b/kernel/timer.c +@@ -1404,7 +1404,11 @@ unsigned long get_next_timer_interrupt(unsigned long now) + base->next_timer = __next_timer_interrupt(base); + expires = base->next_timer; + } ++#ifdef CONFIG_PREEMPT_RT_FULL + rt_spin_unlock(&base->lock); ++#else ++ spin_unlock(&base->lock); ++#endif + + if (time_before_eq(expires, now)) + return now; +-- +1.7.0.4 + diff --git a/debian/patches/features/all/rt/0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch b/debian/patches/features/all/rt/timers-avoid-the-base-null-otptimization-on-rt.patch similarity index 80% rename from debian/patches/features/all/rt/0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch rename to debian/patches/features/all/rt/timers-avoid-the-base-null-otptimization-on-rt.patch index 6a63e0589..c038f1c64 100644 --- a/debian/patches/features/all/rt/0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch +++ b/debian/patches/features/all/rt/timers-avoid-the-base-null-otptimization-on-rt.patch @@ -1,8 +1,6 @@ -From be4d0930149b21a8ce3736546849adc15fea5c2d Mon Sep 17 00:00:00 2001 +Subject: timers: Avoid the switch timers base set to NULL trick on RT From: Thomas Gleixner Date: Thu, 21 Jul 2011 15:23:39 +0200 -Subject: [113/256] timers: Avoid the switch timers base set to NULL trick on - RT On RT that code is preemptible, so we cannot assign NULL to timers base as a preempter would spin forever in lock_timer_base(). @@ -12,11 +10,11 @@ Signed-off-by: Thomas Gleixner kernel/timer.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) -diff --git a/kernel/timer.c b/kernel/timer.c -index 8e410fc..cc2588b 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -700,6 +700,36 @@ static struct tvec_base *lock_timer_base(struct timer_list *timer, +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -737,6 +737,36 @@ static struct tvec_base *lock_timer_base } } @@ -53,7 +51,7 @@ index 8e410fc..cc2588b 100644 static inline int __mod_timer(struct timer_list *timer, unsigned long expires, bool pending_only, int pinned) -@@ -745,14 +775,8 @@ __mod_timer(struct timer_list *timer, unsigned long expires, +@@ -775,14 +805,8 @@ __mod_timer(struct timer_list *timer, un * handler yet has not finished. This also guarantees that * the timer is serialized wrt itself. */ diff --git a/debian/patches/features/all/rt/0111-timers-mov-printk_tick-to-soft-interrupt.patch b/debian/patches/features/all/rt/timers-mov-printk_tick-to-soft-interrupt.patch similarity index 60% rename from debian/patches/features/all/rt/0111-timers-mov-printk_tick-to-soft-interrupt.patch rename to debian/patches/features/all/rt/timers-mov-printk_tick-to-soft-interrupt.patch index f60202367..80eaabee2 100644 --- a/debian/patches/features/all/rt/0111-timers-mov-printk_tick-to-soft-interrupt.patch +++ b/debian/patches/features/all/rt/timers-mov-printk_tick-to-soft-interrupt.patch @@ -1,19 +1,19 @@ -From be57df33818c14ac40de00d5b436451bdc3f9e1b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:30 -0500 -Subject: [111/256] timers: mov printk_tick to soft interrupt +Subject: timers: mov printk_tick to soft interrupt Signed-off-by: Thomas Gleixner Signed-off-by: Ingo Molnar + --- kernel/timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/kernel/timer.c b/kernel/timer.c -index 7ba0602..e069d9f 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1386,7 +1386,6 @@ void update_process_times(int user_tick) +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -1400,7 +1400,6 @@ void update_process_times(int user_tick) account_process_tick(p, user_tick); run_local_timers(); rcu_check_callbacks(cpu, user_tick); @@ -21,7 +21,7 @@ index 7ba0602..e069d9f 100644 #ifdef CONFIG_IRQ_WORK if (in_irq()) irq_work_run(); -@@ -1402,6 +1401,7 @@ static void run_timer_softirq(struct softirq_action *h) +@@ -1416,6 +1415,7 @@ static void run_timer_softirq(struct sof { struct tvec_base *base = __this_cpu_read(tvec_bases); diff --git a/debian/patches/features/all/rt/timers-preempt-rt-support.patch b/debian/patches/features/all/rt/timers-preempt-rt-support.patch new file mode 100644 index 000000000..99ff6afbb --- /dev/null +++ b/debian/patches/features/all/rt/timers-preempt-rt-support.patch @@ -0,0 +1,58 @@ +From: Ingo Molnar +Date: Fri, 3 Jul 2009 08:30:20 -0500 +Subject: timers: preempt-rt support + +Signed-off-by: Ingo Molnar +Signed-off-by: Thomas Gleixner +--- + kernel/timer.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c +@@ -1363,7 +1363,17 @@ unsigned long get_next_timer_interrupt(u + if (cpu_is_offline(smp_processor_id())) + return expires; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* ++ * On PREEMPT_RT we cannot sleep here. If the trylock does not ++ * succeed then we return the worst-case 'expires in 1 tick' ++ * value: ++ */ ++ if (!spin_trylock(&base->lock)) ++ return now + 1; ++#else + spin_lock(&base->lock); ++#endif + if (base->active_timers) { + if (time_before_eq(base->next_timer, base->timer_jiffies)) + base->next_timer = __next_timer_interrupt(base); +@@ -1373,7 +1383,6 @@ unsigned long get_next_timer_interrupt(u + + if (time_before_eq(expires, now)) + return now; +- + return cmp_next_hrtimer_event(now, expires); + } + #endif +@@ -1763,7 +1772,7 @@ static void __cpuinit migrate_timers(int + + BUG_ON(cpu_online(cpu)); + old_base = per_cpu(tvec_bases, cpu); +- new_base = get_cpu_var(tvec_bases); ++ new_base = get_local_var(tvec_bases); + /* + * The caller is globally serialized and nobody else + * takes two locks at once, deadlock is not possible. +@@ -1784,7 +1793,7 @@ static void __cpuinit migrate_timers(int + + spin_unlock(&old_base->lock); + spin_unlock_irq(&new_base->lock); +- put_cpu_var(tvec_bases); ++ put_local_var(tvec_bases); + } + #endif /* CONFIG_HOTPLUG_CPU */ + diff --git a/debian/patches/features/all/rt/0108-timers-prepare-for-full-preemption.patch b/debian/patches/features/all/rt/timers-prepare-for-full-preemption.patch similarity index 75% rename from debian/patches/features/all/rt/0108-timers-prepare-for-full-preemption.patch rename to debian/patches/features/all/rt/timers-prepare-for-full-preemption.patch index b316a6a76..aee04f24f 100644 --- a/debian/patches/features/all/rt/0108-timers-prepare-for-full-preemption.patch +++ b/debian/patches/features/all/rt/timers-prepare-for-full-preemption.patch @@ -1,7 +1,6 @@ -From 956175284be7bd386ecb0b5112988c5bcd07adda Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:34 -0500 -Subject: [108/256] timers: prepare for full preemption +Subject: timers: prepare for full preemption When softirqs can be preempted we need to make sure that cancelling the timer from the active thread can not deadlock vs. a running timer @@ -9,16 +8,17 @@ callback. Add a waitqueue to resolve that. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- include/linux/timer.h | 2 +- kernel/timer.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) -diff --git a/include/linux/timer.h b/include/linux/timer.h -index 6abd913..b703477 100644 ---- a/include/linux/timer.h -+++ b/include/linux/timer.h -@@ -276,7 +276,7 @@ extern void add_timer(struct timer_list *timer); +Index: linux-stable/include/linux/timer.h +=================================================================== +--- linux-stable.orig/include/linux/timer.h ++++ linux-stable/include/linux/timer.h +@@ -276,7 +276,7 @@ extern void add_timer(struct timer_list extern int try_to_del_timer_sync(struct timer_list *timer); @@ -27,10 +27,10 @@ index 6abd913..b703477 100644 extern int del_timer_sync(struct timer_list *timer); #else # define del_timer_sync(t) del_timer(t) -diff --git a/kernel/timer.c b/kernel/timer.c -index a297ffc..d7ad9d0 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c +Index: linux-stable/kernel/timer.c +=================================================================== +--- linux-stable.orig/kernel/timer.c ++++ linux-stable/kernel/timer.c @@ -75,6 +75,7 @@ struct tvec_root { struct tvec_base { spinlock_t lock; @@ -38,8 +38,8 @@ index a297ffc..d7ad9d0 100644 + wait_queue_head_t wait_for_running_timer; unsigned long timer_jiffies; unsigned long next_timer; - struct tvec_root tv1; -@@ -725,12 +726,15 @@ __mod_timer(struct timer_list *timer, unsigned long expires, + unsigned long active_timers; +@@ -755,12 +756,15 @@ __mod_timer(struct timer_list *timer, un debug_activate(timer, expires); @@ -55,7 +55,7 @@ index a297ffc..d7ad9d0 100644 new_base = per_cpu(tvec_bases, cpu); if (base != new_base) { -@@ -931,6 +935,29 @@ void add_timer_on(struct timer_list *timer, int cpu) +@@ -961,6 +965,29 @@ void add_timer_on(struct timer_list *tim } EXPORT_SYMBOL_GPL(add_timer_on); @@ -85,7 +85,7 @@ index a297ffc..d7ad9d0 100644 /** * del_timer - deactive a timer. * @timer: the timer to be deactivated -@@ -1003,7 +1030,7 @@ out: +@@ -1018,7 +1045,7 @@ int try_to_del_timer_sync(struct timer_l } EXPORT_SYMBOL(try_to_del_timer_sync); @@ -94,7 +94,7 @@ index a297ffc..d7ad9d0 100644 /** * del_timer_sync - deactivate a timer and wait for the handler to finish. * @timer: the timer to be deactivated -@@ -1063,7 +1090,7 @@ int del_timer_sync(struct timer_list *timer) +@@ -1078,7 +1105,7 @@ int del_timer_sync(struct timer_list *ti int ret = try_to_del_timer_sync(timer); if (ret >= 0) return ret; @@ -103,7 +103,7 @@ index a297ffc..d7ad9d0 100644 } } EXPORT_SYMBOL(del_timer_sync); -@@ -1174,10 +1201,11 @@ static inline void __run_timers(struct tvec_base *base) +@@ -1192,10 +1219,11 @@ static inline void __run_timers(struct t spin_unlock_irq(&base->lock); call_timer_fn(timer, fn, data); @@ -116,7 +116,7 @@ index a297ffc..d7ad9d0 100644 spin_unlock_irq(&base->lock); } -@@ -1684,6 +1712,7 @@ static int __cpuinit init_timers_cpu(int cpu) +@@ -1696,6 +1724,7 @@ static int __cpuinit init_timers_cpu(int } spin_lock_init(&base->lock); diff --git a/debian/patches/features/all/rt/0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch b/debian/patches/features/all/rt/tracing-account-for-preempt-off-in-preempt_schedule.patch similarity index 81% rename from debian/patches/features/all/rt/0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch rename to debian/patches/features/all/rt/tracing-account-for-preempt-off-in-preempt_schedule.patch index 5720ad7cd..3250535a1 100644 --- a/debian/patches/features/all/rt/0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch +++ b/debian/patches/features/all/rt/tracing-account-for-preempt-off-in-preempt_schedule.patch @@ -1,7 +1,6 @@ -From 790051379b585c8e25e9d3ecb014e256cd0b224d Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Thu, 29 Sep 2011 12:24:30 -0500 -Subject: [014/256] tracing: Account for preempt off in preempt_schedule() +Subject: tracing: Account for preempt off in preempt_schedule() The preempt_schedule() uses the preempt_disable_notrace() version because it can cause infinite recursion by the function tracer as @@ -26,11 +25,11 @@ Signed-off-by: Thomas Gleixner kernel/sched/core.c | 9 +++++++++ 1 file changed, 9 insertions(+) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 2db74b7..83a36dd 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3312,7 +3312,16 @@ asmlinkage void __sched notrace preempt_schedule(void) +Index: linux-stable/kernel/sched/core.c +=================================================================== +--- linux-stable.orig/kernel/sched/core.c ++++ linux-stable/kernel/sched/core.c +@@ -3544,7 +3544,16 @@ asmlinkage void __sched notrace preempt_ do { add_preempt_count_notrace(PREEMPT_ACTIVE); diff --git a/debian/patches/features/all/rt/0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch b/debian/patches/features/all/rt/tty-use-local-irq-nort.patch similarity index 73% rename from debian/patches/features/all/rt/0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch rename to debian/patches/features/all/rt/tty-use-local-irq-nort.patch index 0fb4bde80..cecab62c5 100644 --- a/debian/patches/features/all/rt/0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch +++ b/debian/patches/features/all/rt/tty-use-local-irq-nort.patch @@ -1,7 +1,6 @@ -From 1768c2fabf9448f25e3df60802631669b34b31af Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 17 Aug 2009 19:49:19 +0200 -Subject: [072/256] tty: Do not disable interrupts in put_ldisc on -rt +Subject: tty: Do not disable interrupts in put_ldisc on -rt Fixes the following on PREEMPT_RT: @@ -21,15 +20,16 @@ Call Trace: .... Signed-off-by: Thomas Gleixner + --- drivers/tty/tty_ldisc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c -index 24b95db..7894759 100644 ---- a/drivers/tty/tty_ldisc.c -+++ b/drivers/tty/tty_ldisc.c -@@ -53,7 +53,7 @@ static void put_ldisc(struct tty_ldisc *ld) +Index: linux-stable/drivers/tty/tty_ldisc.c +=================================================================== +--- linux-stable.orig/drivers/tty/tty_ldisc.c ++++ linux-stable/drivers/tty/tty_ldisc.c +@@ -52,7 +52,7 @@ static void put_ldisc(struct tty_ldisc * * We really want an "atomic_dec_and_lock_irqsave()", * but we don't have it, so this does it by hand. */ @@ -38,12 +38,12 @@ index 24b95db..7894759 100644 if (atomic_dec_and_lock(&ld->users, &tty_ldisc_lock)) { struct tty_ldisc_ops *ldo = ld->ops; -@@ -64,7 +64,7 @@ static void put_ldisc(struct tty_ldisc *ld) +@@ -63,7 +63,7 @@ static void put_ldisc(struct tty_ldisc * kfree(ld); return; } - local_irq_restore(flags); + local_irq_restore_nort(flags); - wake_up(&tty_ldisc_idle); + wake_up(&ld->wq_idle); } diff --git a/debian/patches/features/all/rt/0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch b/debian/patches/features/all/rt/upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch similarity index 81% rename from debian/patches/features/all/rt/0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch rename to debian/patches/features/all/rt/upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch index eca188bb3..442c38d55 100644 --- a/debian/patches/features/all/rt/0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch +++ b/debian/patches/features/all/rt/upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch @@ -1,7 +1,6 @@ -From 42a13452102effbafe38310e7bfb4f79a92c3801 Mon Sep 17 00:00:00 2001 +Subject: [UPSTREAM]net,RT:REmove preemption disabling in netif_rx() From: Priyanka Jain Date: Thu, 17 May 2012 09:35:11 +0530 -Subject: [243/256] net,RT:REmove preemption disabling in netif_rx() 1)enqueue_to_backlog() (called from netif_rx) should be bind to a particluar CPU. This can be achieved by @@ -31,14 +30,16 @@ Link: http://lkml.kernel.org/r/1337227511-2271-1-git-send-email-Priyanka.Jain@fr Cc: stable-rt@vger.kernel.org Signed-off-by: Thomas Gleixner --- + Testing: Tested successfully on p4080ds(8-core SMP system) + net/core/dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -diff --git a/net/core/dev.c b/net/core/dev.c -index 292930b..382a810 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -2937,7 +2937,7 @@ int netif_rx(struct sk_buff *skb) +Index: linux-stable/net/core/dev.c +=================================================================== +--- linux-stable.orig/net/core/dev.c ++++ linux-stable/net/core/dev.c +@@ -2967,7 +2967,7 @@ int netif_rx(struct sk_buff *skb) struct rps_dev_flow voidflow, *rflow = &voidflow; int cpu; @@ -47,7 +48,7 @@ index 292930b..382a810 100644 rcu_read_lock(); cpu = get_rps_cpu(skb->dev, skb, &rflow); -@@ -2947,13 +2947,13 @@ int netif_rx(struct sk_buff *skb) +@@ -2977,13 +2977,13 @@ int netif_rx(struct sk_buff *skb) ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); rcu_read_unlock(); diff --git a/debian/patches/features/all/rt/0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch b/debian/patches/features/all/rt/usb-fix-mouse-problem-copying-large-data.patch similarity index 69% rename from debian/patches/features/all/rt/0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch rename to debian/patches/features/all/rt/usb-fix-mouse-problem-copying-large-data.patch index 6a3edc340..16dc2c244 100644 --- a/debian/patches/features/all/rt/0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch +++ b/debian/patches/features/all/rt/usb-fix-mouse-problem-copying-large-data.patch @@ -1,8 +1,6 @@ -From 61d7b08ff3cd6e280a253731dd2c96053fb8f180 Mon Sep 17 00:00:00 2001 From: Wu Zhangjin Date: Mon, 4 Jan 2010 11:33:02 +0800 -Subject: [086/256] USB: Fix the mouse problem when copying large amounts of - data +Subject: USB: Fix the mouse problem when copying large amounts of data When copying large amounts of data between the USB storage devices and the hard disk, the USB mouse will not work, this patch fixes it. @@ -12,15 +10,16 @@ sure whether it is producible on other platforms] Signed-off-by: Hu Hongbing Signed-off-by: Wu Zhangjin + --- drivers/usb/host/ohci-hcd.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) -diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c -index 235171f..0157357 100644 ---- a/drivers/usb/host/ohci-hcd.c -+++ b/drivers/usb/host/ohci-hcd.c -@@ -829,9 +829,13 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) +Index: linux-stable/drivers/usb/host/ohci-hcd.c +=================================================================== +--- linux-stable.orig/drivers/usb/host/ohci-hcd.c ++++ linux-stable/drivers/usb/host/ohci-hcd.c +@@ -829,9 +829,13 @@ static irqreturn_t ohci_irq (struct usb_ } if (ints & OHCI_INTR_WDH) { diff --git a/debian/patches/features/all/rt/0071-usb-Use-local_irq_-_nort-variants.patch b/debian/patches/features/all/rt/usb-hcd-use-local-irq-nort.patch similarity index 64% rename from debian/patches/features/all/rt/0071-usb-Use-local_irq_-_nort-variants.patch rename to debian/patches/features/all/rt/usb-hcd-use-local-irq-nort.patch index cec9a99dc..b3b232359 100644 --- a/debian/patches/features/all/rt/0071-usb-Use-local_irq_-_nort-variants.patch +++ b/debian/patches/features/all/rt/usb-hcd-use-local-irq-nort.patch @@ -1,22 +1,22 @@ -From 258bb522623fb90bc43937fbea8306b2dfeda2f5 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Fri, 3 Jul 2009 08:44:26 -0500 -Subject: [071/256] usb: Use local_irq_*_nort() variants +Subject: usb: Use local_irq_*_nort() variants [ tglx: Now that irqf_disabled is dead we should kill that ] Signed-off-by: Steven Rostedt Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- drivers/usb/core/hcd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c -index 140d3e1..82ea8bf 100644 ---- a/drivers/usb/core/hcd.c -+++ b/drivers/usb/core/hcd.c -@@ -2143,7 +2143,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) +Index: linux-stable/drivers/usb/core/hcd.c +=================================================================== +--- linux-stable.orig/drivers/usb/core/hcd.c ++++ linux-stable/drivers/usb/core/hcd.c +@@ -2158,7 +2158,7 @@ irqreturn_t usb_hcd_irq (int irq, void * * when the first handler doesn't use it. So let's just * assume it's never used. */ @@ -25,7 +25,7 @@ index 140d3e1..82ea8bf 100644 if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) rc = IRQ_NONE; -@@ -2152,7 +2152,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) +@@ -2167,7 +2167,7 @@ irqreturn_t usb_hcd_irq (int irq, void * else rc = IRQ_HANDLED; diff --git a/debian/patches/features/all/rt/0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch b/debian/patches/features/all/rt/user-use-local-irq-nort.patch similarity index 59% rename from debian/patches/features/all/rt/0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch rename to debian/patches/features/all/rt/user-use-local-irq-nort.patch index 9a5da2bb7..4ab6f289f 100644 --- a/debian/patches/features/all/rt/0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch +++ b/debian/patches/features/all/rt/user-use-local-irq-nort.patch @@ -1,21 +1,21 @@ -From eb024515bfe2198996d05662a0aa4665dd0f2e04 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 21 Jul 2009 23:06:05 +0200 -Subject: [069/256] core: Do not disable interrupts on RT in kernel/users.c +Subject: core: Do not disable interrupts on RT in kernel/users.c Use the local_irq_*_nort variants to reduce latencies in RT. The code is serialized by the locks. No need to disable interrupts. Signed-off-by: Thomas Gleixner + --- kernel/user.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/kernel/user.c b/kernel/user.c -index 71dd236..b831e51 100644 ---- a/kernel/user.c -+++ b/kernel/user.c -@@ -129,11 +129,11 @@ void free_uid(struct user_struct *up) +Index: linux-stable/kernel/user.c +=================================================================== +--- linux-stable.orig/kernel/user.c ++++ linux-stable/kernel/user.c +@@ -147,11 +147,11 @@ void free_uid(struct user_struct *up) if (!up) return; @@ -28,4 +28,4 @@ index 71dd236..b831e51 100644 + local_irq_restore_nort(flags); } - struct user_struct *alloc_uid(struct user_namespace *ns, uid_t uid) + struct user_struct *alloc_uid(kuid_t uid) diff --git a/debian/patches/features/all/rt/0205-workqueue-use-get-cpu-light.patch.patch b/debian/patches/features/all/rt/workqueue-use-get-cpu-light.patch similarity index 52% rename from debian/patches/features/all/rt/0205-workqueue-use-get-cpu-light.patch.patch rename to debian/patches/features/all/rt/workqueue-use-get-cpu-light.patch index 0ac90c977..88cad8f53 100644 --- a/debian/patches/features/all/rt/0205-workqueue-use-get-cpu-light.patch.patch +++ b/debian/patches/features/all/rt/workqueue-use-get-cpu-light.patch @@ -1,18 +1,17 @@ -From 08ce4a26ff20830b3207a1a30506a234bc29d652 Mon Sep 17 00:00:00 2001 +Subject: workqueue-use-get-cpu-light.patch From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:42:26 +0200 -Subject: [205/256] workqueue-use-get-cpu-light.patch Signed-off-by: Thomas Gleixner --- kernel/workqueue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 3fd5280..33d1095 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -1058,8 +1058,8 @@ int queue_work(struct workqueue_struct *wq, struct work_struct *work) +Index: linux-stable/kernel/workqueue.c +=================================================================== +--- linux-stable.orig/kernel/workqueue.c ++++ linux-stable/kernel/workqueue.c +@@ -1067,8 +1067,8 @@ int queue_work(struct workqueue_struct * { int ret; diff --git a/debian/patches/features/all/rt/0231-x86-crypto-Reduce-preempt-disabled-regions.patch b/debian/patches/features/all/rt/x86-crypto-reduce-preempt-disabled-regions.patch similarity index 80% rename from debian/patches/features/all/rt/0231-x86-crypto-Reduce-preempt-disabled-regions.patch rename to debian/patches/features/all/rt/x86-crypto-reduce-preempt-disabled-regions.patch index 5962e137c..fe0b33991 100644 --- a/debian/patches/features/all/rt/0231-x86-crypto-Reduce-preempt-disabled-regions.patch +++ b/debian/patches/features/all/rt/x86-crypto-reduce-preempt-disabled-regions.patch @@ -1,7 +1,6 @@ -From d6cb28d2349412e322b5ae1a8fd925326abe2224 Mon Sep 17 00:00:00 2001 +Subject: x86: crypto: Reduce preempt disabled regions From: Peter Zijlstra Date: Mon, 14 Nov 2011 18:19:27 +0100 -Subject: [231/256] x86: crypto: Reduce preempt disabled regions Restrict the preempt disabled regions to the actual floating point operations and enable preemption for the administrative actions. @@ -17,11 +16,11 @@ Signed-off-by: Thomas Gleixner arch/x86/crypto/aesni-intel_glue.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) -diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c -index c799352..0efa514 100644 ---- a/arch/x86/crypto/aesni-intel_glue.c -+++ b/arch/x86/crypto/aesni-intel_glue.c -@@ -290,14 +290,14 @@ static int ecb_encrypt(struct blkcipher_desc *desc, +Index: linux-stable/arch/x86/crypto/aesni-intel_glue.c +=================================================================== +--- linux-stable.orig/arch/x86/crypto/aesni-intel_glue.c ++++ linux-stable/arch/x86/crypto/aesni-intel_glue.c +@@ -245,14 +245,14 @@ static int ecb_encrypt(struct blkcipher_ err = blkcipher_walk_virt(desc, &walk); desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; @@ -39,7 +38,7 @@ index c799352..0efa514 100644 return err; } -@@ -314,14 +314,14 @@ static int ecb_decrypt(struct blkcipher_desc *desc, +@@ -269,14 +269,14 @@ static int ecb_decrypt(struct blkcipher_ err = blkcipher_walk_virt(desc, &walk); desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; @@ -56,7 +55,7 @@ index c799352..0efa514 100644 return err; } -@@ -360,14 +360,14 @@ static int cbc_encrypt(struct blkcipher_desc *desc, +@@ -293,14 +293,14 @@ static int cbc_encrypt(struct blkcipher_ err = blkcipher_walk_virt(desc, &walk); desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; @@ -73,7 +72,7 @@ index c799352..0efa514 100644 return err; } -@@ -384,14 +384,14 @@ static int cbc_decrypt(struct blkcipher_desc *desc, +@@ -317,14 +317,14 @@ static int cbc_decrypt(struct blkcipher_ err = blkcipher_walk_virt(desc, &walk); desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; @@ -90,7 +89,7 @@ index c799352..0efa514 100644 return err; } -@@ -446,18 +446,20 @@ static int ctr_crypt(struct blkcipher_desc *desc, +@@ -357,18 +357,20 @@ static int ctr_crypt(struct blkcipher_de err = blkcipher_walk_virt_block(desc, &walk, AES_BLOCK_SIZE); desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; diff --git a/debian/patches/features/all/rt/0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch b/debian/patches/features/all/rt/x86-disable-debug-stack.patch similarity index 79% rename from debian/patches/features/all/rt/0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch rename to debian/patches/features/all/rt/x86-disable-debug-stack.patch index 4d2fab67f..b3096eada 100644 --- a/debian/patches/features/all/rt/0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch +++ b/debian/patches/features/all/rt/x86-disable-debug-stack.patch @@ -1,8 +1,6 @@ -From e95297fb065f625d14e6eefa32bc89936b24225f Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Fri, 3 Jul 2009 08:44:10 -0500 -Subject: [204/256] x86: Disable IST stacks for debug/int 3/stack fault for - PREEMPT_RT +Subject: x86: Disable IST stacks for debug/int 3/stack fault for PREEMPT_RT Normally the x86-64 trap handlers for debug/int 3/stack fault run on a special interrupt stack to make them more robust @@ -43,10 +41,10 @@ Signed-off-by: Thomas Gleixner arch/x86/kernel/dumpstack_64.c | 4 ++++ 3 files changed, 21 insertions(+), 6 deletions(-) -diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h -index 7639dbf..0883ecd 100644 ---- a/arch/x86/include/asm/page_64_types.h -+++ b/arch/x86/include/asm/page_64_types.h +Index: linux-stable/arch/x86/include/asm/page_64_types.h +=================================================================== +--- linux-stable.orig/arch/x86/include/asm/page_64_types.h ++++ linux-stable/arch/x86/include/asm/page_64_types.h @@ -14,12 +14,21 @@ #define IRQ_STACK_ORDER 2 #define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER) @@ -75,11 +73,11 @@ index 7639dbf..0883ecd 100644 #define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT) #define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1)) -diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c -index cf79302..f743261 100644 ---- a/arch/x86/kernel/cpu/common.c -+++ b/arch/x86/kernel/cpu/common.c -@@ -1056,7 +1056,9 @@ DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); +Index: linux-stable/arch/x86/kernel/cpu/common.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/common.c ++++ linux-stable/arch/x86/kernel/cpu/common.c +@@ -1089,7 +1089,9 @@ DEFINE_PER_CPU(struct task_struct *, fpu */ static const unsigned int exception_stack_sizes[N_EXCEPTION_STACKS] = { [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STKSZ, @@ -89,10 +87,10 @@ index cf79302..f743261 100644 }; static DEFINE_PER_CPU_PAGE_ALIGNED(char, exception_stacks -diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c -index 17107bd..9d50b30 100644 ---- a/arch/x86/kernel/dumpstack_64.c -+++ b/arch/x86/kernel/dumpstack_64.c +Index: linux-stable/arch/x86/kernel/dumpstack_64.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/dumpstack_64.c ++++ linux-stable/arch/x86/kernel/dumpstack_64.c @@ -21,10 +21,14 @@ (N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2) diff --git a/debian/patches/features/all/rt/0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch b/debian/patches/features/all/rt/x86-highmem-warn.patch similarity index 64% rename from debian/patches/features/all/rt/0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch rename to debian/patches/features/all/rt/x86-highmem-warn.patch index 6ddf02596..64dbe519d 100644 --- a/debian/patches/features/all/rt/0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch +++ b/debian/patches/features/all/rt/x86-highmem-warn.patch @@ -1,22 +1,22 @@ -From b3dedd0614e195732983bfef6b77c20c13629bee Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:25 -0500 -Subject: [038/256] x86: highmem: Replace BUG_ON by WARN_ON +Subject: x86: highmem: Replace BUG_ON by WARN_ON The machine might survive that problem and be at least in a state which allows us to get more information about the problem. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- arch/x86/mm/highmem_32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c -index 6f31ee5..ab8683a 100644 ---- a/arch/x86/mm/highmem_32.c -+++ b/arch/x86/mm/highmem_32.c -@@ -43,7 +43,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) +Index: linux-stable/arch/x86/mm/highmem_32.c +=================================================================== +--- linux-stable.orig/arch/x86/mm/highmem_32.c ++++ linux-stable/arch/x86/mm/highmem_32.c +@@ -43,7 +43,7 @@ void *kmap_atomic_prot(struct page *page type = kmap_atomic_idx_push(); idx = type + KM_TYPE_NR*smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); diff --git a/debian/patches/features/all/rt/0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch b/debian/patches/features/all/rt/x86-hpet-disable-msi-on-lenovo-w510.patch similarity index 77% rename from debian/patches/features/all/rt/0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch rename to debian/patches/features/all/rt/x86-hpet-disable-msi-on-lenovo-w510.patch index 8b3a92c0f..1027a1dd1 100644 --- a/debian/patches/features/all/rt/0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch +++ b/debian/patches/features/all/rt/x86-hpet-disable-msi-on-lenovo-w510.patch @@ -1,7 +1,6 @@ -From 3930a7c7ee07fdeebfa913ee0647589eaae47eb8 Mon Sep 17 00:00:00 2001 +Subject: x86: hpet: Disable MSI on Lenovo W510 From: Thomas Gleixner Date: Fri, 30 Sep 2011 20:03:37 +0200 -Subject: [005/256] x86: hpet: Disable MSI on Lenovo W510 MSI based per cpu timers lose interrupts when intel_idle() is enabled - independent of the c-state. With idle=poll the problem cannot be @@ -13,10 +12,10 @@ Signed-off-by: Thomas Gleixner arch/x86/kernel/hpet.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) -diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c -index ad0de0c..230a200 100644 ---- a/arch/x86/kernel/hpet.c -+++ b/arch/x86/kernel/hpet.c +Index: linux-stable/arch/x86/kernel/hpet.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/hpet.c ++++ linux-stable/arch/x86/kernel/hpet.c @@ -8,6 +8,7 @@ #include #include @@ -25,7 +24,7 @@ index ad0de0c..230a200 100644 #include #include #include -@@ -570,6 +571,30 @@ static void init_one_hpet_msi_clockevent(struct hpet_dev *hdev, int cpu) +@@ -573,6 +574,30 @@ static void init_one_hpet_msi_clockevent #define RESERVE_TIMERS 0 #endif @@ -56,7 +55,7 @@ index ad0de0c..230a200 100644 static void hpet_msi_capability_lookup(unsigned int start_timer) { unsigned int id; -@@ -577,6 +602,8 @@ static void hpet_msi_capability_lookup(unsigned int start_timer) +@@ -580,6 +605,8 @@ static void hpet_msi_capability_lookup(u unsigned int num_timers_used = 0; int i; diff --git a/debian/patches/features/all/rt/0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch b/debian/patches/features/all/rt/x86-io-apic-migra-no-unmask.patch similarity index 65% rename from debian/patches/features/all/rt/0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch rename to debian/patches/features/all/rt/x86-io-apic-migra-no-unmask.patch index 0612c1a99..e3a516f24 100644 --- a/debian/patches/features/all/rt/0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch +++ b/debian/patches/features/all/rt/x86-io-apic-migra-no-unmask.patch @@ -1,22 +1,22 @@ -From 1072a59271876515f215b3a6d83cd709f13c29ab Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:27 -0500 -Subject: [050/256] x86: Do not unmask io_apic when interrupt is in progress +Subject: x86: Do not unmask io_apic when interrupt is in progress With threaded interrupts we might see an interrupt in progress on migration. Do not unmask it when this is the case. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner + --- arch/x86/kernel/apic/io_apic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c -index e88300d..01c76a0 100644 ---- a/arch/x86/kernel/apic/io_apic.c -+++ b/arch/x86/kernel/apic/io_apic.c -@@ -2555,7 +2555,8 @@ atomic_t irq_mis_count; +Index: linux-stable/arch/x86/kernel/apic/io_apic.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/apic/io_apic.c ++++ linux-stable/arch/x86/kernel/apic/io_apic.c +@@ -2437,7 +2437,8 @@ static bool io_apic_level_ack_pending(st static inline bool ioapic_irqd_mask(struct irq_data *data, struct irq_cfg *cfg) { /* If we are moving the irq we need to mask it */ diff --git a/debian/patches/features/all/rt/0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch b/debian/patches/features/all/rt/x86-kprobes-remove-bogus-preempt-enable.patch similarity index 59% rename from debian/patches/features/all/rt/0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch rename to debian/patches/features/all/rt/x86-kprobes-remove-bogus-preempt-enable.patch index 23aab4e63..9f0ae36ec 100644 --- a/debian/patches/features/all/rt/0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch +++ b/debian/patches/features/all/rt/x86-kprobes-remove-bogus-preempt-enable.patch @@ -1,7 +1,6 @@ -From 76e113bcae99f4b0d58f884cd38bc8cfc94f5f93 Mon Sep 17 00:00:00 2001 +Subject: x86: kprobes: Remove remove bogus preempt_enable From: Thomas Gleixner Date: Thu, 17 Mar 2011 11:02:15 +0100 -Subject: [003/256] x86: kprobes: Remove remove bogus preempt_enable The CONFIG_PREEMPT=n section of setup_singlestep() contains: @@ -16,11 +15,11 @@ Signed-off-by: Thomas Gleixner arch/x86/kernel/kprobes.c | 1 - 1 file changed, 1 deletion(-) -diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c -index e213fc8..b9edf1a 100644 ---- a/arch/x86/kernel/kprobes.c -+++ b/arch/x86/kernel/kprobes.c -@@ -486,7 +486,6 @@ setup_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *k +Index: linux-stable/arch/x86/kernel/kprobes.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/kprobes.c ++++ linux-stable/arch/x86/kernel/kprobes.c +@@ -486,7 +486,6 @@ setup_singlestep(struct kprobe *p, struc * stepping. */ regs->ip = (unsigned long)p->ainsn.insn; diff --git a/debian/patches/features/all/rt/0229-x86-kvm-require-const-tsc-for-rt.patch.patch b/debian/patches/features/all/rt/x86-kvm-require-const-tsc-for-rt.patch similarity index 54% rename from debian/patches/features/all/rt/0229-x86-kvm-require-const-tsc-for-rt.patch.patch rename to debian/patches/features/all/rt/x86-kvm-require-const-tsc-for-rt.patch index dcb980c6a..556c44279 100644 --- a/debian/patches/features/all/rt/0229-x86-kvm-require-const-tsc-for-rt.patch.patch +++ b/debian/patches/features/all/rt/x86-kvm-require-const-tsc-for-rt.patch @@ -1,18 +1,17 @@ -From e805ad7e1c2b49b0b817f7b2afa66c2a409c3f30 Mon Sep 17 00:00:00 2001 +Subject: x86-kvm-require-const-tsc-for-rt.patch From: Thomas Gleixner -Date: Sun, 6 Nov 2011 12:26:18 +0100 -Subject: [229/256] x86-kvm-require-const-tsc-for-rt.patch +Date: Sun, 06 Nov 2011 12:26:18 +0100 Signed-off-by: Thomas Gleixner --- arch/x86/kvm/x86.c | 7 +++++++ 1 file changed, 7 insertions(+) -diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index 185a2b8..937bdec 100644 ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -4882,6 +4882,13 @@ int kvm_arch_init(void *opaque) +Index: linux-stable/arch/x86/kvm/x86.c +=================================================================== +--- linux-stable.orig/arch/x86/kvm/x86.c ++++ linux-stable/arch/x86/kvm/x86.c +@@ -4911,6 +4911,13 @@ int kvm_arch_init(void *opaque) goto out; } diff --git a/debian/patches/features/all/rt/0201-x86-Convert-mce-timer-to-hrtimer.patch b/debian/patches/features/all/rt/x86-mce-timer-hrtimer.patch similarity index 51% rename from debian/patches/features/all/rt/0201-x86-Convert-mce-timer-to-hrtimer.patch rename to debian/patches/features/all/rt/x86-mce-timer-hrtimer.patch index 5b1821682..7541a6ff9 100644 --- a/debian/patches/features/all/rt/0201-x86-Convert-mce-timer-to-hrtimer.patch +++ b/debian/patches/features/all/rt/x86-mce-timer-hrtimer.patch @@ -1,22 +1,22 @@ -From 2c728e0eebc0bf674feaa43bc371ace1e030d2a0 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 13 Dec 2010 16:33:39 +0100 -Subject: [201/256] x86: Convert mce timer to hrtimer +Subject: x86: Convert mce timer to hrtimer mce_timer is started in atomic contexts of cpu bringup. This results in might_sleep() warnings on RT. Convert mce_timer to a hrtimer to avoid this. Signed-off-by: Thomas Gleixner ---- - arch/x86/kernel/cpu/mcheck/mce.c | 49 ++++++++++++++++++-------------------- - 1 file changed, 23 insertions(+), 26 deletions(-) -diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c -index 61604ae..473e40d 100644 ---- a/arch/x86/kernel/cpu/mcheck/mce.c -+++ b/arch/x86/kernel/cpu/mcheck/mce.c -@@ -38,6 +38,7 @@ +--- + arch/x86/kernel/cpu/mcheck/mce.c | 36 ++++++++++++++++-------------------- + 1 file changed, 16 insertions(+), 20 deletions(-) + +Index: linux-stable/arch/x86/kernel/cpu/mcheck/mce.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/mcheck/mce.c ++++ linux-stable/arch/x86/kernel/cpu/mcheck/mce.c +@@ -41,6 +41,7 @@ #include #include #include @@ -24,43 +24,32 @@ index 61604ae..473e40d 100644 #include #include -@@ -1245,17 +1246,14 @@ void mce_log_therm_throt_event(__u64 status) - * poller finds an MCE, poll 2x faster. When the poller finds no more - * errors, poll 2x slower (up to check_interval seconds). - */ --static int check_interval = 5 * 60; /* 5 minutes */ -+static unsigned long check_interval = 5 * 60; /* 5 minutes */ +@@ -1264,15 +1265,12 @@ void mce_log_therm_throt_event(__u64 sta + static unsigned long check_interval = 5 * 60; /* 5 minutes */ --static DEFINE_PER_CPU(int, mce_next_interval); /* in jiffies */ + static DEFINE_PER_CPU(unsigned long, mce_next_interval); /* in jiffies */ -static DEFINE_PER_CPU(struct timer_list, mce_timer); -+static DEFINE_PER_CPU(unsigned long, mce_next_interval); /* in jiffies */ +static DEFINE_PER_CPU(struct hrtimer, mce_timer); --static void mce_start_timer(unsigned long data) -+static enum hrtimer_restart mce_start_timer(struct hrtimer *timer) +-static void mce_timer_fn(unsigned long data) ++static enum hrtimer_restart mce_timer_fn(struct hrtimer *timer) { -- struct timer_list *t = &per_cpu(mce_timer, data); -- int *n; -- -- WARN_ON(smp_processor_id() != data); -+ unsigned long *n; +- struct timer_list *t = &__get_cpu_var(mce_timer); + unsigned long iv; +- WARN_ON(smp_processor_id() != data); +- if (mce_available(__this_cpu_ptr(&cpu_info))) { machine_check_poll(MCP_TIMESTAMP, -@@ -1268,21 +1266,22 @@ static void mce_start_timer(unsigned long data) - */ - n = &__get_cpu_var(mce_next_interval); - if (mce_notify_irq()) -- *n = max(*n/2, HZ/100); -+ *n = max(*n/2, HZ/100UL); - else -- *n = min(*n*2, (int)round_jiffies_relative(check_interval*HZ)); -+ *n = min(*n*2, round_jiffies_relative(check_interval*HZ)); + &__get_cpu_var(mce_poll_banks)); +@@ -1289,17 +1287,18 @@ static void mce_timer_fn(unsigned long d + iv = min(iv * 2, round_jiffies_relative(check_interval * HZ)); + __this_cpu_write(mce_next_interval, iv); -- t->expires = jiffies + *n; +- t->expires = jiffies + iv; - add_timer_on(t, smp_processor_id()); + hrtimer_forward(timer, timer->base->get_time(), -+ ns_to_ktime(jiffies_to_usecs(*n) * 1000)); ++ ns_to_ktime(jiffies_to_usecs(iv))); + return HRTIMER_RESTART; } @@ -76,34 +65,32 @@ index 61604ae..473e40d 100644 } static void mce_do_trigger(struct work_struct *work) -@@ -1512,10 +1511,11 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c) +@@ -1596,10 +1595,11 @@ static void __mcheck_cpu_init_vendor(str static void __mcheck_cpu_init_timer(void) { - struct timer_list *t = &__get_cpu_var(mce_timer); -- int *n = &__get_cpu_var(mce_next_interval); + struct hrtimer *t = &__get_cpu_var(mce_timer); -+ unsigned long *n = &__get_cpu_var(mce_next_interval); + unsigned long iv = check_interval * HZ; -- setup_timer(t, mce_start_timer, smp_processor_id()); +- setup_timer(t, mce_timer_fn, smp_processor_id()); + hrtimer_init(t, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ t->function = mce_start_timer; ++ t->function = mce_timer_fn; if (mce_ignore_ce) return; -@@ -1523,8 +1523,9 @@ static void __mcheck_cpu_init_timer(void) - *n = check_interval * HZ; - if (!*n) +@@ -1607,8 +1607,8 @@ static void __mcheck_cpu_init_timer(void + __this_cpu_write(mce_next_interval, iv); + if (!iv) return; -- t->expires = round_jiffies(jiffies + *n); +- t->expires = round_jiffies(jiffies + iv); - add_timer_on(t, smp_processor_id()); -+ -+ hrtimer_start_range_ns(t, ns_to_ktime(jiffies_to_usecs(*n) * 1000), -+ 0 , HRTIMER_MODE_REL_PINNED); ++ hrtimer_start_range_ns(t, ns_to_ktime(jiffies_to_usecs(iv) * 1000), ++ 0, HRTIMER_MODE_REL_PINNED); } /* Handle unconfigured int18 (should never happen) */ -@@ -2176,6 +2177,8 @@ static void __cpuinit mce_disable_cpu(void *h) +@@ -2259,6 +2259,8 @@ static void __cpuinit mce_disable_cpu(vo if (!mce_available(__this_cpu_ptr(&cpu_info))) return; @@ -112,7 +99,7 @@ index 61604ae..473e40d 100644 if (!(action & CPU_TASKS_FROZEN)) cmci_clear(); for (i = 0; i < banks; i++) { -@@ -2202,6 +2205,7 @@ static void __cpuinit mce_reenable_cpu(void *h) +@@ -2285,6 +2287,7 @@ static void __cpuinit mce_reenable_cpu(v if (b->init) wrmsrl(MSR_IA32_MCx_CTL(i), b->ctl); } @@ -120,7 +107,7 @@ index 61604ae..473e40d 100644 } /* Get notified when a cpu comes on/off. Be hotplug friendly. */ -@@ -2209,7 +2213,6 @@ static int __cpuinit +@@ -2292,7 +2295,6 @@ static int __cpuinit mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) { unsigned int cpu = (unsigned long)hcpu; @@ -128,7 +115,7 @@ index 61604ae..473e40d 100644 switch (action) { case CPU_ONLINE: -@@ -2226,16 +2229,10 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) +@@ -2309,16 +2311,10 @@ mce_cpu_callback(struct notifier_block * break; case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE_FROZEN: @@ -139,7 +126,7 @@ index 61604ae..473e40d 100644 case CPU_DOWN_FAILED_FROZEN: - if (!mce_ignore_ce && check_interval) { - t->expires = round_jiffies(jiffies + -- __get_cpu_var(mce_next_interval)); +- per_cpu(mce_next_interval, cpu)); - add_timer_on(t, cpu); - } smp_call_function_single(cpu, mce_reenable_cpu, &action, 1); diff --git a/debian/patches/features/all/rt/x86-perf-uncore-deal-with-kfree.patch b/debian/patches/features/all/rt/x86-perf-uncore-deal-with-kfree.patch new file mode 100644 index 000000000..85199845c --- /dev/null +++ b/debian/patches/features/all/rt/x86-perf-uncore-deal-with-kfree.patch @@ -0,0 +1,76 @@ +Subject: x86: perf: Deal with kfree from atomic contexts +From: Thomas Gleixner +Date: Thu, 04 Oct 2012 13:32:46 +0100 + +The x86 perf code allocates memory upfront because it might need +it. The detection that it is not needed happens in atomic context and +calls kfree from there. RT cant do that. Use kfree_rcu instead. + +Signed-off-by: Thomas Gleixner +--- + arch/x86/kernel/cpu/perf_event.h | 1 + + arch/x86/kernel/cpu/perf_event_intel.c | 2 +- + arch/x86/kernel/cpu/perf_event_intel_uncore.c | 5 +++-- + arch/x86/kernel/cpu/perf_event_intel_uncore.h | 1 + + 4 files changed, 6 insertions(+), 3 deletions(-) + +Index: linux-stable/arch/x86/kernel/cpu/perf_event.h +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/perf_event.h ++++ linux-stable/arch/x86/kernel/cpu/perf_event.h +@@ -108,6 +108,7 @@ struct intel_shared_regs { + struct er_account regs[EXTRA_REG_MAX]; + int refcnt; /* per-core: #HT threads */ + unsigned core_id; /* per-core: core id */ ++ struct rcu_head rcu; + }; + + #define MAX_LBR_ENTRIES 16 +Index: linux-stable/arch/x86/kernel/cpu/perf_event_intel.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/perf_event_intel.c ++++ linux-stable/arch/x86/kernel/cpu/perf_event_intel.c +@@ -1707,7 +1707,7 @@ static void intel_pmu_cpu_dying(int cpu) + pc = cpuc->shared_regs; + if (pc) { + if (pc->core_id == -1 || --pc->refcnt == 0) +- kfree(pc); ++ kfree_rcu(pc, rcu); + cpuc->shared_regs = NULL; + } + +Index: linux-stable/arch/x86/kernel/cpu/perf_event_intel_uncore.c +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/perf_event_intel_uncore.c ++++ linux-stable/arch/x86/kernel/cpu/perf_event_intel_uncore.c +@@ -2603,7 +2603,7 @@ static void __cpuinit uncore_cpu_dying(i + box = *per_cpu_ptr(pmu->box, cpu); + *per_cpu_ptr(pmu->box, cpu) = NULL; + if (box && atomic_dec_and_test(&box->refcnt)) +- kfree(box); ++ kfree_rcu(box, rcu); + } + } + } +@@ -2633,7 +2633,8 @@ static int __cpuinit uncore_cpu_starting + if (exist && exist->phys_id == phys_id) { + atomic_inc(&exist->refcnt); + *per_cpu_ptr(pmu->box, cpu) = exist; +- kfree(box); ++ if (box) ++ kfree_rcu(box, rcu); + box = NULL; + break; + } +Index: linux-stable/arch/x86/kernel/cpu/perf_event_intel_uncore.h +=================================================================== +--- linux-stable.orig/arch/x86/kernel/cpu/perf_event_intel_uncore.h ++++ linux-stable/arch/x86/kernel/cpu/perf_event_intel_uncore.h +@@ -419,6 +419,7 @@ struct intel_uncore_box { + struct hrtimer hrtimer; + struct list_head list; + struct intel_uncore_extra_reg shared_regs[0]; ++ struct rcu_head rcu; + }; + + #define UNCORE_BOX_FLAG_INITIATED 0 diff --git a/debian/patches/features/all/rt/0202-x86-stackprotector-Avoid-random-pool-on-rt.patch b/debian/patches/features/all/rt/x86-stackprot-no-random-on-rt.patch similarity index 78% rename from debian/patches/features/all/rt/0202-x86-stackprotector-Avoid-random-pool-on-rt.patch rename to debian/patches/features/all/rt/x86-stackprot-no-random-on-rt.patch index 0e7eb369f..8a2b17e73 100644 --- a/debian/patches/features/all/rt/0202-x86-stackprotector-Avoid-random-pool-on-rt.patch +++ b/debian/patches/features/all/rt/x86-stackprot-no-random-on-rt.patch @@ -1,7 +1,6 @@ -From 04705414e3888c7ec92de828510fd5d0731713fc Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 16 Dec 2010 14:25:18 +0100 -Subject: [202/256] x86: stackprotector: Avoid random pool on rt +Subject: x86: stackprotector: Avoid random pool on rt CPU bringup calls into the random pool to initialize the stack canary. During boot that works nicely even on RT as the might sleep @@ -13,14 +12,15 @@ entropy and we rely on the TSC randomnness. Reported-by: Carsten Emde Signed-off-by: Thomas Gleixner + --- arch/x86/include/asm/stackprotector.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) -diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h -index b5d9533..0f3d7b1 100644 ---- a/arch/x86/include/asm/stackprotector.h -+++ b/arch/x86/include/asm/stackprotector.h +Index: linux-stable/arch/x86/include/asm/stackprotector.h +=================================================================== +--- linux-stable.orig/arch/x86/include/asm/stackprotector.h ++++ linux-stable/arch/x86/include/asm/stackprotector.h @@ -57,7 +57,7 @@ */ static __always_inline void boot_init_stack_canary(void) @@ -30,7 +30,7 @@ index b5d9533..0f3d7b1 100644 u64 tsc; #ifdef CONFIG_X86_64 -@@ -68,8 +68,16 @@ static __always_inline void boot_init_stack_canary(void) +@@ -68,8 +68,16 @@ static __always_inline void boot_init_st * of randomness. The TSC only matters for very early init, * there it already has some randomness on most systems. Later * on during the bootup the random pool has true entropy too. diff --git a/debian/patches/features/all/rt/0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch b/debian/patches/features/all/rt/x86-use-gen-rwsem-spinlocks-rt.patch similarity index 61% rename from debian/patches/features/all/rt/0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch rename to debian/patches/features/all/rt/x86-use-gen-rwsem-spinlocks-rt.patch index a9971bfbb..d7dd32b55 100644 --- a/debian/patches/features/all/rt/0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch +++ b/debian/patches/features/all/rt/x86-use-gen-rwsem-spinlocks-rt.patch @@ -1,21 +1,21 @@ -From 828f2c41971123b04b3fea44459e0ff642b917f7 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 26 Jul 2009 02:21:32 +0200 -Subject: [203/256] x86: Use generic rwsem_spinlocks on -rt +Subject: x86: Use generic rwsem_spinlocks on -rt Simplifies the separation of anon_rw_semaphores and rw_semaphores for -rt. Signed-off-by: Thomas Gleixner + --- arch/x86/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index c9866b0..f556832 100644 ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -155,10 +155,10 @@ config ARCH_MAY_HAVE_PC_FDC +Index: linux-stable/arch/x86/Kconfig +=================================================================== +--- linux-stable.orig/arch/x86/Kconfig ++++ linux-stable/arch/x86/Kconfig +@@ -153,10 +153,10 @@ config ARCH_MAY_HAVE_PC_FDC def_bool ISA_DMA_API config RWSEM_GENERIC_SPINLOCK @@ -26,5 +26,5 @@ index c9866b0..f556832 100644 - def_bool X86_XADD + def_bool X86_XADD && !RWSEM_GENERIC_SPINLOCK && !PREEMPT_RT_FULL - config ARCH_HAS_CPU_IDLE_WAIT + config GENERIC_CALIBRATE_DELAY def_bool y diff --git a/debian/patches/series-rt b/debian/patches/series-rt index 5f75bf305..213dee834 100644 --- a/debian/patches/series-rt +++ b/debian/patches/series-rt @@ -1,252 +1,601 @@ -features/all/rt/0001-Revert-workqueue-skip-nr_running-sanity-check-in-wor.patch -features/all/rt/0002-slab-lockdep-Annotate-all-slab-caches.patch -features/all/rt/0003-x86-kprobes-Remove-remove-bogus-preempt_enable.patch -features/all/rt/0004-tick-Add-tick-skew-boot-option.patch -features/all/rt/0005-x86-hpet-Disable-MSI-on-Lenovo-W510.patch -features/all/rt/0006-block-Shorten-interrupt-disabled-regions.patch -features/all/rt/0007-sched-Distangle-worker-accounting-from-rq-3Elock.patch -features/all/rt/0008-mips-enable-interrupts-in-signal.patch.patch -features/all/rt/0009-arm-enable-interrupts-in-signal-code.patch.patch -features/all/rt/0010-seqlock-Remove-unused-functions.patch -features/all/rt/0011-seqlock-Use-seqcount.patch -features/all/rt/0012-timekeeping-Split-xtime_lock.patch -features/all/rt/0013-intel_idle-Convert-i7300_idle_lock-to-raw-spinlock.patch -features/all/rt/0014-tracing-Account-for-preempt-off-in-preempt_schedule.patch -features/all/rt/0015-signal-revert-ptrace-preempt-magic.patch.patch -features/all/rt/0016-arm-Mark-pmu-interupt-IRQF_NO_THREAD.patch -features/all/rt/0017-arm-Allow-forced-irq-threading.patch -features/all/rt/0018-preempt-rt-Convert-arm-boot_lock-to-raw.patch -features/all/rt/0019-arm-omap-make-wakeupgen_lock-raw.patch.patch -features/all/rt/0020-signals-Do-not-wakeup-self.patch -features/all/rt/0021-posix-timers-Prevent-broadcast-signals.patch -features/all/rt/0022-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch -features/all/rt/0023-signal-x86-Delay-calling-signals-in-atomic.patch -features/all/rt/0024-generic-Use-raw-local-irq-variant-for-generic-cmpxch.patch -features/all/rt/0025-drivers-random-Reduce-preempt-disabled-region.patch -features/all/rt/0026-ARM-AT91-PIT-Remove-irq-handler-when-clock-event-is-.patch -features/all/rt/0027-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch -features/all/rt/0028-drivers-net-tulip_remove_one-needs-to-call-pci_disab.patch -features/all/rt/0029-drivers-net-Use-disable_irq_nosync-in-8139too.patch -features/all/rt/0030-drivers-net-ehea-Make-rx-irq-handler-non-threaded-IR.patch -features/all/rt/0031-drivers-net-at91_ether-Make-mdio-protection-rt-safe.patch -features/all/rt/0032-mm-Prepare-decoupling-the-page-fault-disabling-logic.patch -features/all/rt/0033-mm-Fixup-all-fault-handlers-to-check-current-pagefau.patch -features/all/rt/0034-mm-pagefault_disabled.patch -features/all/rt/0035-mm-raw_pagefault_disable.patch -features/all/rt/0036-filemap-fix-up.patch.patch -features/all/rt/0037-mm-Remove-preempt-count-from-pagefault-disable-enabl.patch -features/all/rt/0038-x86-highmem-Replace-BUG_ON-by-WARN_ON.patch -features/all/rt/0039-suspend-Prevent-might-sleep-splats.patch -features/all/rt/0040-OF-Fixup-resursive-locking-code-paths.patch -features/all/rt/0041-of-convert-devtree-lock.patch.patch -features/all/rt/0042-list-add-list-last-entry.patch.patch -features/all/rt/0043-mm-page-alloc-use-list-last-entry.patch.patch -features/all/rt/0044-mm-slab-move-debug-out.patch.patch -features/all/rt/0045-rwsem-inlcude-fix.patch.patch -features/all/rt/0046-sysctl-include-fix.patch.patch -features/all/rt/0047-net-flip-lock-dep-thingy.patch.patch -features/all/rt/0048-softirq-thread-do-softirq.patch.patch -features/all/rt/0049-softirq-split-out-code.patch.patch -features/all/rt/0050-x86-Do-not-unmask-io_apic-when-interrupt-is-in-progr.patch -features/all/rt/0051-x86-Do-not-disable-preemption-in-int3-on-32bit.patch -features/all/rt/0052-locking-various-init-fixes.patch.patch -features/all/rt/0053-pci-Use-__wake_up_all_locked-pci_unblock_user_cfg_ac.patch -features/all/rt/0054-latency-hist.patch.patch -features/all/rt/0055-hwlatdetect.patch.patch -features/all/rt/0057-early-printk-consolidate.patch.patch -features/all/rt/0058-printk-kill.patch.patch -features/all/rt/0059-printk-force_early_printk-boot-param-to-help-with-de.patch -features/all/rt/0060-rt-preempt-base-config.patch.patch -features/all/rt/0061-bug-BUG_ON-WARN_ON-variants-dependend-on-RT-RT.patch -features/all/rt/0062-rt-local_irq_-variants-depending-on-RT-RT.patch -features/all/rt/0063-preempt-Provide-preempt_-_-no-rt-variants.patch -features/all/rt/0064-ata-Do-not-disable-interrupts-in-ide-code-for-preemp.patch -features/all/rt/0065-ide-Do-not-disable-interrupts-for-PREEMPT-RT.patch -features/all/rt/0066-infiniband-Mellanox-IB-driver-patch-use-_nort-primit.patch -features/all/rt/0067-input-gameport-Do-not-disable-interrupts-on-PREEMPT_.patch -features/all/rt/0068-acpi-Do-not-disable-interrupts-on-PREEMPT_RT.patch -features/all/rt/0069-core-Do-not-disable-interrupts-on-RT-in-kernel-users.patch -features/all/rt/0070-core-Do-not-disable-interrupts-on-RT-in-res_counter..patch -features/all/rt/0071-usb-Use-local_irq_-_nort-variants.patch -features/all/rt/0072-tty-Do-not-disable-interrupts-in-put_ldisc-on-rt.patch -features/all/rt/0073-mm-scatterlist-dont-disable-irqs-on-RT.patch -features/all/rt/0074-signal-fix-up-rcu-wreckage.patch.patch -features/all/rt/0075-net-wireless-warn-nort.patch.patch -features/all/rt/0076-mm-Replace-cgroup_page-bit-spinlock.patch -features/all/rt/0077-buffer_head-Replace-bh_uptodate_lock-for-rt.patch -features/all/rt/0078-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch -features/all/rt/0079-genirq-Disable-DEBUG_SHIRQ-for-rt.patch -features/all/rt/0080-genirq-Disable-random-call-on-preempt-rt.patch -features/all/rt/0081-genirq-disable-irqpoll-on-rt.patch -features/all/rt/0082-genirq-force-threading.patch.patch -features/all/rt/0083-drivers-net-fix-livelock-issues.patch -features/all/rt/0084-drivers-net-vortex-fix-locking-issues.patch -features/all/rt/0085-drivers-net-gianfar-Make-RT-aware.patch -features/all/rt/0086-USB-Fix-the-mouse-problem-when-copying-large-amounts.patch -features/all/rt/0087-local-var.patch.patch -features/all/rt/0088-rt-local-irq-lock.patch.patch -features/all/rt/0089-cpu-rt-variants.patch.patch -features/all/rt/0090-mm-slab-wrap-functions.patch.patch -features/all/rt/0091-slab-Fix-__do_drain-to-use-the-right-array-cache.patch -features/all/rt/0092-mm-More-lock-breaks-in-slab.c.patch -features/all/rt/0093-mm-page_alloc-rt-friendly-per-cpu-pages.patch -features/all/rt/0094-mm-page_alloc-reduce-lock-sections-further.patch -features/all/rt/0095-mm-page-alloc-fix.patch.patch -features/all/rt/0096-mm-convert-swap-to-percpu-locked.patch -features/all/rt/0097-mm-make-vmstat-rt-aware.patch -features/all/rt/0098-mm-shrink-the-page-frame-to-rt-size.patch -features/all/rt/0099-ARM-Initialize-ptl-lock-for-vector-page.patch -features/all/rt/0100-mm-Allow-only-slab-on-RT.patch -features/all/rt/0101-radix-tree-rt-aware.patch.patch -features/all/rt/0102-panic-disable-random-on-rt.patch -features/all/rt/0103-ipc-Make-the-ipc-code-rt-aware.patch -features/all/rt/0104-ipc-mqueue-Add-a-critical-section-to-avoid-a-deadloc.patch -features/all/rt/0105-relay-fix-timer-madness.patch -features/all/rt/0106-net-ipv4-route-use-locks-on-up-rt.patch.patch -features/all/rt/0107-workqueue-avoid-the-lock-in-cpu-dying.patch.patch -features/all/rt/0108-timers-prepare-for-full-preemption.patch -features/all/rt/0109-timers-preempt-rt-support.patch -features/all/rt/0110-timers-fix-timer-hotplug-on-rt.patch -features/all/rt/0111-timers-mov-printk_tick-to-soft-interrupt.patch -features/all/rt/0112-timer-delay-waking-softirqs-from-the-jiffy-tick.patch -features/all/rt/0113-timers-Avoid-the-switch-timers-base-set-to-NULL-tric.patch -features/all/rt/0114-printk-Don-t-call-printk_tick-in-printk_needs_cpu-on.patch -features/all/rt/0115-hrtimers-prepare-full-preemption.patch -features/all/rt/0116-hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch -features/all/rt/0117-hrtimer-Don-t-call-the-timer-handler-from-hrtimer_st.patch -features/all/rt/0118-hrtimer-Add-missing-debug_activate-aid-Was-Re-ANNOUN.patch -features/all/rt/0119-hrtimer-fix-reprogram-madness.patch.patch -features/all/rt/0120-timer-fd-Prevent-live-lock.patch -features/all/rt/0121-posix-timers-thread-posix-cpu-timers-on-rt.patch -features/all/rt/0122-posix-timers-Shorten-posix_cpu_timers-CPU-kernel-thr.patch -features/all/rt/0123-posix-timers-Avoid-wakeups-when-no-timers-are-active.patch -features/all/rt/0124-sched-delay-put-task.patch.patch -features/all/rt/0125-sched-limit-nr-migrate.patch.patch -features/all/rt/0126-sched-mmdrop-delayed.patch.patch -features/all/rt/0127-sched-rt-mutex-wakeup.patch.patch -features/all/rt/0128-sched-might-sleep-do-not-account-rcu-depth.patch.patch -features/all/rt/0129-sched-cond-resched.patch.patch -features/all/rt/0130-cond-resched-softirq-fix.patch.patch -features/all/rt/0131-cond-resched-lock-rt-tweak.patch.patch -features/all/rt/0132-sched-disable-ttwu-queue.patch.patch -features/all/rt/0133-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch -features/all/rt/0134-sched-ttwu-Return-success-when-only-changing-the-sav.patch -features/all/rt/0135-stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch -features/all/rt/0136-stomp-machine-mark-stomper-thread.patch.patch -features/all/rt/0137-stomp-machine-raw-lock.patch.patch -features/all/rt/0138-hotplug-Lightweight-get-online-cpus.patch -features/all/rt/0139-hotplug-sync_unplug-No.patch -features/all/rt/0140-hotplug-Reread-hotplug_pcp-on-pin_current_cpu-retry.patch -features/all/rt/0141-sched-migrate-disable.patch.patch -features/all/rt/0142-hotplug-use-migrate-disable.patch.patch -features/all/rt/0143-hotplug-Call-cpu_unplug_begin-before-DOWN_PREPARE.patch -features/all/rt/0144-ftrace-migrate-disable-tracing.patch.patch -features/all/rt/0145-tracing-Show-padding-as-unsigned-short.patch -features/all/rt/0146-migrate-disable-rt-variant.patch.patch -features/all/rt/0147-sched-Optimize-migrate_disable.patch -features/all/rt/0148-sched-Generic-migrate_disable.patch -features/all/rt/0149-sched-rt-Fix-migrate_enable-thinko.patch -features/all/rt/0150-sched-teach-migrate_disable-about-atomic-contexts.patch -features/all/rt/0151-sched-Postpone-actual-migration-disalbe-to-schedule.patch -features/all/rt/0152-sched-Do-not-compare-cpu-masks-in-scheduler.patch -features/all/rt/0153-sched-Have-migrate_disable-ignore-bounded-threads.patch -features/all/rt/0154-sched-clear-pf-thread-bound-on-fallback-rq.patch.patch -features/all/rt/0155-ftrace-crap.patch.patch -features/all/rt/0156-ring-buffer-Convert-reader_lock-from-raw_spin_lock-i.patch -features/all/rt/0157-net-netif_rx_ni-migrate-disable.patch.patch -features/all/rt/0158-softirq-Sanitize-softirq-pending-for-NOHZ-RT.patch -features/all/rt/0159-lockdep-rt.patch.patch -features/all/rt/0160-mutex-no-spin-on-rt.patch.patch -features/all/rt/0161-softirq-local-lock.patch.patch -features/all/rt/0162-softirq-Export-in_serving_softirq.patch -features/all/rt/0163-hardirq.h-Define-softirq_count-as-OUL-to-kill-build-.patch -features/all/rt/0164-softirq-Fix-unplug-deadlock.patch -features/all/rt/0165-softirq-disable-softirq-stacks-for-rt.patch.patch -features/all/rt/0166-softirq-make-fifo.patch.patch -features/all/rt/0167-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch -features/all/rt/0168-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch -features/all/rt/0169-local-vars-migrate-disable.patch.patch -features/all/rt/0170-md-raid5-Make-raid5_percpu-handling-RT-aware.patch -features/all/rt/0171-rtmutex-lock-killable.patch.patch -features/all/rt/0172-rtmutex-futex-prepare-rt.patch.patch -features/all/rt/0173-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch -features/all/rt/0174-rt-mutex-add-sleeping-spinlocks-support.patch.patch -features/all/rt/0175-spinlock-types-separate-raw.patch.patch -features/all/rt/0176-rtmutex-avoid-include-hell.patch.patch -features/all/rt/0177-rt-add-rt-spinlocks.patch.patch -features/all/rt/0178-rt-add-rt-to-mutex-headers.patch.patch -features/all/rt/0179-rwsem-add-rt-variant.patch.patch -features/all/rt/0180-rt-Add-the-preempt-rt-lock-replacement-APIs.patch -features/all/rt/0181-rwlocks-Fix-section-mismatch.patch -features/all/rt/0182-timer-handle-idle-trylock-in-get-next-timer-irq.patc.patch -features/all/rt/0183-RCU-Force-PREEMPT_RCU-for-PREEMPT-RT.patch -features/all/rt/0184-rcu-Frob-softirq-test.patch -features/all/rt/0185-rcu-Merge-RCU-bh-into-RCU-preempt.patch -features/all/rt/0186-rcu-Fix-macro-substitution-for-synchronize_rcu_bh-on.patch -features/all/rt/0187-rcu-more-fallout.patch.patch -features/all/rt/0188-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch -features/all/rt/0189-rcu-Fix-build-break.patch -features/all/rt/0190-rt-rcutree-Move-misplaced-prototype.patch -features/all/rt/0191-lglocks-rt.patch.patch -features/all/rt/0192-serial-8250-Clean-up-the-locking-for-rt.patch -features/all/rt/0193-serial-8250-Call-flush_to_ldisc-when-the-irq-is-thre.patch -features/all/rt/0194-drivers-tty-fix-omap-lock-crap.patch.patch -features/all/rt/0195-rt-Improve-the-serial-console-PASS_LIMIT.patch -features/all/rt/0196-fs-namespace-preemption-fix.patch -features/all/rt/0197-mm-protect-activate-switch-mm.patch.patch -features/all/rt/0198-mm-Protect-activate_mm-by-preempt_-disable-7Cenable-.patch -features/all/rt/0199-fs-block-rt-support.patch.patch -features/all/rt/0200-fs-ntfs-disable-interrupt-only-on-RT.patch -features/all/rt/0201-x86-Convert-mce-timer-to-hrtimer.patch -features/all/rt/0202-x86-stackprotector-Avoid-random-pool-on-rt.patch -features/all/rt/0203-x86-Use-generic-rwsem_spinlocks-on-rt.patch -features/all/rt/0204-x86-Disable-IST-stacks-for-debug-int-3-stack-fault-f.patch -features/all/rt/0205-workqueue-use-get-cpu-light.patch.patch -features/all/rt/0206-epoll.patch.patch -features/all/rt/0207-mm-vmalloc.patch.patch -features/all/rt/0208-workqueue-Fix-cpuhotplug-trainwreck.patch -features/all/rt/0209-workqueue-Fix-PF_THREAD_BOUND-abuse.patch -features/all/rt/0210-workqueue-Use-get_cpu_light-in-flush_gcwq.patch -features/all/rt/0211-hotplug-stuff.patch.patch -features/all/rt/0212-debugobjects-rt.patch.patch -features/all/rt/0213-jump-label-rt.patch.patch -features/all/rt/0214-skbufhead-raw-lock.patch.patch -features/all/rt/0215-x86-no-perf-irq-work-rt.patch.patch -features/all/rt/0216-console-make-rt-friendly.patch.patch -features/all/rt/0217-fix-printk-flush-of-messages.patch -features/all/rt/0218-power-use-generic-rwsem-on-rt.patch -features/all/rt/0219-power-disable-highmem-on-rt.patch.patch -features/all/rt/0220-arm-disable-highmem-on-rt.patch.patch -features/all/rt/0221-ARM-at91-tclib-Default-to-tclib-timer-for-RT.patch -features/all/rt/0222-mips-disable-highmem-on-rt.patch.patch -features/all/rt/0223-net-Avoid-livelock-in-net_tx_action-on-RT.patch -features/all/rt/0224-ping-sysrq.patch.patch -features/all/rt/0225-kgdb-serial-Short-term-workaround.patch -features/all/rt/0226-add-sys-kernel-realtime-entry.patch -features/all/rt/0227-mm-rt-kmap_atomic-scheduling.patch -features/all/rt/0228-ipc-sem-Rework-semaphore-wakeups.patch -features/all/rt/0229-x86-kvm-require-const-tsc-for-rt.patch.patch -features/all/rt/0230-scsi-fcoe-rt-aware.patch.patch -features/all/rt/0231-x86-crypto-Reduce-preempt-disabled-regions.patch -features/all/rt/0232-dm-Make-rt-aware.patch -features/all/rt/0233-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch -features/all/rt/0234-seqlock-Prevent-rt-starvation.patch -features/all/rt/0235-timer-Fix-hotplug-for-rt.patch -features/all/rt/0236-futex-rt-Fix-possible-lockup-when-taking-pi_lock-in-.patch -features/all/rt/0237-ring-buffer-rt-Check-for-irqs-disabled-before-grabbi.patch -features/all/rt/0238-sched-rt-Fix-wait_task_interactive-to-test-rt_spin_l.patch -features/all/rt/0239-lglock-rt-Use-non-rt-for_each_cpu-in-rt-code.patch -features/all/rt/0240-cpu-Make-hotplug.lock-a-sleeping-spinlock-on-RT.patch -features/all/rt/0241-softirq-Check-preemption-after-reenabling-interrupts.patch -features/all/rt/0242-scsi-qla2xxx-Use-local_irq_save_nort-in-qla2x00_poll.patch -features/all/rt/0243-net-RT-REmove-preemption-disabling-in-netif_rx.patch -features/all/rt/0244-rt-Introduce-cpu_chill.patch -features/all/rt/0245-fs-dcache-Use-cpu_chill-in-trylock-loops.patch -features/all/rt/0246-net-Use-cpu_chill-instead-of-cpu_relax.patch -features/all/rt/0247-ntp-Make-ntp_lock-raw.patch -features/all/rt/0248-mips-remove-smp-reserve-lock.patch.patch -features/all/rt/0249-lockdep-Selftest-convert-spinlock-to-raw-spinlock.patch -features/all/rt/0250-lockdep-Selftest-Only-do-hardirq-context-test-for-ra.patch -features/all/rt/0251-genirq-Add-default-affinity-mask-command-line-option.patch -features/all/rt/0252-kconfig-disable-a-few-options-rt.patch.patch -features/all/rt/0253-kconfig-preempt-rt-full.patch.patch +########################################################### +# DELTA against a known Linus release +########################################################### + +############################################################ +# UPSTREAM changes queued +############################################################ + +############################################################ +# UPSTREAM FIXES, patches pending +############################################################ + +############################################################ +# Stuff broken upstream, patches submitted +############################################################ +features/all/rt/x86-kprobes-remove-bogus-preempt-enable.patch + +############################################################ +# Stuff which needs addressing upstream, but requires more +# information +############################################################ +features/all/rt/x86-hpet-disable-msi-on-lenovo-w510.patch + +############################################################ +# Stuff broken upstream, need to be sent +############################################################ + +############################################################ +# Submitted on LKML +############################################################ +# SCHED BLOCK/WQ +features/all/rt/block-shorten-interrupt-disabled-regions.patch + +# CHECKME sched-distangle-worker-accounting-from-rq-3elock.patch + +############################################################ +# Submitted to mips ML +############################################################ +features/all/rt/mips-enable-interrupts-in-signal.patch + +############################################################ +# Submitted to ARM ML +############################################################ + +############################################################ +# Submitted on LKML +############################################################ + +# JBD + +# SCHED + +############################################################ +# Submitted on ppc-devel +############################################################ + +############################################################ +# Submitted to net-dev +############################################################ + +############################################################ +# Pending in tip +############################################################ + +# WATCHDOG + +# CLOCKSOURCE + +# RTMUTEX CLEANUP + +# RAW SPINLOCKS + +# X86 + +############################################################ +# Pending in peterz's scheduler queue +############################################################ + + +############################################################ +# Stuff which should go upstream ASAP +############################################################ + +# GENIRQ +features/all/rt/genirq-add-default-mask-cmdline-option.patch + +# PPC +features/all/rt/ppc-mark-low-level-handlers-no-thread.patch + +# Timekeeping / VDSO + +# SEQLOCK +features/all/rt/seqlock-remove-unused-functions.patch +features/all/rt/seqlock-use-seqcount.patch + +# RAW SPINLOCKS +features/all/rt/timekeeping-split-xtime-lock.patch +features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch +features/all/rt/ntp-make-ntp-lock-raw-sigh.patch + +# MM memcg + +# Tracing +features/all/rt/tracing-account-for-preempt-off-in-preempt_schedule.patch + +# PTRACE/SIGNAL crap +features/all/rt/signal-revert-ptrace-preempt-magic.patch + +# ARM IRQF_NO_TRHEAD / IRQ THREADING SUPPORT +features/all/rt/arm-mark-pmu-interupt-no-thread.patch +features/all/rt/arm-allow-irq-threading.patch +features/all/rt/arm-convert-boot-lock-to-raw.patch +features/all/rt/arm-omap-make-wakeupgen_lock-raw.patch + +# PREEMPT_ENABLE_NO_RESCHED + +# SIGNALS / POSIXTIMERS +features/all/rt/signals-do-not-wake-self.patch +features/all/rt/posix-timers-no-broadcast.patch +features/all/rt/signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch +features/all/rt/oleg-signal-rt-fix.patch + +# SCHED + +# GENERIC CMPXCHG +features/all/rt/generic-cmpxchg-use-raw-local-irq.patch + +# SHORTEN PREEMPT DISABLED +features/all/rt/drivers-random-reduce-preempt-disabled-region.patch + +# CLOCKSOURCE +features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch +features/all/rt/clocksource-tclib-allow-higher-clockrates.patch + +# HW LATENCY DETECTOR - this really wants a rewrite +#hw-latency-detector.patch + +# DRIVERS NET +features/all/rt/drivers-net-tulip-add-missing-pci-disable.patch +features/all/rt/drivers-net-8139-disable-irq-nosync.patch +features/all/rt/drivers-net-ehea-mark-rx-irq-no-thread.patch +features/all/rt/drivers-net-at91-make-mdio-protection-rt-safe.patch + +# PREEMPT + +# PAGEFAULT DISABLE +features/all/rt/mm-prepare-pf-disable-discoupling.patch +features/all/rt/arch-use-pagefault-disabled.patch +features/all/rt/peter_zijlstra-frob-pagefault_disable.patch +features/all/rt/peterz-raw_pagefault_disable.patch +# highmem-explicitly-disable-preemption.patch -- peterz +features/all/rt/filemap-fix-up.patch +features/all/rt/mm-remove-preempt-count-from-pf.patch + +# HIGHMEM +features/all/rt/x86-highmem-warn.patch + +# PM +features/all/rt/suspend-prevernt-might-sleep-splats.patch + +# DEVICE TREE +features/all/rt/of-fixup-recursive-locking.patch +features/all/rt/of-convert-devtree-lock.patch + +# MM/LISTS +features/all/rt/list-add-list-last-entry.patch +features/all/rt/mm-page-alloc-use-list-last-entry.patch +features/all/rt/mm-slab-move-debug-out.patch + +# INCLUDE MESS +features/all/rt/pid-h-include-atomic-h.patch +features/all/rt/sysctl-include-atomic-h.patch + +# NETWORKING +features/all/rt/net-flip-lock-dep-thingy.patch + +# SOFTIRQ +features/all/rt/softirq-thread-do-softirq.patch +features/all/rt/softirq-split-out-code.patch + +# X86 +features/all/rt/x86-io-apic-migra-no-unmask.patch +features/all/rt/fix-rt-int3-x86_32-3.2-rt.patch + +# RCU + +# LOCKING INIT FIXES +features/all/rt/locking-various-init-fixes.patch + +# PCI +features/all/rt/pci-access-use-__wake_up_all_locked.patch + +##################################################### +# Stuff which should go mainline, but wants some care +##################################################### + +# SEQLOCK + +# ANON RW SEMAPHORES + +# TRACING +features/all/rt/latency-hist.patch + +# HW latency detector +features/all/rt/hwlatdetect.patch + +################################################## +# REAL RT STUFF starts here +################################################## + +# Add RT to version +#localversion.patch + +# PRINTK +features/all/rt/early-printk-consolidate.patch +features/all/rt/printk-kill.patch +features/all/rt/printk-27force_early_printk-27-boot-param-to-help-with-debugging.patch + +# BASE RT CONFIG +features/all/rt/rt-preempt-base-config.patch + +# WARN/BUG_ON_RT +features/all/rt/bug-rt-dependend-variants.patch + +# LOCAL_IRQ_RT/NON_RT +features/all/rt/local-irq-rt-depending-variants.patch + +# PREEMPT NORT +features/all/rt/preempt-nort-rt-variants.patch + +# ANNOTATE local_irq_disable sites +features/all/rt/ata-disable-interrupts-if-non-rt.patch +features/all/rt/ide-use-nort-local-irq-variants.patch +features/all/rt/infiniband-mellanox-ib-use-nort-irq.patch +features/all/rt/inpt-gameport-use-local-irq-nort.patch +features/all/rt/acpi-use-local-irq-nort.patch +features/all/rt/user-use-local-irq-nort.patch +features/all/rt/resource-counters-use-localirq-nort.patch +features/all/rt/usb-hcd-use-local-irq-nort.patch +features/all/rt/tty-use-local-irq-nort.patch +features/all/rt/mm-scatterlist-dont-disable-irqs-on-RT.patch + +# Sigh +features/all/rt/signal-fix-up-rcu-wreckage.patch + +# ANNOTATE BUG/WARNON +features/all/rt/net-wireless-warn-nort.patch + +# BIT SPINLOCKS - SIGH +features/all/rt/mm-cgroup-page-bit-spinlock.patch +features/all/rt/fs-replace-bh_uptodate_lock-for-rt.patch +features/all/rt/fs-jbd-replace-bh_state-lock.patch + +# GENIRQ +features/all/rt/genirq-nodebug-shirq.patch +features/all/rt/genirq-disable-irqpoll-on-rt.patch +features/all/rt/genirq-force-threading.patch + +# DRIVERS NET +features/all/rt/drivers-net-fix-livelock-issues.patch +features/all/rt/drivers-net-vortex-fix-locking-issues.patch +features/all/rt/drivers-net-gianfar-make-rt-aware.patch + +# DRIVERS USB +# Revisit. Looks weird +#usb-rt-support.patch +features/all/rt/usb-fix-mouse-problem-copying-large-data.patch + +# LOCAL_IRQ_LOCKS +features/all/rt/local-var.patch +features/all/rt/rt-local-irq-lock.patch +features/all/rt/cpu-rt-variants.patch + +# MM SLAB +features/all/rt/mm-slab-wrap-functions.patch +features/all/rt/mm-slab-more-lock-breaks.patch + +# MM PAGE_ALLOC +features/all/rt/mm-page_alloc-rt-friendly-per-cpu-pages.patch +features/all/rt/mm-page_alloc-reduce-lock-sections-further.patch +features/all/rt/mm-page-alloc-fix.patch + +# MM SWAP +features/all/rt/mm-convert-swap-to-percpu-locked.patch + +# MM vmstat +features/all/rt/mm-make-vmstat-rt-aware.patch + +# MM memory +#mm-memory-rt.patch - ZAP... is unused +features/all/rt/mm-shrink-the-page-frame-to-rt-size.patch +features/all/rt/re-preempt_rt_full-arm-coredump-fails-for-cpu-3e-3d-4.patch + +# MM SLAB only +features/all/rt/mm-allow-slab-rt.patch + +# Revisit for avr/frv/ia64/mn10300/sh/sparc ... +#mm-quicklists-percpu-locked.patch + +# RADIX TREE +features/all/rt/radix-tree-rt-aware.patch + +# PANIC +features/all/rt/panic-disable-random-on-rt.patch + +# IPC +features/all/rt/ipc-make-rt-aware.patch +features/all/rt/ipc-mqueue-add-a-critical-section-to-avoid-a-deadlock.patch + +# RELAY +features/all/rt/relay-fix-timer-madness.patch + +# NETWORKING + +# WORKQUEUE SIGH + +# TIMERS +features/all/rt/timers-prepare-for-full-preemption.patch +features/all/rt/timers-preempt-rt-support.patch +features/all/rt/timers-mov-printk_tick-to-soft-interrupt.patch +features/all/rt/timer-delay-waking-softirqs-from-the-jiffy-tick.patch +features/all/rt/timers-avoid-the-base-null-otptimization-on-rt.patch + +# More PRINTK +features/all/rt/rfc-printk-don-27t-call-printk_tick-in-printk_needs_cpu.patch + +# HRTIMERS +features/all/rt/hrtimers-prepare-full-preemption.patch +features/all/rt/hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch +features/all/rt/peter_zijlstra-frob-hrtimer.patch +features/all/rt/hrtimer-add-missing-debug_activate-aid.patch +features/all/rt/hrtimer-fix-reprogram-madness.patch +features/all/rt/timer-fd-avoid-live-lock.patch + +# POSIX-CPU-TIMERS +features/all/rt/posix-timers-thread-posix-cpu-timers-on-rt.patch +features/all/rt/posix-timers-shorten-cpu-timers-thread.patch +features/all/rt/posix-timers-avoid-wakeups-when-no-timers-are-active.patch + +# SCHEDULER +features/all/rt/sched-delay-put-task.patch +features/all/rt/sched-limit-nr-migrate.patch +features/all/rt/sched-mmdrop-delayed.patch +features/all/rt/sched-rt-mutex-wakeup.patch +features/all/rt/sched-might-sleep-do-not-account-rcu-depth.patch +# CHECKME sched-load-balance-break-on-rq-contention.patch +features/all/rt/sched-cond-resched.patch +features/all/rt/cond-resched-softirq-rt.patch +features/all/rt/cond-resched-lock-rt-tweak.patch +features/all/rt/sched-disable-ttwu-queue.patch +features/all/rt/sched-disable-rt-group-sched-on-rt.patch +features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch + +# STOP MACHINE +features/all/rt/stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch +features/all/rt/stomp-machine-mark-stomper-thread.patch +features/all/rt/stomp-machine-raw-lock.patch + +# MIGRATE DISABLE AND PER CPU +features/all/rt/hotplug-light-get-online-cpus.patch +features/all/rt/hotplug-sync_unplug-no-27-5cn-27-in-task-name.patch +features/all/rt/re-migrate_disable-race-with-cpu-hotplug-3f.patch +features/all/rt/sched-migrate-disable.patch +features/all/rt/hotplug-use-migrate-disable.patch +features/all/rt/hotplug-call-cpu_unplug_begin-a-little-early.patch + +features/all/rt/ftrace-migrate-disable-tracing.patch +features/all/rt/rt-tracing-show-padding-as-unsigned-short.patch + +features/all/rt/migrate-disable-rt-variant.patch +features/all/rt/peter_zijlstra-frob-migrate_disable.patch +features/all/rt/peter_zijlstra-frob-migrate_disable-2.patch +features/all/rt/sched-rt-fix-migrate_enable-thinko.patch +features/all/rt/sched-teach-migrate_disable-about-atomic-contexts.patch +features/all/rt/rt-sched-postpone-actual-migration-disalbe-to-schedule.patch +features/all/rt/rt-sched-do-not-compare-cpu-masks-in-scheduler.patch +features/all/rt/rt-sched-have-migrate_disable-ignore-bounded-threads.patch +features/all/rt/sched-clear-pf-thread-bound-on-fallback-rq.patch + +# FTRACE +features/all/rt/ftrace-crap.patch +# CHECKME rt-ring-buffer-convert-reader_lock-from-raw_spin_lock-into-spin_lock.patch +# CHECKME rfc-ring-buffer-rt-check-for-irqs-disabled-before-grabbing-reader-lock.patch + +# NETWORKING +features/all/rt/net-netif_rx_ni-migrate-disable.patch + +# NOHZ +features/all/rt/softirq-sanitize-softirq-pending.patch + +# LOCKDEP +features/all/rt/lockdep-no-softirq-accounting-on-rt.patch + +# SOFTIRQ local lock +features/all/rt/mutex-no-spin-on-rt.patch +features/all/rt/softirq-local-lock.patch +features/all/rt/softirq-export-in-serving-softirq.patch +features/all/rt/harirq-h-define-softirq_count-as-oul-to-kill-build-warning.patch +features/all/rt/softirq-fix-unplug-deadlock.patch +features/all/rt/softirq-disable-softirq-stacks-for-rt.patch +features/all/rt/softirq-make-fifo.patch +features/all/rt/tasklet-rt-prevent-tasklets-from-going-into-infinite-spin-in-rt.patch +features/all/rt/irq-allow-disabling-of-softirq-processing-in-irq-thread-context.patch + +# LOCAL VARS and GETCPU STUFF +features/all/rt/local-vars-migrate-disable.patch + +# RAID5 +features/all/rt/md-raid5-percpu-handling-rt-aware.patch + +# RTMUTEX +features/all/rt/rtmutex-lock-killable.patch + +# FUTEX/RTMUTEX +features/all/rt/rtmutex-futex-prepare-rt.patch +features/all/rt/futex-requeue-pi-fix.patch + +# RTMUTEX +features/all/rt/rt-mutex-add-sleeping-spinlocks-support.patch +features/all/rt/spinlock-types-separate-raw.patch +features/all/rt/rtmutex-avoid-include-hell.patch +features/all/rt/rt-add-rt-spinlock-to-headers.patch +features/all/rt/rt-add-rt-to-mutex-headers.patch +features/all/rt/rwsem-add-rt-variant.patch +features/all/rt/rt-add-rt-locks.patch + +# RTMUTEX Fallout +features/all/rt/tasklist-lock-fix-section-conflict.patch + +# NOHZ/RTMUTEX +features/all/rt/timer-handle-idle-trylock-in-get-next-timer-irq.patch +features/all/rt/timer.c-fix-build-fail-for-RT_FULL.patch + +# RCU +features/all/rt/rcu-force-preempt-rcu-for-rt.patch +features/all/rt/peter_zijlstra-frob-rcu.patch +features/all/rt/rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch +features/all/rt/rcu-tiny-merge-bh.patch +features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch +features/all/rt/rcu-fix-build-break.patch +features/all/rt/rt-rcutree-warn-fix.patch + +# LGLOCKS - lovely +features/all/rt/lglocks-rt.patch + +# DRIVERS SERIAL +features/all/rt/drivers-serial-cleanup-locking-for-rt.patch +features/all/rt/drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch +features/all/rt/drivers-tty-fix-omap-lock-crap.patch +features/all/rt/rt-serial-warn-fix.patch + +# FS +features/all/rt/fs-namespace-preemption-fix.patch +features/all/rt/mm-protect-activate-switch-mm.patch +features/all/rt/mm-protect-activate_mm-by-preempt_-disable-7cenable-_rt.patch +features/all/rt/fs-block-rt-support.patch +features/all/rt/fs-ntfs-disable-interrupt-non-rt.patch + +# X86 +features/all/rt/x86-mce-timer-hrtimer.patch +features/all/rt/x86-stackprot-no-random-on-rt.patch +# x86-no-highmem-with-rt.patch -- peterz +features/all/rt/x86-use-gen-rwsem-spinlocks-rt.patch +features/all/rt/x86-disable-debug-stack.patch + +# CPU get light +features/all/rt/workqueue-use-get-cpu-light.patch +features/all/rt/epoll-use-get-cpu-light.patch +features/all/rt/mm-vmalloc-use-get-cpu-light.patch + +# WORKQUEUE more fixes +# CHECKME workqueue-sanity.patch +# CHECKME workqueue-fix-PF_THREAD_BOUND.patch +# CHECKME workqueue-hotplug-fix.patch +# CHECKME workqueue-more-hotplug-fallout.patch + +# DEBUGOBJECTS +features/all/rt/debugobjects-rt.patch + +# JUMPLABEL +features/all/rt/jump-label-rt.patch + +# NET +features/all/rt/skbufhead-raw-lock.patch + +# PERF +features/all/rt/perf-move-irq-work-to-softirq-in-rt.patch + +# CONSOLE. NEEDS more thought !!! +features/all/rt/printk-rt-aware.patch + +# POWERC +features/all/rt/power-use-generic-rwsem-on-rt.patch +features/all/rt/power-disable-highmem-on-rt.patch + +# ARM +features/all/rt/arm-disable-highmem-on-rt.patch +features/all/rt/arm-at91-tclib-default-to-tclib-timer-for-rt.patch + +# MIPS +features/all/rt/mips-disable-highmem-on-rt.patch + +# NETWORK livelock fix +features/all/rt/net-tx-action-avoid-livelock-on-rt.patch + +# NETWORK DEBUGGING AID +features/all/rt/ping-sysrq.patch + +# KGDB +features/all/rt/kgb-serial-hackaround.patch + +# SYSFS - RT indicator +features/all/rt/sysfs-realtime-entry.patch + +# KMAP/HIGHMEM +features/all/rt/mm-rt-kmap-atomic-scheduling.patch + +# IPC +features/all/rt/ipc-sem-rework-semaphore-wakeups.patch + +# SYSRQ + +# KVM require constant freq TSC (smp function call -> cpufreq) +features/all/rt/x86-kvm-require-const-tsc-for-rt.patch + +# SCSI/FCOE +features/all/rt/scsi-fcoe-rt-aware.patch + +# X86 crypto +features/all/rt/x86-crypto-reduce-preempt-disabled-regions.patch + +# Device mapper +features/all/rt/dm-make-rt-aware.patch + +# ACPI +# Dropped those two as they cause a scheduling in atomic failure and +# we have no clue why we made those locks raw in the first place. +# acpi-make-gbl-hardware-lock-raw.patch +# acpi-make-ec-lock-raw-as-well.patch + +# This one is just a follow up to the raw spin locks +# Simple raw spinlock based waitqueue +# wait-simple-version.patch +# acpi-gpe-use-wait-simple.patch + +# CPUMASK OFFSTACK +features/all/rt/cpumask-disable-offstack-on-rt.patch + +# Various fixes - fold them back +features/all/rt/seqlock-prevent-rt-starvation.patch +#fs-protect-opencoded-isize-seqcount.patch +#net-u64-stat-protect-seqcount.patch +features/all/rt/rfc-sched-rt-fix-wait_task_interactive-to-test-rt_spin_lock-state.patch + +features/all/rt/cpu-rt-make-hotplug-lock-a-sleeping-spinlock-on-rt.patch + +features/all/rt/softirq-preempt-fix-3-re.patch +features/all/rt/scsi-qla2xxx-fix-bug-sleeping-function-called-from-invalid-context.patch +features/all/rt/upstream-net-rt-remove-preemption-disabling-in-netif_rx.patch + +# FS LIVELOCK PREVENTION +features/all/rt/rt-introduce-cpu-chill.patch +features/all/rt/fs-dcache-use-cpu-chill-in-trylock-loops.patch +features/all/rt/net-use-cpu-chill.patch + +# LOCKDEP +features/all/rt/lockdep-selftest-convert-spinlock-to-raw-spinlock.patch +features/all/rt/lockdep-selftest-only-do-hardirq-context-test-for-raw-spinlock.patch + +features/all/rt/rt-disable-rt-group-sched.patch +features/all/rt/fs-jbd-pull-plug-when-waiting-for-space.patch +features/all/rt/perf-make-swevent-hrtimer-irqsafe.patch +features/all/rt/cpu-rt-rework-cpu-down.patch + +# Stable-rt stuff: Fold back when Steve grabbed it +features/all/rt/random-make-it-work-on-rt.patch +features/all/rt/softirq-init-softirq-local-lock-after-per-cpu-section-is-set-up.patch +features/all/rt/mm-slab-fix-potential-deadlock.patch +features/all/rt/mm-page-alloc-use-local-lock-on-target-cpu.patch +features/all/rt/rt-rw-lockdep-annotations.patch +features/all/rt/sched-better-debug-output-for-might-sleep.patch +features/all/rt/stomp-machine-deal-clever-with-stopper-lock.patch + +# 3.6 specific updates +features/all/rt/net-another-local-irq-disable-alloc-atomic-headache.patch +features/all/rt/net-use-cpu-light-in-ip-send-unicast-reply.patch +features/all/rt/peterz-srcu-crypto-chain.patch +features/all/rt/crypto-make-core-static-and-init-scru-early.patch +features/all/rt/x86-perf-uncore-deal-with-kfree.patch +features/all/rt/softirq-make-serving-softirqs-a-task-flag.patch +features/all/rt/softirq-split-handling-function.patch +features/all/rt/softirq-split-locks.patch + +# Needs more thought +# block-wrap-raise-softirq-in-local-bh-to-avoid-context-switches.patch +# nohz-fix-sirq-fallout.patch + +# Enable full RT +features/all/rt/rcu-tiny-solve-rt-mistery.patch +features/all/rt/kconfig-disable-a-few-options-rt.patch +features/all/rt/kconfig-preempt-rt-full.patch