packages (Titanium): kernel-desktop/kernel-desktop-sched-bfs.patch - BFS up...
lmasko
lmasko at pld-linux.org
Sat Sep 25 21:26:59 CEST 2010
Author: lmasko Date: Sat Sep 25 19:26:58 2010 GMT
Module: packages Tag: Titanium
---- Log message:
- BFS up to v.0.350
---- Files affected:
packages/kernel-desktop:
kernel-desktop-sched-bfs.patch (1.1.2.20 -> 1.1.2.21)
---- Diffs:
================================================================
Index: packages/kernel-desktop/kernel-desktop-sched-bfs.patch
diff -u packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.20 packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.21
--- packages/kernel-desktop/kernel-desktop-sched-bfs.patch:1.1.2.20 Mon Aug 30 23:56:49 2010
+++ packages/kernel-desktop/kernel-desktop-sched-bfs.patch Sat Sep 25 21:26:51 2010
@@ -1,4 +1,4 @@
-The Brain Fuck Scheduler v0.330 by Con Kolivas.
+The Brain Fuck Scheduler v0.350 by Con Kolivas.
A single shared runqueue O(n) strict fairness earliest deadline first design.
@@ -38,17 +38,17 @@
kernel/kthread.c | 2
kernel/posix-cpu-timers.c | 14
kernel/sched.c | 4
- kernel/sched_bfs.c | 6874 ++++++++++++++++++++++++++++++
+ kernel/sched_bfs.c | 6984 ++++++++++++++++++++++++++++++
kernel/slow-work.c | 1
kernel/sysctl.c | 31
lib/Kconfig.debug | 2
mm/oom_kill.c | 2
- 19 files changed, 7481 insertions(+), 28 deletions(-)
+ 19 files changed, 7591 insertions(+), 28 deletions(-)
-Index: linux-2.6.35-bfs/Documentation/sysctl/kernel.txt
+Index: linux-2.6.35.5-ck1/Documentation/sysctl/kernel.txt
===================================================================
---- linux-2.6.35-bfs.orig/Documentation/sysctl/kernel.txt 2010-02-25 21:51:46.000000000 +1100
-+++ linux-2.6.35-bfs/Documentation/sysctl/kernel.txt 2010-08-13 08:39:05.070929446 +1000
+--- linux-2.6.35.5-ck1.orig/Documentation/sysctl/kernel.txt 2010-02-25 21:51:46.000000000 +1100
++++ linux-2.6.35.5-ck1/Documentation/sysctl/kernel.txt 2010-09-25 01:17:57.872918484 +1000
@@ -31,6 +31,7 @@ show up in /proc/sys/kernel:
- domainname
- hostname
@@ -103,10 +103,10 @@
rtsig-max & rtsig-nr:
The file rtsig-max can be used to tune the maximum number
-Index: linux-2.6.35-bfs/include/linux/init_task.h
+Index: linux-2.6.35.5-ck1/include/linux/init_task.h
===================================================================
---- linux-2.6.35-bfs.orig/include/linux/init_task.h 2010-08-02 11:12:25.000000000 +1000
-+++ linux-2.6.35-bfs/include/linux/init_task.h 2010-08-13 08:39:05.070929446 +1000
+--- linux-2.6.35.5-ck1.orig/include/linux/init_task.h 2010-08-02 11:12:25.000000000 +1000
++++ linux-2.6.35.5-ck1/include/linux/init_task.h 2010-09-25 01:17:57.873918535 +1000
@@ -106,6 +106,69 @@ extern struct cred init_cred;
* INIT_TASK is used to set up the first task table, touch at
* your own risk!. Base=0, limit=0x1fffff (=2MB)
@@ -186,10 +186,10 @@
#define INIT_CPU_TIMERS(cpu_timers) \
{ \
-Index: linux-2.6.35-bfs/include/linux/sched.h
+Index: linux-2.6.35.5-ck1/include/linux/sched.h
===================================================================
---- linux-2.6.35-bfs.orig/include/linux/sched.h 2010-08-02 11:12:25.000000000 +1000
-+++ linux-2.6.35-bfs/include/linux/sched.h 2010-08-29 09:24:24.689454445 +1000
+--- linux-2.6.35.5-ck1.orig/include/linux/sched.h 2010-09-25 01:17:40.364012559 +1000
++++ linux-2.6.35.5-ck1/include/linux/sched.h 2010-09-25 01:21:34.406120878 +1000
@@ -36,8 +36,15 @@
#define SCHED_FIFO 1
#define SCHED_RR 2
@@ -216,7 +216,7 @@
extern cpumask_var_t nohz_cpu_mask;
#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ)
extern int select_nohz_load_balancer(int cpu);
-@@ -1179,17 +1184,31 @@ struct task_struct {
+@@ -1173,17 +1178,31 @@ struct task_struct {
int lock_depth; /* BKL lock depth */
@@ -233,7 +233,7 @@
int prio, static_prio, normal_prio;
unsigned int rt_priority;
+#ifdef CONFIG_SCHED_BFS
-+ int time_slice, first_time_slice;
++ int time_slice;
+ u64 deadline;
+ struct list_head run_list;
+ u64 last_ran;
@@ -248,7 +248,7 @@
#ifdef CONFIG_PREEMPT_NOTIFIERS
/* list of struct preempt_notifier: */
-@@ -1284,6 +1303,9 @@ struct task_struct {
+@@ -1278,6 +1297,9 @@ struct task_struct {
int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */
cputime_t utime, stime, utimescaled, stimescaled;
@@ -258,7 +258,7 @@
cputime_t gtime;
#ifndef CONFIG_VIRT_CPU_ACCOUNTING
cputime_t prev_utime, prev_stime;
-@@ -1506,6 +1528,67 @@ struct task_struct {
+@@ -1500,6 +1522,67 @@ struct task_struct {
#endif
};
@@ -281,7 +281,7 @@
+
+static inline void print_scheduler_version(void)
+{
-+ printk(KERN_INFO"BFS CPU scheduler v0.330 by Con Kolivas.\n");
++ printk(KERN_INFO"BFS CPU scheduler v0.350 by Con Kolivas.\n");
+}
+
+static inline int iso_task(struct task_struct *p)
@@ -326,7 +326,7 @@
/* Future-safe accessor for struct task_struct's cpus_allowed. */
#define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed)
-@@ -1524,9 +1607,19 @@ struct task_struct {
+@@ -1518,9 +1601,19 @@ struct task_struct {
#define MAX_USER_RT_PRIO 100
#define MAX_RT_PRIO MAX_USER_RT_PRIO
@@ -347,7 +347,7 @@
static inline int rt_prio(int prio)
{
-@@ -1835,7 +1928,7 @@ task_sched_runtime(struct task_struct *t
+@@ -1829,7 +1922,7 @@ task_sched_runtime(struct task_struct *t
extern unsigned long long thread_group_sched_runtime(struct task_struct *task);
/* sched_exec is called by processes performing an exec */
@@ -356,7 +356,7 @@
extern void sched_exec(void);
#else
#define sched_exec() {}
-@@ -1999,6 +2092,9 @@ extern void wake_up_new_task(struct task
+@@ -1993,6 +2086,9 @@ extern void wake_up_new_task(struct task
static inline void kick_process(struct task_struct *tsk) { }
#endif
extern void sched_fork(struct task_struct *p, int clone_flags);
@@ -366,10 +366,10 @@
extern void sched_dead(struct task_struct *p);
extern void proc_caches_init(void);
-Index: linux-2.6.35-bfs/kernel/sysctl.c
+Index: linux-2.6.35.5-ck1/kernel/sysctl.c
===================================================================
---- linux-2.6.35-bfs.orig/kernel/sysctl.c 2010-08-02 11:12:25.000000000 +1000
-+++ linux-2.6.35-bfs/kernel/sysctl.c 2010-08-13 08:39:05.071929295 +1000
+--- linux-2.6.35.5-ck1.orig/kernel/sysctl.c 2010-08-02 11:12:25.000000000 +1000
++++ linux-2.6.35.5-ck1/kernel/sysctl.c 2010-09-25 01:19:19.941498189 +1000
@@ -115,7 +115,12 @@ static int zero;
static int __maybe_unused one = 1;
static int __maybe_unused two = 2;
@@ -379,7 +379,7 @@
+#ifdef CONFIG_SCHED_BFS
+extern int rr_interval;
+extern int sched_iso_cpu;
-+static int __read_mostly five_thousand = 5000;
++static int __read_mostly one_thousand = 1000;
+#endif
#ifdef CONFIG_PRINTK
static int ten_thousand = 10000;
@@ -421,7 +421,7 @@
+ .mode = 0644,
+ .proc_handler = &proc_dointvec_minmax,
+ .extra1 = &one,
-+ .extra2 = &five_thousand,
++ .extra2 = &one_thousand,
+ },
+ {
+ .procname = "iso_cpu",
@@ -436,11 +436,11 @@
#if defined(CONFIG_S390) && defined(CONFIG_SMP)
{
.procname = "spin_retry",
-Index: linux-2.6.35-bfs/kernel/sched_bfs.c
+Index: linux-2.6.35.5-ck1/kernel/sched_bfs.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.35-bfs/kernel/sched_bfs.c 2010-08-29 10:02:43.030955931 +1000
-@@ -0,0 +1,6874 @@
++++ linux-2.6.35.5-ck1/kernel/sched_bfs.c 2010-09-25 01:21:48.281964938 +1000
+@@ -0,0 +1,6984 @@
+/*
+ * kernel/sched_bfs.c, was sched.c
+ *
@@ -549,10 +549,19 @@
+#define MAX_USER_PRIO (USER_PRIO(MAX_PRIO))
+#define SCHED_PRIO(p) ((p)+MAX_RT_PRIO)
+
-+/* Some helpers for converting to/from various scales.*/
++/*
++ * Some helpers for converting to/from various scales. Use shifts to get
++ * approximate multiples of ten for less overhead.
++ */
+#define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ))
-+#define MS_TO_NS(TIME) ((TIME) * 1000000)
-+#define MS_TO_US(TIME) ((TIME) * 1000)
++#define HALF_JIFFY_NS (1000000000 / HZ / 2)
++#define HALF_JIFFY_US (1000000 / HZ / 2)
++#define MS_TO_NS(TIME) ((TIME) << 20)
++#define MS_TO_US(TIME) ((TIME) << 10)
++#define NS_TO_MS(TIME) ((TIME) >> 20)
++#define NS_TO_US(TIME) ((TIME) >> 10)
++
++#define RESCHED_US (100) /* Reschedule if less than this many us left */
+
+/*
+ * This is the time all tasks within the same priority round robin.
@@ -583,8 +592,9 @@
+}
+
+/*
-+ * The global runqueue data that all CPUs work off. All data is protected
-+ * by grq.lock.
++ * The global runqueue data that all CPUs work off. Data is protected either
++ * by the global grq lock, or the discrete lock that precedes the data in this
++ * struct.
+ */
+struct global_rq {
+ raw_spinlock_t lock;
@@ -593,17 +603,17 @@
+ unsigned long long nr_switches;
+ struct list_head queue[PRIO_LIMIT];
+ DECLARE_BITMAP(prio_bitmap, PRIO_LIMIT + 1);
-+ int iso_ticks;
-+ int iso_refractory;
+#ifdef CONFIG_SMP
+ unsigned long qnr; /* queued not running */
+ cpumask_t cpu_idle_map;
+ int idle_cpus;
+#endif
-+#if BITS_PER_LONG < 64
-+ unsigned long jiffies;
-+ u64 jiffies_64;
-+#endif
++ /* Nanosecond jiffies */
++ u64 niffies;
++
++ raw_spinlock_t iso_lock;
++ int iso_ticks;
++ int iso_refractory;
+};
+
+/* There can be only one */
@@ -619,8 +629,8 @@
+ u64 nohz_stamp;
+ unsigned char in_nohz_recently;
+#endif
++ struct task_struct *last_task;
+#endif
-+ unsigned int skip_clock_update;
+
+ struct task_struct *curr, *idle;
+ struct mm_struct *prev_mm;
@@ -656,9 +666,11 @@
+ /* See if all cache siblings are idle */
+ cpumask_t cache_siblings;
+#endif
++ u64 last_niffy; /* Last time this RQ updated grq.niffies */
+#endif
++ u64 clock, old_clock, last_tick;
++ int dither;
+
-+ u64 clock;
+#ifdef CONFIG_SCHEDSTATS
+
+ /* latency stats */
@@ -729,15 +741,6 @@
+static struct root_domain def_root_domain;
+#endif
+
-+static inline int cpu_of(struct rq *rq)
-+{
-+#ifdef CONFIG_SMP
-+ return rq->cpu;
-+#else
-+ return 0;
-+#endif
-+}
-+
+#define rcu_dereference_check_sched_domain(p) \
+ rcu_dereference_check((p), \
+ rcu_read_lock_sched_held() || \
@@ -753,17 +756,65 @@
+#define for_each_domain(cpu, __sd) \
+ for (__sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd); __sd; __sd = __sd->parent)
+
++static inline void update_rq_clock(struct rq *rq);
++
+#ifdef CONFIG_SMP
+#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu)))
+#define this_rq() (&__get_cpu_var(runqueues))
+#define task_rq(p) cpu_rq(task_cpu(p))
+#define cpu_curr(cpu) (cpu_rq(cpu)->curr)
++static inline int cpu_of(struct rq *rq)
++{
++ return rq->cpu;
++}
++
++/*
++ * Niffies are a globally increasing nanosecond counter. Whenever a runqueue
++ * clock is updated with the grq.lock held, it is an opportunity to update the
++ * niffies value. Any CPU can update it by adding how much its clock has
++ * increased since it last updated niffies, minus any added niffies by other
++ * CPUs.
++ */
++static inline void update_clocks(struct rq *rq)
++{
++ s64 ndiff;
++
++ update_rq_clock(rq);
++ ndiff = rq->clock - rq->old_clock;
++ /* old_clock is only updated when we are updating niffies */
++ rq->old_clock = rq->clock;
++ ndiff -= grq.niffies - rq->last_niffy;
++ /*
++ * Sanity check should sched_clock return bogus values or be limited to
++ * just jiffy resolution. Some time will always have passed.
++ */
++ if (unlikely(ndiff < 1 || ndiff > MS_TO_NS(rr_interval)))
++ ndiff = 1;
++ grq.niffies += ndiff;
++ rq->last_niffy = grq.niffies;
++}
+#else /* CONFIG_SMP */
+static struct rq *uprq;
+#define cpu_rq(cpu) (uprq)
+#define this_rq() (uprq)
+#define task_rq(p) (uprq)
+#define cpu_curr(cpu) ((uprq)->curr)
++static inline int cpu_of(struct rq *rq)
++{
++ return 0;
++}
++
++static inline void update_clocks(struct rq *rq)
++{
++ s64 ndiff;
++
++ update_rq_clock(rq);
++ ndiff = rq->clock - rq->old_clock;
++ rq->old_clock = rq->clock;
++ if (unlikely(ndiff < 1 || ndiff > MS_TO_US(rr_interval)))
++ ndiff = 1;
++ grq.niffies += ndiff;
++}
+#endif
+#define raw_rq() (&__raw_get_cpu_var(runqueues))
+
@@ -778,13 +829,13 @@
+
+/*
+ * All common locking functions performed on grq.lock. rq->clock is local to
-+ * the cpu accessing it so it can be modified just with interrupts disabled,
-+ * but looking up task_rq must be done under grq.lock to be safe.
++ * the CPU accessing it so it can be modified just with interrupts disabled
++ * when we're not updating niffies.
++ * Looking up task_rq must be done under grq.lock to be safe.
+ */
-+inline void update_rq_clock(struct rq *rq)
++static inline void update_rq_clock(struct rq *rq)
+{
-+ if (!rq->skip_clock_update)
-+ rq->clock = sched_clock_cpu(cpu_of(rq));
++ rq->clock = sched_clock_cpu(cpu_of(rq));
+}
+
+static inline int task_running(struct task_struct *p)
@@ -813,8 +864,8 @@
+static inline void time_lock_grq(struct rq *rq)
+ __acquires(grq.lock)
+{
-+ update_rq_clock(rq);
+ grq_lock();
++ update_clocks(rq);
+}
+
+static inline void grq_unlock_irq(void)
@@ -848,7 +899,7 @@
+ __acquires(grq.lock)
+{
+ struct rq *rq = task_grq_lock(p, flags);
-+ update_rq_clock(rq);
++ update_clocks(rq);
+ return rq;
+}
+
@@ -863,7 +914,7 @@
+ __acquires(grq.lock)
+{
+ struct rq *rq = task_grq_lock_irq(p);
-+ update_rq_clock(rq);
++ update_clocks(rq);
+}
+
+static inline void task_grq_unlock_irq(void)
@@ -958,33 +1009,6 @@
+}
+#endif /* __ARCH_WANT_UNLOCKED_CTXSW */
+
-+/*
-+ * In order to have a monotonic clock that does not wrap we have a 64 bit
-+ * unsigned long that's protected by grq.lock used in place of jiffies on
-+ * 32 bit builds.
-+ */
-+#if BITS_PER_LONG < 64
-+static inline void update_gjiffies(void)
-+{
-+ if (grq.jiffies != jiffies) {
-+ grq_lock();
-+ grq.jiffies = jiffies;
-+ grq.jiffies_64++;
-+ grq_unlock();
-+ }
-+}
-+
-+#define gjiffies (grq.jiffies_64)
-+
-+#else /* BITS_PER_LONG < 64 */
-+static inline void update_gjiffies(void)
-+{
-+}
-+
-+#define gjiffies jiffies
-+
-+#endif /* BITS_PER_LONG < 64 */
-+
+static inline int deadline_before(u64 deadline, u64 time)
+{
+ return (deadline < time);
@@ -1017,17 +1041,6 @@
+}
+
+/*
-+ * When a task is freshly forked, the first_time_slice flag is set to say
-+ * it has taken time_slice from its parent and if it exits on this first
-+ * time_slice it can return its time_slice back to the parent.
-+ */
-+static inline void reset_first_time_slice(struct task_struct *p)
-+{
-+ if (unlikely(p->first_time_slice))
-+ p->first_time_slice = 0;
-+}
-+
-+/*
+ * To determine if it's safe for a task of SCHED_IDLEPRIO to actually run as
+ * an idle task, we ensure none of the following conditions are met.
+ */
@@ -1089,11 +1102,11 @@
+/*
+ * task_timeslice - all tasks of all priorities get the exact same timeslice
+ * length. CPU distribution is handled by giving different deadlines to
-+ * tasks of different priorities.
++ * tasks of different priorities. Use 128 as the base value for fast shifts.
+ */
+static inline int task_timeslice(struct task_struct *p)
+{
-+ return (rr_interval * task_prio_ratio(p) / 100);
++ return (rr_interval * task_prio_ratio(p) / 128);
+}
+
+#ifdef CONFIG_SMP
@@ -1145,6 +1158,15 @@
+
+static void resched_task(struct task_struct *p);
+
++/*
++ * last_task stores the last non-idle task scheduled on the local rq for
++ * cache warmth testing.
++ */
++static inline void set_last_task(struct rq *rq, struct task_struct *p)
++{
++ rq->last_task = p;
++}
++
+#define CPUIDLE_CACHE_BUSY (1)
+#define CPUIDLE_DIFF_CPU (2)
+#define CPUIDLE_THREAD_BUSY (4)
@@ -1167,6 +1189,9 @@
+ * Other node, other CPU, idle cache, idle threads.
+ * Other node, other CPU, busy cache, idle threads.
+ * Other node, other CPU, busy threads.
++ *
++ * If p was the last task running on this rq, then regardless of where
++ * it has been running since then, it is cache warm on this rq.
+ */
+static void resched_best_idle(struct task_struct *p)
+{
@@ -1199,11 +1224,14 @@
+ tmp_rq = cpu_rq(cpu_tmp);
+
+ if (rq->cpu_locality[cpu_tmp]) {
++ /* Check rq->last_task hasn't been dereferenced */
++ if (rq->last_task && p != rq->last_task) {
+#ifdef CONFIG_NUMA
-+ if (rq->cpu_locality[cpu_tmp] > 1)
-+ ranking |= CPUIDLE_DIFF_NODE;
++ if (rq->cpu_locality[cpu_tmp] > 1)
++ ranking |= CPUIDLE_DIFF_NODE;
+#endif
-+ ranking |= CPUIDLE_DIFF_CPU;
++ ranking |= CPUIDLE_DIFF_CPU;
++ }
+ }
+#ifdef CONFIG_SCHED_MC
+ if (!(tmp_rq->cache_idle(cpu_tmp)))
@@ -1245,6 +1273,11 @@
+static inline int
+cache_distance(struct rq *task_rq, struct rq *rq, struct task_struct *p)
+{
++ /* Check rq->last_task hasn't been dereferenced */
++ if (likely(rq->last_task)) {
++ if (rq->last_task == p)
++ return 0;
++ }
+ return rq->cpu_locality[cpu_of(task_rq)] * task_timeslice(p);
+}
+#else /* CONFIG_SMP */
@@ -1283,6 +1316,10 @@
+{
+ return 0;
+}
++
++static inline void set_last_task(struct rq *rq, struct task_struct *p)
++{
++}
+#endif /* CONFIG_SMP */
+
+/*
@@ -1330,7 +1367,7 @@
+ */
+static void activate_task(struct task_struct *p, struct rq *rq)
+{
-+ update_rq_clock(rq);
++ update_clocks(rq);
+
+ /*
+ * Sleep time is in units of nanosecs, so shift by 20 to get a
@@ -1600,8 +1637,28 @@
+#endif
+
+#define rq_idle(rq) ((rq)->rq_prio == PRIO_LIMIT)
-+#define task_idle(p) ((p)->prio == PRIO_LIMIT)
+
++/*
++ * RT tasks preempt purely on priority. SCHED_NORMAL tasks preempt on the
++ * basis of earlier deadlines. SCHED_IDLEPRIO don't preempt anything else or
++ * between themselves, they cooperatively multitask. An idle rq scores as
++ * prio PRIO_LIMIT so it is always preempted.
++ */
++static inline int
++can_preempt(struct task_struct *p, int prio, unsigned long deadline,
++ unsigned int policy)
++{
++ /* Better static priority RT task or better policy preemption */
++ if (p->prio < prio)
++ return 1;
++ if (p->prio > prio)
++ return 0;
++ /* SCHED_NORMAL, BATCH and ISO will preempt based on deadline */
++ if (!deadline_before(p->deadline, deadline))
++ return 0;
++ return 1;
++}
++#ifdef CONFIG_SMP
+#ifdef CONFIG_HOTPLUG_CPU
+/*
+ * Check to see if there is a task that is affined only to offline CPUs but
@@ -1621,14 +1678,20 @@
+#endif
+
+/*
-+ * RT tasks preempt purely on priority. SCHED_NORMAL tasks preempt on the
-+ * basis of earlier deadlines. SCHED_BATCH, ISO and IDLEPRIO don't preempt
-+ * between themselves, they cooperatively multitask. An idle rq scores as
-+ * prio PRIO_LIMIT so it is always preempted. latest_deadline and
-+ * highest_prio_rq are initialised only to silence the compiler. When
-+ * all else is equal, still prefer this_rq.
++ * Check to see if p can run on cpu, and if not, whether there are any online
++ * CPUs it can run on instead.
++ */
++static inline int needs_other_cpu(struct task_struct *p, int cpu)
++{
++ if (unlikely(!cpu_isset(cpu, p->cpus_allowed) && online_cpus(p)))
++ return 1;
++ return 0;
++}
++
++/*
++ * latest_deadline and highest_prio_rq are initialised only to silence the
++ * compiler. When all else is equal, still prefer this_rq.
+ */
-+#ifdef CONFIG_SMP
+static void try_preempt(struct task_struct *p, struct rq *this_rq)
+{
+ struct rq *highest_prio_rq = this_rq;
@@ -1636,6 +1699,10 @@
+ int highest_prio;
+ cpumask_t tmp;
+
++ /* IDLEPRIO tasks never preempt anything */
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel-desktop/kernel-desktop-sched-bfs.patch?r1=1.1.2.20&r2=1.1.2.21&f=u
More information about the pld-cvs-commit
mailing list