[POWERPC] pseries: phyp dump: Tracking memory range freed
authorManish Ahuja <ahuja@austin.ibm.com>
Fri, 21 Mar 2008 23:47:04 +0000 (10:47 +1100)
committerPaul Mackerras <paulus@samba.org>
Tue, 25 Mar 2008 21:44:07 +0000 (08:44 +1100)
This tracks the size freed.  For now it does a simple rudimentary
calculation of the ranges freed.  The idea is to keep it simple at the
external shell script level and send in large chunks for now.

Signed-off-by: Manish Ahuja <mahuja@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/pseries/phyp_dump.c

index df4870ec90d8d91c088a0b9b9b666c9e3548897e..034fe1b54dd9b829214bac48f4639907dfb9f293 100644 (file)
@@ -261,6 +261,39 @@ static void release_memory_range(unsigned long start_pfn,
        }
 }
 
+/**
+ * track_freed_range -- Counts the range being freed.
+ * Once the counter goes to zero, it re-registers dump for
+ * future use.
+ */
+static void
+track_freed_range(unsigned long addr, unsigned long length)
+{
+       static unsigned long scratch_area_size, reserved_area_size;
+
+       if (addr < phyp_dump_info->init_reserve_start)
+               return;
+
+       if ((addr >= phyp_dump_info->init_reserve_start) &&
+           (addr <= phyp_dump_info->init_reserve_start +
+            phyp_dump_info->init_reserve_size))
+               reserved_area_size += length;
+
+       if ((addr >= phyp_dump_info->reserved_scratch_addr) &&
+           (addr <= phyp_dump_info->reserved_scratch_addr +
+            phyp_dump_info->reserved_scratch_size))
+               scratch_area_size += length;
+
+       if ((reserved_area_size == phyp_dump_info->init_reserve_size) &&
+           (scratch_area_size == phyp_dump_info->reserved_scratch_size)) {
+
+               invalidate_last_dump(&phdr,
+                               phyp_dump_info->reserved_scratch_addr);
+               register_dump_area(&phdr,
+                               phyp_dump_info->reserved_scratch_addr);
+       }
+}
+
 /* ------------------------------------------------- */
 /**
  * sysfs_release_region -- sysfs interface to release memory range.
@@ -285,6 +318,8 @@ static ssize_t store_release_region(struct kobject *kobj,
        if (ret != 2)
                return -EINVAL;
 
+       track_freed_range(start_addr, length);
+
        /* Range-check - don't free any reserved memory that
         * wasn't reserved for phyp-dump */
        if (start_addr < phyp_dump_info->init_reserve_start)