This patch applies against 2.6.11-rc5 + patchset CKRM + patchset for CKRM
Memory Controller posted on ckrm-tech:
- use of spin_lock_irq and spin_lock_irqsave to fix deadlocks on
ckrm_mem_lock.
- kswapd goes sometimes into loop and consumes 100% of cpu. The patch
also fix this problem.
regards,
Valerie
diff -rupN linux-2.6.11-rc5+ckrm.orig/kernel/ckrm/ckrm_memcore.c
linux-2.6.11-rc5+ckrm/kernel/ckrm/ckrm_memcore.c
--- linux-2.6.11-rc5+ckrm.orig/kernel/ckrm/ckrm_memcore.c 2005-03-16
09:25:12.000000000 +0100
+++ linux-2.6.11-rc5+ckrm/kernel/ckrm/ckrm_memcore.c 2005-03-16
15:32:39.000000000 +0100
@@ -182,9 +182,9 @@ mem_res_alloc(struct ckrm_core_class *co
mem_res_initcls_one(res);
res->core = core;
res->parent = parent;
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irq(&ckrm_mem_lock);
list_add(&res->mcls_list, &ckrm_memclass_list);
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irq(&ckrm_mem_lock);
if (parent == NULL) {
/* I am the root class. So, set the max to *
* number of pages available in the system */
@@ -328,9 +328,9 @@ mem_res_free(void *my_res)
res->pg_limit = 0;
res->pg_unused = 0;
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irq(&ckrm_mem_lock);
list_del_init(&res->mcls_list);
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irq(&ckrm_mem_lock);
res->core = NULL;
res->parent = NULL;
diff -rupN linux-2.6.11-rc5+ckrm.orig/kernel/ckrm/ckrm_memctlr.c
linux-2.6.11-rc5+ckrm/kernel/ckrm/ckrm_memctlr.c
--- linux-2.6.11-rc5+ckrm.orig/kernel/ckrm/ckrm_memctlr.c 2005-03-16
09:25:12.000000000 +0100
+++ linux-2.6.11-rc5+ckrm/kernel/ckrm/ckrm_memctlr.c 2005-03-16
15:35:36.000000000 +0100
@@ -377,7 +377,7 @@ shrink_get_victims(struct zone *zone, un
}
return;
}
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irq(&ckrm_mem_lock);
list_for_each_entry(cls, &ckrm_memclass_list, mcls_list) {
czone = cls->ckrm_zone + zoneindex;
if (ckrm_test_set_shrink(czone))
@@ -398,7 +398,7 @@ shrink_get_victims(struct zone *zone, un
pos = pos->next;
}
shrink_choose_victims(victims, nr_active, nr_inactive);
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irq(&ckrm_mem_lock);
pos = victims->next;
while (pos != victims) {
czone = list_entry(pos, struct ckrm_zone, victim_list);
@@ -413,6 +413,7 @@ ckrm_shrink_atlimit(struct ckrm_mem_res
struct zone *zone;
unsigned long now = jiffies;
int order;
+ unsigned long flags;
if (!cls || (cls->pg_limit == CKRM_SHARE_DONTCARE) ||
((cls->flags & CLS_AT_LIMIT) == CLS_AT_LIMIT)) {
@@ -427,9 +428,9 @@ ckrm_shrink_atlimit(struct ckrm_mem_res
if (cls->shrink_count > ckrm_mem_shrink_count) {
return;
}
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irqsave(&ckrm_mem_lock,flags);
list_add(&cls->shrink_list, &ckrm_shrink_list);
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irqrestore(&ckrm_mem_lock,flags);
cls->flags |= CLS_AT_LIMIT;
for_each_zone(zone) {
/* This is just a number to get to wakeup kswapd */
diff -rupN linux-2.6.11-rc5+ckrm.orig/mm/vmscan.c
linux-2.6.11-rc5+ckrm/mm/vmscan.c
--- linux-2.6.11-rc5+ckrm.orig/mm/vmscan.c 2005-03-16 09:25:12.000000000
+0100
+++ linux-2.6.11-rc5+ckrm/mm/vmscan.c 2005-03-22 15:08:10.000000000 +0100
@@ -914,17 +914,17 @@ ckrm_shrink_classes(void)
{
struct ckrm_mem_res *cls;
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irq(&ckrm_mem_lock);
while (!ckrm_shrink_list_empty()) {
cls = list_entry(ckrm_shrink_list.next, struct ckrm_mem_res,
shrink_list);
list_del(&cls->shrink_list);
- cls->flags &= ~CLS_AT_LIMIT;
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irq(&ckrm_mem_lock);
ckrm_shrink_class(cls);
- spin_lock(&ckrm_mem_lock);
+ spin_lock_irq(&ckrm_mem_lock);
+ cls->flags &= ~CLS_AT_LIMIT;
}
- spin_unlock(&ckrm_mem_lock);
+ spin_unlock_irq(&ckrm_mem_lock);
}
#else
@@ -1224,7 +1224,8 @@ scan:
if (nr_pages == 0) { /* Not software suspend */
if (!zone_watermark_ok(zone, order,
- zone->pages_high, end_zone, 0, 0))
+ zone->pages_high, end_zone, 0, 0) &&
+ ckrm_shrink_list_empty())
all_zones_ok = 0;
}
zone->temp_priority = priority;
-------------------------------------------------------
This SF.net email is sponsored by: 2005 Windows Mobile Application Contest
Submit applications for Windows Mobile(tm)-based Pocket PCs or Smartphones
for the chance to win $25,000 and application distribution. Enter today at
http://ads.osdn.com/?ad_id=6882&alloc_id=15148&op=click
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech