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

Reply via email to