From: Nathan Fotenot <[EMAIL PROTECTED]>

Split the retreival and setting of processor entitlement and weight into
helper routines.

Signed-off-by: Nathan Fotenot <[EMAIL PROTECTED]>

---
 arch/powerpc/kernel/lparcfg.c |  163 ++++++++++++++++++++++--------------------
 1 file changed, 86 insertions(+), 77 deletions(-)

Index: b/arch/powerpc/kernel/lparcfg.c
===================================================================
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/kernel/lparcfg.c
@@ -167,7 +167,8 @@ static unsigned int h_get_ppp(unsigned l
        return rc;
 }
 
-static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
+static unsigned int h_pic(unsigned long *pool_idle_time,
+                         unsigned long *num_procs)
 {
        unsigned long rc;
        unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
@@ -176,6 +177,53 @@ static void h_pic(unsigned long *pool_id
 
        *pool_idle_time = retbuf[0];
        *num_procs = retbuf[1];
+
+       return rc;
+}
+
+/*
+ * parse_ppp_data
+ * Parse out the data returned from h_get_ppp and h_pic
+ */
+static void parse_ppp_data(struct seq_file *m)
+{
+       unsigned long h_entitled, h_unallocated;
+       unsigned long h_aggregation, h_resource;
+       int rc;
+
+       rc = h_get_ppp(&h_entitled, &h_unallocated, &h_aggregation,
+                      &h_resource);
+       if (rc)
+               return;
+
+       seq_printf(m, "partition_entitled_capacity=%ld\n", h_entitled);
+       seq_printf(m, "group=%ld\n", (h_aggregation >> 2 * 8) & 0xffff);
+       seq_printf(m, "system_active_processors=%ld\n",
+                  (h_resource >> 0 * 8) & 0xffff);
+
+       /* pool related entries are apropriate for shared configs */
+       if (lppaca[0].shared_proc) {
+               unsigned long pool_idle_time, pool_procs;
+
+               seq_printf(m, "pool=%ld\n", (h_aggregation >> 0 * 8) & 0xffff);
+
+               /* report pool_capacity in percentage */
+               seq_printf(m, "pool_capacity=%ld\n",
+                          ((h_resource >> 2 * 8) & 0xffff) * 100);
+
+               rc = h_pic(&pool_idle_time, &pool_procs);
+               if (! rc) {
+                       seq_printf(m, "pool_idle_time=%ld\n", pool_idle_time);
+                       seq_printf(m, "pool_num_procs=%ld\n", pool_procs);
+               }
+       }
+
+       seq_printf(m, "unallocated_capacity_weight=%ld\n",
+                  (h_resource >> 4 * 8) & 0xFF);
+
+       seq_printf(m, "capacity_weight=%ld\n", (h_resource >> 5 * 8) & 0xFF);
+       seq_printf(m, "capped=%ld\n", (h_resource >> 6 * 8) & 0x01);
+       seq_printf(m, "unallocated_capacity=%ld\n", h_unallocated);
 }
 
 #define SPLPAR_CHARACTERISTICS_TOKEN 20
@@ -302,59 +350,11 @@ static int pseries_lparcfg_data(struct s
        partition_active_processors = lparcfg_count_active_processors();
 
        if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
-               unsigned long h_entitled, h_unallocated;
-               unsigned long h_aggregation, h_resource;
-               unsigned long pool_idle_time, pool_procs;
-               unsigned long purr;
-
-               h_get_ppp(&h_entitled, &h_unallocated, &h_aggregation,
-                         &h_resource);
-
-               seq_printf(m, "R4=0x%lx\n", h_entitled);
-               seq_printf(m, "R5=0x%lx\n", h_unallocated);
-               seq_printf(m, "R6=0x%lx\n", h_aggregation);
-               seq_printf(m, "R7=0x%lx\n", h_resource);
-
-               purr = get_purr();
-
                /* this call handles the ibm,get-system-parameter contents */
                parse_system_parameter_string(m);
+               parse_ppp_data(m);
 
-               seq_printf(m, "partition_entitled_capacity=%ld\n", h_entitled);
-
-               seq_printf(m, "group=%ld\n", (h_aggregation >> 2 * 8) & 0xffff);
-
-               seq_printf(m, "system_active_processors=%ld\n",
-                          (h_resource >> 0 * 8) & 0xffff);
-
-               /* pool related entries are apropriate for shared configs */
-               if (lppaca[0].shared_proc) {
-
-                       h_pic(&pool_idle_time, &pool_procs);
-
-                       seq_printf(m, "pool=%ld\n",
-                                  (h_aggregation >> 0 * 8) & 0xffff);
-
-                       /* report pool_capacity in percentage */
-                       seq_printf(m, "pool_capacity=%ld\n",
-                                  ((h_resource >> 2 * 8) & 0xffff) * 100);
-
-                       seq_printf(m, "pool_idle_time=%ld\n", pool_idle_time);
-
-                       seq_printf(m, "pool_num_procs=%ld\n", pool_procs);
-               }
-
-               seq_printf(m, "unallocated_capacity_weight=%ld\n",
-                          (h_resource >> 4 * 8) & 0xFF);
-
-               seq_printf(m, "capacity_weight=%ld\n",
-                          (h_resource >> 5 * 8) & 0xFF);
-
-               seq_printf(m, "capped=%ld\n", (h_resource >> 6 * 8) & 0x01);
-
-               seq_printf(m, "unallocated_capacity=%ld\n", h_unallocated);
-
-               seq_printf(m, "purr=%ld\n", purr);
+               seq_printf(m, "purr=%ld\n", get_purr());
 
        } else {                /* non SPLPAR case */
 
@@ -382,6 +382,37 @@ static int pseries_lparcfg_data(struct s
        return 0;
 }
 
+static ssize_t update_ppp(u64 *new_entitled, u8 *new_weight)
+{
+       unsigned long current_entitled;
+       unsigned long dummy;
+       unsigned long resource;
+       u8 current_weight;
+       ssize_t retval;
+
+       /* Get our current parameters */
+       retval = h_get_ppp(&current_entitled, &dummy, &dummy, &resource);
+       if (retval)
+               return retval;
+
+       current_weight = (resource >> 5 * 8) & 0xFF;
+
+       if (new_entitled)
+               *new_weight = current_weight;
+
+       if (new_weight)
+               *new_entitled = current_entitled;
+
+       pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
+                __FUNCTION__, current_entitled, current_weight);
+
+       pr_debug("%s: new_entitled = %lu, new_weight = %u\n",
+                __FUNCTION__, *new_entitled, *new_weight);
+
+       retval = plpar_hcall_norets(H_SET_PPP, *new_entitled, *new_weight);
+       return retval;
+}
+
 /*
  * Interface for changing system parameters (variable capacity weight
  * and entitled capacity).  Format of input is "param_name=value";
@@ -399,12 +430,6 @@ static ssize_t lparcfg_write(struct file
        char *tmp;
        u64 new_entitled, *new_entitled_ptr = &new_entitled;
        u8 new_weight, *new_weight_ptr = &new_weight;
-
-       unsigned long current_entitled; /* parameters for h_get_ppp */
-       unsigned long dummy;
-       unsigned long resource;
-       u8 current_weight;
-
        ssize_t retval = -ENOMEM;
 
        if (!firmware_has_feature(FW_FEATURE_SPLPAR) ||
@@ -432,33 +457,17 @@ static ssize_t lparcfg_write(struct file
                *new_entitled_ptr = (u64) simple_strtoul(tmp, &endp, 10);
                if (endp == tmp)
                        goto out;
-               new_weight_ptr = &current_weight;
+
+               retval = update_ppp(new_entitled_ptr, NULL);
        } else if (!strcmp(kbuf, "capacity_weight")) {
                char *endp;
                *new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10);
                if (endp == tmp)
                        goto out;
-               new_entitled_ptr = &current_entitled;
-       } else
-               goto out;
 
-       /* Get our current parameters */
-       retval = h_get_ppp(&current_entitled, &dummy, &dummy, &resource);
-       if (retval) {
-               retval = -EIO;
+               retval = update_ppp(NULL, new_weight_ptr);
+       } else
                goto out;
-       }
-
-       current_weight = (resource >> 5 * 8) & 0xFF;
-
-       pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
-                __func__, current_entitled, current_weight);
-
-       pr_debug("%s: new_entitled = %lu, new_weight = %u\n",
-                __func__, *new_entitled_ptr, *new_weight_ptr);
-
-       retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr,
-                                   *new_weight_ptr);
 
        if (retval == H_SUCCESS || retval == H_CONSTRAINED) {
                retval = count;
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to