Magellan Linux

Annotation of /trunk/kernel26-magellan/patches-2.6.21-r1/0014-2.6.21-mm-kswapd_inherit_prio-1.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 196 - (hide annotations) (download)
Thu May 17 23:20:52 2007 UTC (17 years ago) by niro
File size: 3797 byte(s)
-ver bump to 2.6.21-r1 using:
-linux-2.6.21.1
-2.6.21-ck2 patchset
-fbsplash-0.9.2-r5
-vesafb-tng-1.0-rc2
-squashfs-3.2-r2
-unionfs-2.0-u2
-suspend2-2.2.9.17
-linux-phc-0.2.10
-acpi-dsdt-0.8.4
-fuse-2.6.5
-reiser4-mm
-nvidia-drivers-1.0.9755
-ati-drivers-8.36.5
-ipw3945-1.2.1
- added a fix for sis900 oops on linux-2.6.21

1 niro 196 When kswapd is awoken due to reclaim by a running task, set the priority of
2     kswapd to that of the calling task thus making memory reclaim cpu activity
3     affected by nice level.
4    
5     Signed-off-by: Con Kolivas <kernel@kolivas.org>
6    
7     include/linux/mmzone.h | 2 +-
8     mm/page_alloc.c | 2 +-
9     mm/vmscan.c | 36 ++++++++++++++++++++++++++++++++++--
10     3 files changed, 36 insertions(+), 4 deletions(-)
11    
12     Index: linux-2.6.21-ck2/include/linux/mmzone.h
13     ===================================================================
14     --- linux-2.6.21-ck2.orig/include/linux/mmzone.h 2007-05-14 19:49:55.000000000 +1000
15     +++ linux-2.6.21-ck2/include/linux/mmzone.h 2007-05-14 19:49:55.000000000 +1000
16     @@ -465,7 +465,7 @@ typedef struct pglist_data {
17     void get_zone_counts(unsigned long *active, unsigned long *inactive,
18     unsigned long *free);
19     void build_all_zonelists(void);
20     -void wakeup_kswapd(struct zone *zone, int order);
21     +void wakeup_kswapd(struct zone *zone, int order, struct task_struct *p);
22     int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
23     int classzone_idx, int alloc_flags);
24     enum memmap_context {
25     Index: linux-2.6.21-ck2/mm/page_alloc.c
26     ===================================================================
27     --- linux-2.6.21-ck2.orig/mm/page_alloc.c 2007-05-14 19:49:55.000000000 +1000
28     +++ linux-2.6.21-ck2/mm/page_alloc.c 2007-05-14 19:49:55.000000000 +1000
29     @@ -1277,7 +1277,7 @@ restart:
30     goto nopage;
31    
32     for (z = zonelist->zones; *z; z++)
33     - wakeup_kswapd(*z, order);
34     + wakeup_kswapd(*z, order, p);
35    
36     /*
37     * OK, we're below the kswapd watermark and have kicked background
38     Index: linux-2.6.21-ck2/mm/vmscan.c
39     ===================================================================
40     --- linux-2.6.21-ck2.orig/mm/vmscan.c 2007-05-14 19:49:55.000000000 +1000
41     +++ linux-2.6.21-ck2/mm/vmscan.c 2007-05-14 19:49:55.000000000 +1000
42     @@ -966,6 +966,34 @@ static unsigned long shrink_zone(int pri
43     }
44    
45     /*
46     + * Helper functions to adjust nice level of kswapd, based on the priority of
47     + * the task (p) that called it. If it is already higher priority we do not
48     + * demote its nice level since it is still working on behalf of a higher
49     + * priority task. With kernel threads we leave it at nice 0.
50     + *
51     + * We don't ever run kswapd real time, so if a real time task calls kswapd we
52     + * set it to highest SCHED_NORMAL priority.
53     + */
54     +static int effective_sc_prio(struct task_struct *p)
55     +{
56     + if (likely(p->mm)) {
57     + if (rt_task(p))
58     + return -20;
59     + return task_nice(p);
60     + }
61     + return 0;
62     +}
63     +
64     +static void set_kswapd_nice(struct task_struct *kswapd, struct task_struct *p,
65     + int active)
66     +{
67     + long nice = effective_sc_prio(p);
68     +
69     + if (task_nice(kswapd) > nice || !active)
70     + set_user_nice(kswapd, nice);
71     +}
72     +
73     +/*
74     * This is the direct reclaim path, for page-allocating processes. We only
75     * try to reclaim pages from zones which will satisfy the caller's allocation
76     * request.
77     @@ -1355,6 +1383,7 @@ static int kswapd(void *p)
78     */
79     order = new_order;
80     } else {
81     + set_user_nice(tsk, 0);
82     schedule();
83     order = pgdat->kswapd_max_order;
84     }
85     @@ -1368,9 +1397,10 @@ static int kswapd(void *p)
86     /*
87     * A zone is low on free memory, so wake its kswapd task to service it.
88     */
89     -void wakeup_kswapd(struct zone *zone, int order)
90     +void wakeup_kswapd(struct zone *zone, int order, struct task_struct *p)
91     {
92     pg_data_t *pgdat;
93     + int active;
94    
95     if (!populated_zone(zone))
96     return;
97     @@ -1382,7 +1412,9 @@ void wakeup_kswapd(struct zone *zone, in
98     pgdat->kswapd_max_order = order;
99     if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
100     return;
101     - if (!waitqueue_active(&pgdat->kswapd_wait))
102     + active = waitqueue_active(&pgdat->kswapd_wait);
103     + set_kswapd_nice(pgdat->kswapd, p, active);
104     + if (!active)
105     return;
106     wake_up_interruptible(&pgdat->kswapd_wait);
107     }