Re: [PATCH 03/16 v3] powerpc: Add memory entitlement capabilities to /proc/ppc64/lparcfg

2008-07-22 Thread Nathan Fontenot

Updated patch, increment the lparcfg module version number.

Update /proc/ppc64/lparcfg to enable displaying of Cooperative Memory
Overcommitment statistics as reported by the H_GET_MPP hcall.  This also
updates the lparcfg interface to allow setting memory entitlement and
weight.

Signed-off-by: Nathan Fontenot <[EMAIL PROTECTED]>
Signed-off-by: Robert Jennings <[EMAIL PROTECTED]>

---
arch/powerpc/kernel/lparcfg.c |  119 ++
include/asm-powerpc/hvcall.h  |   18 ++
2 files changed, 136 insertions(+), 1 deletion(-)

Index: linux-2.6.git/arch/powerpc/kernel/lparcfg.c
===
--- linux-2.6.git.orig/arch/powerpc/kernel/lparcfg.c2008-07-22 
12:50:47.0 -0500
+++ linux-2.6.git/arch/powerpc/kernel/lparcfg.c 2008-07-22 13:16:58.0 
-0500
@@ -35,7 +35,7 @@
#include 
#include 

-#define MODULE_VERS "1.7"
+#define MODULE_VERS "1.8"
#define MODULE_NAME "lparcfg"

/* #define LPARCFG_DEBUG */
@@ -129,6 +129,35 @@
/*
 * Methods used to fetch LPAR data when running on a pSeries platform.
 */
+/**
+ * h_get_mpp
+ * H_GET_MPP hcall returns info in 7 parms
+ */
+int h_get_mpp(struct hvcall_mpp_data *mpp_data)
+{
+   int rc;
+   unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
+
+   rc = plpar_hcall9(H_GET_MPP, retbuf);
+
+   mpp_data->entitled_mem = retbuf[0];
+   mpp_data->mapped_mem = retbuf[1];
+
+   mpp_data->group_num = (retbuf[2] >> 2 * 8) & 0x;
+   mpp_data->pool_num = retbuf[2] & 0x;
+
+   mpp_data->mem_weight = (retbuf[3] >> 7 * 8) & 0xff;
+   mpp_data->unallocated_mem_weight = (retbuf[3] >> 6 * 8) & 0xff;
+   mpp_data->unallocated_entitlement = retbuf[3] & 0x;
+
+   mpp_data->pool_size = retbuf[4];
+   mpp_data->loan_request = retbuf[5];
+   mpp_data->backing_mem = retbuf[6];
+
+   return rc;
+}
+EXPORT_SYMBOL(h_get_mpp);
+
/*
 * H_GET_PPP hcall returns info in 4 parms.
 *  entitled_capacity,unallocated_capacity,
@@ -224,6 +253,44 @@
seq_printf(m, "unallocated_capacity=%ld\n", h_unallocated);
}

+/**
+ * parse_mpp_data
+ * Parse out data returned from h_get_mpp
+ */
+static void parse_mpp_data(struct seq_file *m)
+{
+   struct hvcall_mpp_data mpp_data;
+   int rc;
+
+   rc = h_get_mpp(&mpp_data);
+   if (rc)
+   return;
+
+   seq_printf(m, "entitled_memory=%ld\n", mpp_data.entitled_mem);
+
+   if (mpp_data.mapped_mem != -1)
+   seq_printf(m, "mapped_entitled_memory=%ld\n",
+  mpp_data.mapped_mem);
+
+   seq_printf(m, "entitled_memory_group_number=%d\n", mpp_data.group_num);
+   seq_printf(m, "entitled_memory_pool_number=%d\n", mpp_data.pool_num);
+
+   seq_printf(m, "entitled_memory_weight=%d\n", mpp_data.mem_weight);
+   seq_printf(m, "unallocated_entitled_memory_weight=%d\n",
+  mpp_data.unallocated_mem_weight);
+   seq_printf(m, "unallocated_io_mapping_entitlement=%ld\n",
+  mpp_data.unallocated_entitlement);
+
+   if (mpp_data.pool_size != -1)
+   seq_printf(m, "entitled_memory_pool_size=%ld bytes\n",
+  mpp_data.pool_size);
+
+   seq_printf(m, "entitled_memory_loan_request=%ld\n",
+  mpp_data.loan_request);
+
+   seq_printf(m, "backing_memory=%ld bytes\n", mpp_data.backing_mem);
+}
+
#define SPLPAR_CHARACTERISTICS_TOKEN 20
#define SPLPAR_MAXLENGTH 1026*(sizeof(char))

