SOURCES: kernel-desktop-preempt-rt.patch - updated to patch-2.6.16...
sparky
sparky at pld-linux.org
Wed May 3 23:55:40 CEST 2006
Author: sparky Date: Wed May 3 21:55:40 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- updated to patch-2.6.16-rt20 (merged 18->20 changes)
---- Files affected:
SOURCES:
kernel-desktop-preempt-rt.patch (1.2 -> 1.3)
---- Diffs:
================================================================
Index: SOURCES/kernel-desktop-preempt-rt.patch
diff -u SOURCES/kernel-desktop-preempt-rt.patch:1.2 SOURCES/kernel-desktop-preempt-rt.patch:1.3
--- SOURCES/kernel-desktop-preempt-rt.patch:1.2 Mon May 1 17:15:04 2006
+++ SOURCES/kernel-desktop-preempt-rt.patch Wed May 3 23:55:34 2006
@@ -789,6 +789,44 @@
+ passes through a grace period. The last entry should be zero,
+ as it is only incremented if a torture structure's counter
+ somehow gets incremented farther than it should.
+Index: linux/Documentation/RCU/whatisRCU.txt
+===================================================================
+--- linux.orig/Documentation/RCU/whatisRCU.txt
++++ linux/Documentation/RCU/whatisRCU.txt
+@@ -790,7 +790,6 @@ RCU pointer update:
+
+ RCU grace period:
+
+- synchronize_kernel (deprecated)
+ synchronize_net
+ synchronize_sched
+ synchronize_rcu
+Index: linux/Documentation/feature-removal-schedule.txt
+===================================================================
+--- linux.orig/Documentation/feature-removal-schedule.txt
++++ linux/Documentation/feature-removal-schedule.txt
+@@ -32,21 +32,6 @@ Who: Adrian Bunk <bunk at stusta.de>
+
+ ---------------------------
+
+-What: RCU API moves to EXPORT_SYMBOL_GPL
+-When: April 2006
+-Files: include/linux/rcupdate.h, kernel/rcupdate.c
+-Why: Outside of Linux, the only implementations of anything even
+- vaguely resembling RCU that I am aware of are in DYNIX/ptx,
+- VM/XA, Tornado, and K42. I do not expect anyone to port binary
+- drivers or kernel modules from any of these, since the first two
+- are owned by IBM and the last two are open-source research OSes.
+- So these will move to GPL after a grace period to allow
+- people, who might be using implementations that I am not aware
+- of, to adjust to this upcoming change.
+-Who: Paul E. McKenney <paulmck at us.ibm.com>
+-
+----------------------------
+-
+ What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN
+ When: November 2005
+ Why: Deprecated in favour of the new ioctl-based rawiso interface, which is
Index: linux/Documentation/kernel-parameters.txt
===================================================================
--- linux.orig/Documentation/kernel-parameters.txt
@@ -18288,15 +18326,6 @@
return;
}
-@@ -1332,7 +1326,7 @@ struct bh_lru {
-
- static DEFINE_PER_CPU(struct bh_lru, bh_lrus) = {{ NULL }};
-
--#ifdef CONFIG_SMP
-+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
- #define bh_lru_lock() local_irq_disable()
- #define bh_lru_unlock() local_irq_enable()
- #else
@@ -3160,6 +3154,8 @@ EXPORT_SYMBOL(alloc_buffer_head);
void free_buffer_head(struct buffer_head *bh)
{
@@ -25196,7 +25225,7 @@
+ */
+#define ROBUST_LIST_LIMIT 2048
+
-+long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout,
++long do_futex(u32 __user *uaddr, int op, u32 val, struct timespec *timeout,
+ u32 __user *uaddr2, u32 val2, u32 val3);
+
+extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr);
@@ -25599,10 +25628,11 @@
.policy = SCHED_NORMAL, \
.cpus_allowed = CPU_MASK_ALL, \
.mm = NULL, \
-@@ -121,6 +123,7 @@ extern struct group_info init_groups;
+@@ -121,6 +123,8 @@ extern struct group_info init_groups;
.journal_info = NULL, \
.cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \
.fs_excl = ATOMIC_INIT(0), \
++ .posix_timer_list = NULL, \
+ INIT_RT_MUTEXES(tsk) \
}
@@ -27003,6 +27033,17 @@
+}
+
+#endif
+Index: linux/include/linux/posix-timers.h
+===================================================================
+--- linux.orig/include/linux/posix-timers.h
++++ linux/include/linux/posix-timers.h
+@@ -110,5 +110,5 @@ void posix_cpu_timers_exit_group(struct
+
+ void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx,
+ cputime_t *newval, cputime_t *oldval);
+-
++int posix_cpu_thread_init(void);
+ #endif
Index: linux/include/linux/preempt.h
===================================================================
--- linux.orig/include/linux/preempt.h
@@ -27261,7 +27302,14 @@
/**
* rcu_dereference - fetch an RCU-protected pointer in an
-@@ -253,7 +274,13 @@ extern int rcu_pending(int cpu);
+@@ -247,13 +268,19 @@ extern int rcu_pending(int cpu);
+ * softirq handlers will have completed, since in some kernels, these
+ * handlers can run in process context, and can block.
+ *
+- * This primitive provides the guarantees made by the (deprecated)
++ * This primitive provides the guarantees made by the (now removed)
+ * synchronize_kernel() API. In contrast, synchronize_rcu() only
+ * guarantees that rcu_read_lock() sections will have completed.
* In "classic RCU", these two guarantees happen to be one and
* the same, but can differ in realtime RCU implementations.
*/
@@ -27275,8 +27323,11 @@
extern void rcu_init(void);
extern void rcu_check_callbacks(int cpu, int user);
-@@ -268,7 +295,6 @@ extern void FASTCALL(call_rcu_bh(struct
- extern __deprecated_for_modules void synchronize_kernel(void);
+@@ -265,10 +292,8 @@ extern void FASTCALL(call_rcu(struct rcu
+ void (*func)(struct rcu_head *head)));
+ extern void FASTCALL(call_rcu_bh(struct rcu_head *head,
+ void (*func)(struct rcu_head *head)));
+-extern __deprecated_for_modules void synchronize_kernel(void);
extern void synchronize_rcu(void);
void synchronize_idle(void);
-extern void rcu_barrier(void);
@@ -28175,7 +28226,16 @@
#ifdef CONFIG_SCHEDSTATS
struct sched_info sched_info;
#endif
-@@ -828,11 +977,51 @@ struct task_struct {
+@@ -773,6 +922,8 @@ struct task_struct {
+ unsigned long long it_sched_expires;
+ struct list_head cpu_timers[3];
+
++ struct task_struct* posix_timer_list;
++
+ /* process credentials */
+ uid_t uid,euid,suid,fsuid;
+ gid_t gid,egid,sgid,fsgid;
+@@ -828,11 +979,51 @@ struct task_struct {
/* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */
spinlock_t proc_lock;
@@ -28227,7 +28287,7 @@
/* journalling filesystem info */
void *journal_info;
-@@ -869,6 +1058,13 @@ struct task_struct {
+@@ -869,6 +1060,13 @@ struct task_struct {
nodemask_t mems_allowed;
int cpuset_mems_generation;
#endif
@@ -28241,7 +28301,7 @@
atomic_t fs_excl; /* holding fs exclusive resources */
struct rcu_head rcu;
};
-@@ -928,6 +1124,11 @@ static inline void put_task_struct(struc
+@@ -928,6 +1126,11 @@ static inline void put_task_struct(struc
#define PF_BORROWED_MM 0x00400000 /* I am a kthread doing use_mm */
#define PF_RANDOMIZE 0x00800000 /* randomize virtual address space */
#define PF_SWAPWRITE 0x01000000 /* Allowed to write to swap */
@@ -28253,7 +28313,7 @@
/*
* Only the _current_ task can read/write to tsk->flags, but other
-@@ -982,6 +1183,17 @@ static inline void idle_task_exit(void)
+@@ -982,6 +1185,17 @@ static inline void idle_task_exit(void)
#endif
extern void sched_idle_next(void);
@@ -28271,7 +28331,7 @@
extern void set_user_nice(task_t *p, long nice);
extern int task_prio(const task_t *p);
extern int task_nice(const task_t *p);
-@@ -989,11 +1201,13 @@ extern int can_nice(const task_t *p, con
+@@ -989,11 +1203,13 @@ extern int can_nice(const task_t *p, con
extern int task_curr(const task_t *p);
extern int idle_cpu(int cpu);
extern int sched_setscheduler(struct task_struct *, int, struct sched_param *);
@@ -28285,7 +28345,7 @@
/*
* The default (Linux) execution domain.
-@@ -1041,6 +1255,9 @@ extern void do_timer(struct pt_regs *);
+@@ -1041,6 +1257,9 @@ extern void do_timer(struct pt_regs *);
extern int FASTCALL(wake_up_state(struct task_struct * tsk, unsigned int state));
extern int FASTCALL(wake_up_process(struct task_struct * tsk));
@@ -28295,7 +28355,7 @@
extern void FASTCALL(wake_up_new_task(struct task_struct * tsk,
unsigned long clone_flags));
#ifdef CONFIG_SMP
-@@ -1128,12 +1345,20 @@ extern struct mm_struct * mm_alloc(void)
+@@ -1128,12 +1347,20 @@ extern struct mm_struct * mm_alloc(void)
/* mmdrop drops the mm and the page tables */
extern void FASTCALL(__mmdrop(struct mm_struct *));
@@ -28316,7 +28376,7 @@
/* 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 */
-@@ -1297,43 +1522,97 @@ static inline int signal_pending(struct
+@@ -1297,43 +1524,97 @@ static inline int signal_pending(struct
return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING));
}
@@ -28430,7 +28490,7 @@
/* Reevaluate whether the task has signals pending delivery.
This is required every time the blocked sigset_t changes.
callers must hold sighand->siglock. */
-@@ -1355,6 +1634,7 @@ static inline unsigned int task_cpu(cons
+@@ -1355,6 +1636,7 @@ static inline unsigned int task_cpu(cons
static inline void set_task_cpu(struct task_struct *p, unsigned int cpu)
{
@@ -29892,7 +29952,7 @@
+extern int timeofday_is_continuous(void);
+extern u32 timeofday_get_clockres(void);
+extern void timeofday_init(void);
-+
++extern void timeofday_overflow_protection(void);
+#ifndef CONFIG_IS_TICK_BASED
+#define arch_getoffset() (0)
+#else
@@ -30397,7 +30457,7 @@
if (msg) {
printk(KERN_WARNING "error in initcall at 0x%p: "
"returned with %s\n", *call, msg);
-@@ -618,6 +642,7 @@ static void __init do_basic_setup(void)
+@@ -618,13 +642,16 @@ static void __init do_basic_setup(void)
static void do_pre_smp_initcalls(void)
{
extern int spawn_ksoftirqd(void);
@@ -30405,15 +30465,16 @@
#ifdef CONFIG_SMP
extern int migration_init(void);
-@@ -625,6 +650,7 @@ static void do_pre_smp_initcalls(void)
+ migration_init();
#endif
++ posix_cpu_thread_init();
spawn_ksoftirqd();
spawn_softlockup_task();
+ spawn_desched_task();
}
static void run_init_process(char *init_filename)
-@@ -670,6 +696,8 @@ static int init(void * unused)
+@@ -670,6 +697,8 @@ static int init(void * unused)
smp_prepare_cpus(max_cpus);
@@ -30422,12 +30483,12 @@
do_pre_smp_initcalls();
fixup_cpu_present_map();
-@@ -698,7 +726,51 @@ static int init(void * unused)
+@@ -698,7 +727,51 @@ static int init(void * unused)
ramdisk_execute_command = NULL;
prepare_namespace();
}
+#ifdef CONFIG_PREEMPT_RT
-+ WARN_ON(irqs_disabled() || irqs_disabled());
++ WARN_ON(irqs_disabled());
+#endif
+#define DEBUG_COUNT (defined(CONFIG_DEBUG_RT_MUTEXES) + defined(CONFIG_DEBUG_PREEMPT) + defined(CONFIG_CRITICAL_PREEMPT_TIMING) + defined(CONFIG_CRITICAL_IRQSOFF_TIMING) + defined(CONFIG_LATENCY_TRACE) + defined(CONFIG_DEBUG_SLAB) + defined(CONFIG_DEBUG_PAGEALLOC))
@@ -30474,12 +30535,12 @@
/*
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
-@@ -721,6 +793,9 @@ static int init(void * unused)
+@@ -721,6 +794,9 @@ static int init(void * unused)
printk(KERN_WARNING "Failed to execute %s\n",
ramdisk_execute_command);
}
+#ifdef CONFIG_PREEMPT_RT
-+ WARN_ON(irqs_disabled() || irqs_disabled());
++ WARN_ON(irqs_disabled());
+#endif
/*
@@ -31128,6 +31189,15 @@
/*
* This creates a new process as a copy of the old one,
* but does not actually start it yet.
+@@ -1005,7 +1061,7 @@ static task_t *copy_process(unsigned lon
+ INIT_LIST_HEAD(&p->cpu_timers[0]);
+ INIT_LIST_HEAD(&p->cpu_timers[1]);
+ INIT_LIST_HEAD(&p->cpu_timers[2]);
+-
++ p->posix_timer_list = NULL;
+ p->lock_depth = -1; /* -1 = no lock */
+ do_posix_clock_monotonic_gettime(&p->start_time);
+ p->security = NULL;
@@ -1022,6 +1078,8 @@ static task_t *copy_process(unsigned lon
}
#endif
@@ -31321,16 +31391,17 @@
* Thanks to Ben LaHaise for yelling "hashed waitqueues" loudly
* enough at me, Linus for the original (flawed) idea, Matthew
* Kirkwood for proof-of-concept implementation.
-@@ -42,6 +50,8 @@
+@@ -41,6 +49,9 @@
+ #include <linux/syscalls.h>
#include <linux/signal.h>
#include <asm/futex.h>
-
-+#include "rtmutex_common.h"
++#include <linux/hrtimer.h>
+
++#include "rtmutex_common.h"
+
#define FUTEX_HASHBITS (CONFIG_BASE_SMALL ? 4 : 8)
- /*
-@@ -59,7 +69,7 @@ union futex_key {
+@@ -59,7 +70,7 @@ union futex_key {
int offset;
} shared;
struct {
@@ -31339,7 +31410,7 @@
struct mm_struct *mm;
int offset;
} private;
-@@ -71,6 +81,27 @@ union futex_key {
+@@ -71,6 +82,27 @@ union futex_key {
};
/*
@@ -31367,7 +31438,7 @@
* We use this hashed waitqueue instead of a normal wait_queue_t, so
* we can wake only the relevant ones (hashed queues may be shared).
*
-@@ -83,15 +114,19 @@ struct futex_q {
+@@ -83,15 +115,19 @@ struct futex_q {
struct list_head list;
wait_queue_head_t waiters;
@@ -31390,7 +31461,7 @@
};
/*
-@@ -140,8 +175,9 @@ static inline int match_futex(union fute
+@@ -140,8 +176,9 @@ static inline int match_futex(union fute
*
* Should be called with ¤t->mm->mmap_sem but NOT any spinlocks.
*/
@@ -31401,7 +31472,7 @@
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
struct page *page;
-@@ -150,16 +186,16 @@ static int get_futex_key(unsigned long u
+@@ -150,16 +187,16 @@ static int get_futex_key(unsigned long u
/*
* The futex address must be "naturally" aligned.
*/
@@ -31421,7 +31492,7 @@
if (unlikely(!vma))
return -EFAULT;
-@@ -180,7 +216,7 @@ static int get_futex_key(unsigned long u
+@@ -180,7 +217,7 @@ static int get_futex_key(unsigned long u
*/
if (likely(!(vma->vm_flags & VM_MAYSHARE))) {
key->private.mm = mm;
@@ -31430,7 +31501,7 @@
return 0;
}
-@@ -190,7 +226,7 @@ static int get_futex_key(unsigned long u
+@@ -190,7 +227,7 @@ static int get_futex_key(unsigned long u
key->shared.inode = vma->vm_file->f_dentry->d_inode;
key->both.offset++; /* Bit 0 of offset indicates inode-based key. */
if (likely(!(vma->vm_flags & VM_NONLINEAR))) {
@@ -31439,7 +31510,7 @@
+ vma->vm_pgoff);
return 0;
}
-@@ -201,7 +237,7 @@ static int get_futex_key(unsigned long u
+@@ -201,7 +238,7 @@ static int get_futex_key(unsigned long u
* from swap. But that's a lot of code to duplicate here
* for a rare case, so we simply fetch the page.
*/
@@ -31448,7 +31519,7 @@
if (err >= 0) {
key->shared.pgoff =
page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
-@@ -242,18 +278,246 @@ static void drop_key_refs(union futex_ke
+@@ -242,18 +279,246 @@ static void drop_key_refs(union futex_ke
}
}
@@ -31697,7 +31768,7 @@
* The hash bucket lock must be held when this is called.
* Afterwards, the futex_q must not be accessed.
*/
-@@ -280,16 +544,85 @@ static void wake_futex(struct futex_q *q
+@@ -280,16 +545,85 @@ static void wake_futex(struct futex_q *q
q->lock_ptr = NULL;
}
@@ -31787,7 +31858,7 @@
int ret;
down_read(¤t->mm->mmap_sem);
-@@ -298,19 +631,21 @@ static int futex_wake(unsigned long uadd
+@@ -298,19 +632,21 @@ static int futex_wake(unsigned long uadd
if (unlikely(ret != 0))
goto out;
@@ -31813,7 +31884,7 @@
out:
up_read(¤t->mm->mmap_sem);
return ret;
-@@ -320,10 +655,12 @@ out:
+@@ -320,10 +656,12 @@ out:
* Wake up all waiters hashed on the physical page that is mapped
* to this virtual address:
*/
@@ -31828,7 +31899,7 @@
struct list_head *head;
struct futex_q *this, *next;
int ret, op_ret, attempt = 0;
-@@ -338,27 +675,29 @@ retryfull:
+@@ -338,27 +676,29 @@ retryfull:
if (unlikely(ret != 0))
goto out;
@@ -31872,7 +31943,7 @@
ret = op_ret;
goto out;
#endif
-@@ -368,47 +707,34 @@ retry:
+@@ -368,47 +708,34 @@ retry:
goto out;
}
@@ -31894,9 +31965,7 @@
- !(vma = find_vma(mm, uaddr2)) ||
- vma->vm_start > uaddr2 ||
- !(vma->vm_flags & VM_WRITE))
-+ if (futex_handle_fault((unsigned long)uaddr2,
-+ attempt))
- goto out;
+- goto out;
-
- switch (handle_mm_fault(mm, vma, uaddr2, 1)) {
- case VM_FAULT_MINOR:
@@ -31906,7 +31975,9 @@
- current->maj_flt++;
- break;
- default:
-- goto out;
++ if (futex_handle_fault((unsigned long)uaddr2,
++ attempt))
+ goto out;
- }
goto retry;
}
@@ -31932,7 +32003,7 @@
list_for_each_entry_safe(this, next, head, list) {
if (match_futex (&this->key, &key1)) {
-@@ -419,7 +745,7 @@ retry:
+@@ -419,7 +746,7 @@ retry:
}
if (op_ret > 0) {
@@ -31941,7 +32012,7 @@
op_ret = 0;
list_for_each_entry_safe(this, next, head, list) {
-@@ -432,9 +758,9 @@ retry:
+@@ -432,9 +759,9 @@ retry:
ret += op_ret;
}
@@ -31954,7 +32025,7 @@
out:
up_read(¤t->mm->mmap_sem);
return ret;
-@@ -444,11 +770,11 @@ out:
+@@ -444,11 +771,11 @@ out:
* Requeue all waiters hashed on one physical page to another
* physical page.
*/
@@ -31969,7 +32040,7 @@
struct list_head *head1;
struct futex_q *this, *next;
int ret, drop_count = 0;
-@@ -463,68 +789,69 @@ static int futex_requeue(unsigned long u
+@@ -463,68 +790,69 @@ static int futex_requeue(unsigned long u
if (unlikely(ret != 0))
goto out;
@@ -32063,7 +32134,7 @@
/* drop_key_refs() must be called outside the spinlocks. */
while (--drop_count >= 0)
-@@ -539,7 +866,7 @@ out:
+@@ -539,7 +867,7 @@ out:
static inline struct futex_hash_bucket *
queue_lock(struct futex_q *q, int fd, struct file *filp)
{
@@ -32072,7 +32143,7 @@
q->fd = fd;
q->filp = filp;
-@@ -547,23 +874,24 @@ queue_lock(struct futex_q *q, int fd, st
+@@ -547,23 +875,24 @@ queue_lock(struct futex_q *q, int fd, st
init_waitqueue_head(&q->waiters);
get_key_refs(&q->key);
@@ -32106,7 +32177,7 @@
drop_key_refs(&q->key);
}
-@@ -575,16 +903,17 @@ queue_unlock(struct futex_q *q, struct f
+@@ -575,16 +904,17 @@ queue_unlock(struct futex_q *q, struct f
/* The key must be already stored in q->key. */
static void queue_me(struct futex_q *q, int fd, struct file *filp)
{
@@ -32128,7 +32199,7 @@
/* In the common case we don't take the spinlock, which is nice. */
retry:
-@@ -610,6 +939,9 @@ static int unqueue_me(struct futex_q *q)
+@@ -610,6 +940,9 @@ static int unqueue_me(struct futex_q *q)
}
WARN_ON(list_empty(&q->list));
list_del(&q->list);
@@ -32138,7 +32209,7 @@
spin_unlock(lock_ptr);
ret = 1;
}
-@@ -618,21 +950,42 @@ static int unqueue_me(struct futex_q *q)
+@@ -618,21 +951,44 @@ static int unqueue_me(struct futex_q *q)
return ret;
}
@@ -32148,9 +32219,7 @@
+ * hash bucket. The hash bucket lock is held on entry and dropped here.
+ */
+static void unqueue_me_pi(struct futex_q *q, struct futex_hash_bucket *hb)
- {
-- DECLARE_WAITQUEUE(wait, current);
-- int ret, curval;
++{
+ WARN_ON(list_empty(&q->list));
+ list_del(&q->list);
+
@@ -32163,8 +32232,10 @@
+ drop_key_refs(&q->key);
+}
+
-+static int futex_wait(u32 __user *uaddr, u32 val, unsigned long time)
-+{
++static int futex_wait(u32 __user *uaddr, u32 val, struct timespec *time)
+ {
+- DECLARE_WAITQUEUE(wait, current);
+- int ret, curval;
+ struct task_struct *curr = current;
+ DECLARE_WAITQUEUE(wait, curr);
+ struct futex_hash_bucket *hb;
@@ -32172,6 +32243,8 @@
- struct futex_hash_bucket *bh;
+ u32 uval;
+ int ret;
++ struct hrtimer_sleeper t;
++ int rem = 0;
+ q.pi_state = NULL;
retry:
@@ -32187,7 +32260,7 @@
/*
* Access the page AFTER the futex is queued.
-@@ -654,37 +1007,35 @@ static int futex_wait(unsigned long uadd
+@@ -654,37 +1010,35 @@ static int futex_wait(unsigned long uadd
* We hold the mmap semaphore, so the mapping cannot have changed
* since we looked it up in get_futex_key.
*/
@@ -32237,24 +32310,52 @@
/*
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/kernel-desktop-preempt-rt.patch?r1=1.2&r2=1.3&f=u
More information about the pld-cvs-commit
mailing list