This patch 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 <[EMAIL PROTECTED]>
-----

---
 arch/powerpc/platforms/pseries/phyp_dump.c |   36 +++++++++++++++++++++++++++++
 include/asm-powerpc/phyp_dump.h            |    3 ++
 2 files changed, 39 insertions(+)

Index: 2.6.24-rc5/include/asm-powerpc/phyp_dump.h
===================================================================
--- 2.6.24-rc5.orig/include/asm-powerpc/phyp_dump.h     2008-01-07 
22:55:28.000000000 -0600
+++ 2.6.24-rc5/include/asm-powerpc/phyp_dump.h  2008-01-07 22:58:02.000000000 
-0600
@@ -24,6 +24,9 @@ struct phyp_dump {
        /* Memory that is reserved during very early boot. */
        unsigned long init_reserve_start;
        unsigned long init_reserve_size;
+       /* Scratch area memory details */
+       unsigned long scratch_reserve_start;
+       unsigned long scratch_reserve_size;
 };
 
 extern struct phyp_dump *phyp_dump_info;
Index: 2.6.24-rc5/arch/powerpc/platforms/pseries/phyp_dump.c
===================================================================
--- 2.6.24-rc5.orig/arch/powerpc/platforms/pseries/phyp_dump.c  2008-01-07 
22:57:27.000000000 -0600
+++ 2.6.24-rc5/arch/powerpc/platforms/pseries/phyp_dump.c       2008-01-07 
22:58:02.000000000 -0600
@@ -287,6 +287,39 @@ release_memory_range(unsigned long start
        }
 }
 
+/**
+ * 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->scratch_reserve_start) &&
+           (addr <= phyp_dump_info->scratch_reserve_start +
+            phyp_dump_info->scratch_reserve_size))
+               scratch_area_size += length;
+
+       if ((reserved_area_size == phyp_dump_info->init_reserve_start) &&
+           (scratch_area_size == phyp_dump_info->scratch_reserve_size)) {
+
+               invalidate_last_dump(&phdr,
+                               phyp_dump_info->scratch_reserve_start);
+               register_dump_area (&phdr,
+                               phyp_dump_info->scratch_reserve_start);
+       }
+}
+
 /* ------------------------------------------------- */
 /**
  * sysfs_release_region -- sysfs interface to release memory range.
@@ -310,6 +343,8 @@ store_release_region(struct kset *kset, 
        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)
@@ -414,6 +449,7 @@ static int __init phyp_dump_setup(void)
        }
 
        /* Don't allow user to release the 256MB scratch area */
+       /* this might be wrong */
        phyp_dump_info->init_reserve_size = free_area_length;
 
        /* Should we create a dump_subsys, analogous to s390/ipl.c ? */
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to