Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 106098
b: refs/heads/master
c: 1152939
h: refs/heads/master
v: v3
  • Loading branch information
Nathan Fotenot authored and Benjamin Herrenschmidt committed Jul 25, 2008
1 parent 1c06292 commit af91419
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 79 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 545500b307658ad5783e0f3a52a32b97b2dfaed2
refs/heads/master: 11529396ea3190113173f7a15e59a58dbcaa36c8
166 changes: 88 additions & 78 deletions trunk/arch/powerpc/kernel/lparcfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ static unsigned int h_get_ppp(unsigned long *entitled,
return rc;
}

static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
static unsigned h_pic(unsigned long *pool_idle_time,
unsigned long *num_procs)
{
unsigned long rc;
unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
Expand All @@ -176,6 +177,51 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)

*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);

h_pic(&pool_idle_time, &pool_procs);
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
Expand Down Expand Up @@ -302,60 +348,11 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
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 */

seq_printf(m, "system_active_processors=%d\n",
Expand All @@ -382,6 +379,41 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
return 0;
}

static ssize_t update_ppp(u64 *entitlement, u8 *weight)
{
unsigned long current_entitled;
unsigned long dummy;
unsigned long resource;
u8 current_weight, new_weight;
u64 new_entitled;
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 (entitlement) {
new_weight = current_weight;
new_entitled = *entitlement;
} else if (weight) {
new_weight = *weight;
new_entitled = current_entitled;
} else
return -EINVAL;

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";
Expand All @@ -399,12 +431,6 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
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) ||
Expand Down Expand Up @@ -432,33 +458,17 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
*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;
Expand Down

0 comments on commit af91419

Please sign in to comment.