Skip to content

Commit

Permalink
powerpc/pseries: Add /proc interface to control topology updates
Browse files Browse the repository at this point in the history
There are instances in which we do not want topology updates to occur.
In order to allow this a /proc interface (/proc/powerpc/topology_updates)
is introduced so that topology updates can be enabled and disabled.

This patch also adds a prrn_is_enabled() call so that PRRN events are
handled in the kernel only if topology updating is enabled.

Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Nathan Fontenot authored and Benjamin Herrenschmidt committed Apr 26, 2013
1 parent 1b1218d commit e04fa61
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 3 deletions.
5 changes: 5 additions & 0 deletions arch/powerpc/include/asm/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ static inline void sysfs_remove_device_from_node(struct device *dev,
#if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
extern int start_topology_update(void);
extern int stop_topology_update(void);
extern int prrn_is_enabled(void);
#else
static inline int start_topology_update(void)
{
Expand All @@ -80,6 +81,10 @@ static inline int stop_topology_update(void)
{
return 0;
}
static inline int prrn_is_enabled(void)
{
return 0;
}
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */

#include <asm-generic/topology.h>
Expand Down
7 changes: 5 additions & 2 deletions arch/powerpc/kernel/rtasd.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <asm/nvram.h>
#include <linux/atomic.h>
#include <asm/machdep.h>
#include <asm/topology.h>


static DEFINE_SPINLOCK(rtasd_log_lock);
Expand Down Expand Up @@ -292,11 +293,13 @@ void prrn_schedule_update(u32 scope)

static void handle_rtas_event(const struct rtas_error_log *log)
{
if (log->type == RTAS_TYPE_PRRN)
if (log->type == RTAS_TYPE_PRRN) {
/* For PRRN Events the extended log length is used to denote
* the scope for calling rtas update-nodes.
*/
prrn_schedule_update(log->extended_log_length);
if (prrn_is_enabled())
prrn_schedule_update(log->extended_log_length);
}

return;
}
Expand Down
62 changes: 61 additions & 1 deletion arch/powerpc/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
#include <linux/cpuset.h>
#include <linux/node.h>
#include <linux/stop_machine.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>
#include <asm/sparsemem.h>
#include <asm/prom.h>
#include <asm/smp.h>
Expand Down Expand Up @@ -1585,7 +1588,6 @@ int start_topology_update(void)

return rc;
}
__initcall(start_topology_update);

/*
* Disable polling for VPHN associativity changes.
Expand All @@ -1604,4 +1606,62 @@ int stop_topology_update(void)

return rc;
}

int prrn_is_enabled(void)
{
return prrn_enabled;
}

static int topology_read(struct seq_file *file, void *v)
{
if (vphn_enabled || prrn_enabled)
seq_puts(file, "on\n");
else
seq_puts(file, "off\n");

return 0;
}

static int topology_open(struct inode *inode, struct file *file)
{
return single_open(file, topology_read, NULL);
}

static ssize_t topology_write(struct file *file, const char __user *buf,
size_t count, loff_t *off)
{
char kbuf[4]; /* "on" or "off" plus null. */
int read_len;

read_len = count < 3 ? count : 3;
if (copy_from_user(kbuf, buf, read_len))
return -EINVAL;

kbuf[read_len] = '\0';

if (!strncmp(kbuf, "on", 2))
start_topology_update();
else if (!strncmp(kbuf, "off", 3))
stop_topology_update();
else
return -EINVAL;

return count;
}

static const struct file_operations topology_ops = {
.read = seq_read,
.write = topology_write,
.open = topology_open,
.release = single_release
};

static int topology_update_init(void)
{
start_topology_update();
proc_create("powerpc/topology_updates", 644, NULL, &topology_ops);

return 0;
}
device_initcall(topology_update_init);
#endif /* CONFIG_PPC_SPLPAR */

0 comments on commit e04fa61

Please sign in to comment.