@@ -351,6 +418,7 @@
/* this call handles the ibm,get-system-parameter contents */
parse_system_parameter_string(m);
parse_ppp_data(m);
+   parse_mpp_data(m);

seq_printf(m, "purr=%ld\n", get_purr());
} else {/* non SPLPAR case */
@@ -414,6 +482,43 @@
return retval;
}

+/**
+ * update_mpp
+ *
+ * Update the memory entitlement and weight for the partition.  Caller must
+ * specify either a new entitlement or weight, not both, to be updated
+ * since the h_set_mpp call takes both entitlement and weight as parameters.
+ */
+static ssize_t update_mpp(u64 *entitlement, u8 *weight)
+{
+   struct hvcall_mpp_data mpp_data;
+   u64 new_entitled;
+   u8 new_weight;
+   ssize_t rc;
+
+   rc = h_get_mpp(&mpp_data);
+   if (rc)
+   return rc;
+
+   if (entitlement) {
+   new_weight = mpp_data.mem_weight;
+   new_entitled = *entitlement;
+   } else if (weight) {
+   new_weight = *weight;
+   new_entitled = mpp_data.entitled_mem;
+   } else
+   return -EINVAL;
+
+   pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
+__FUNCTION__, mpp_data.entitled_mem, mpp_data.mem_weight);
+
+   pr_debug("%s: new_entitled = %lu, new_weight = %u\n",
+__FUNCTION__, new_entitled, new_weight);
+
+   rc = plpar_hcall_norets(H_SET_MPP

[PATCH 03/16 v3] powerpc: Add memory entitlement capabilities to /proc/ppc64/lparcfg

2008-07-04 Thread Robert Jennings
From: Nathan Fontenot <[EMAIL PROTECTED]>

Update /proc/ppc64/lparcfg to enable displaying of Cooperative Memory
Overcommitment statistics as reported by the H_GET_MPP hcall.  This also
updates the lparcfg interface to allow setting memory entitlement and
weight.

Signed-off-by: Nathan Fontenot <[EMAIL PROTECTED]>
Signed-off-by: Robert Jennings <[EMAIL PROTECTED]>

---
 arch/powerpc/kernel/lparcfg.c |  119 ++
 include/asm-powerpc/hvcall.h  |   18 ++
 2 files changed, 136 insertions(+), 1 deletion(-)

Index: b/arch/powerpc/kernel/lparcfg.c
===
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/kernel/lparcfg.c
@@ -129,6 +129,35 @@ static int iseries_lparcfg_data(struct s
 /*
  * Methods used to fetch LPAR data when running on a pSeries platform.
  */
+/**
+ * h_get_mpp
+ * H_GET_MPP hcall returns info in 7 parms
+ */
+int h_get_mpp(struct hvcall_mpp_data *mpp_data)
+{
+   int rc;
+   unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
+
+   rc = plpar_hcall9(H_GET_MPP, retbuf);
+
+   mpp_data->entitled_mem = retbuf[0];
+   mpp_data->mapped_mem = retbuf[1];
+
+   mpp_data->group_num = (retbuf[2] >> 2 * 8) & 0x;
+   mpp_data->pool_num = retbuf[2] & 0x;
+
+   mpp_data->mem_weight = (retbuf[3] >> 7 * 8) & 0xff;
+   mpp_data->unallocated_mem_weight = (retbuf[3] >> 6 * 8) & 0xff;
+   mpp_data->unallocated_entitlement = retbuf[3] & 0x;
+
+   mpp_data->pool_size = retbuf[4];
+   mpp_data->loan_request = retbuf[5];
+   mpp_data->backing_mem = retbuf[6];
+
+   return rc;
+}
+EXPORT_SYMBOL(h_get_mpp);
+
 /*
  * H_GET_PPP hcall returns info in 4 parms.
  *  entitled_capacity,unallocated_capacity,
@@ -226,6 +255,44 @@ static void parse_ppp_data(struct seq_fi
seq_printf(m, "unallocated_capacity=%ld\n", h_unallocated);
 }
 
+/**
+ * parse_mpp_data
+ * Parse out data returned from h_get_mpp
+ */
+static void parse_mpp_data(struct seq_file *m)
+{
+   struct hvcall_mpp_data mpp_data;
+   int rc;
+
+   rc = h_get_mpp(&mpp_data);
+   if (rc)
+   return;
+
+   seq_printf(m, "entitled_memory=%ld\n", mpp_data.entitled_mem);
+
+   if (mpp_data.mapped_mem != -1)
+   seq_printf(m, "mapped_entitled_memory=%ld\n",
+  mpp_data.mapped_mem);
+
+   seq_printf(m, "entitled_memory_group_number=%d\n", mpp_data.group_num);
+   seq_printf(m, "entitled_memory_pool_number=%d\n", mpp_data.pool_num);
+
+   seq_printf(m, "entitled_memory_weight=%d\n", mpp_data.mem_weight);
+   seq_printf(m, "unallocated_entitled_memory_weight=%d\n",
+  mpp_data.unallocated_mem_weight);
+   seq_printf(m, "unallocated_io_mapping_entitlement=%ld\n",
+  mpp_data.unallocated_entitlement);
+
+   if (mpp_data.pool_size != -1)
+   seq_printf(m, "entitled_memory_pool_size=%ld bytes\n",
+  mpp_data.pool_size);
+
+   seq_printf(m, "entitled_memory_loan_request=%ld\n",
+  mpp_data.loan_request);
+
+   seq_printf(m, "backing_memory=%ld bytes\n", mpp_data.backing_mem);
+}
+
 #define SPLPAR_CHARACTERISTICS_TOKEN 20
 #define SPLPAR_MAXLENGTH 1026*(sizeof(char))
 
@@ -353,6 +420,7 @@ static int pseries_lparcfg_data(struct s
/* this call handles the ibm,get-system-parameter contents */
parse_system_parameter_string(m);
parse_ppp_data(m);
+   parse_mpp_data(m);
 
seq_printf(m, "purr=%ld\n", get_purr());
} else {/* non SPLPAR case */
@@ -416,6 +484,43 @@ static ssize_t update_ppp(u64 *entitleme
return retval;
 }
 
+/**
+ * update_mpp
+ *
+ * Update the memory entitlement and weight for the partition.  Caller must
+ * specify either a new entitlement or weight, not both, to be updated
+ * since the h_set_mpp call takes both entitlement and weight as parameters.
+ */
+static ssize_t update_mpp(u64 *entitlement, u8 *weight)
+{
+   struct hvcall_mpp_data mpp_data;
+   u64 new_entitled;
+   u8 new_weight;
+   ssize_t rc;
+
+   rc = h_get_mpp(&mpp_data);
+   if (rc)
+   return rc;
+
+   if (entitlement) {
+   new_weight = mpp_data.mem_weight;
+   new_entitled = *entitlement;
+   } else if (weight) {
+   new_weight = *weight;
+   new_entitled = mpp_data.entitled_mem;
+   } else
+   return -EINVAL;
+
+   pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
+__FUNCTION__, mpp_data.entitled_mem, mpp_data.mem_weight);
+
+   pr_debug("%s: new_entitled = %lu, new_weight = %u\n",
+__FUNCTION__, new_entitled, new_weight);
+
+   rc = plpar_hcall_norets(H_SET_MPP, new_entitled, new_weight);
+   return rc;
+}
+
 /*
  * Interface for changing system parameters (varia