mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
relayfs: Convert to hotplug state machine
Install the callbacks via the state machine. They are installed at run time but relay_prepare_cpu() does not need to be invoked by the boot CPU because relay_open() was not yet invoked and there are no pools that need to be created. Signed-off-by: Richard Weinberger <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Signed-off-by: Sebastian Andrzej Siewior <[email protected]> Reviewed-by: Sebastian Andrzej Siewior <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: [email protected] Cc: Andrew Morton <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Thomas Gleixner <[email protected]>
This commit is contained in:
parent
017c59c042
commit
e6d4989a9a
4 changed files with 26 additions and 45 deletions
|
|
@ -513,48 +513,25 @@ static void setup_callbacks(struct rchan *chan,
|
|||
chan->cb = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* relay_hotcpu_callback - CPU hotplug callback
|
||||
* @nb: notifier block
|
||||
* @action: hotplug action to take
|
||||
* @hcpu: CPU number
|
||||
*
|
||||
* Returns the success/failure of the operation. (%NOTIFY_OK, %NOTIFY_BAD)
|
||||
*/
|
||||
static int relay_hotcpu_callback(struct notifier_block *nb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
int relay_prepare_cpu(unsigned int cpu)
|
||||
{
|
||||
unsigned int hotcpu = (unsigned long)hcpu;
|
||||
struct rchan *chan;
|
||||
struct rchan_buf *buf;
|
||||
|
||||
switch(action) {
|
||||
case CPU_UP_PREPARE:
|
||||
case CPU_UP_PREPARE_FROZEN:
|
||||
mutex_lock(&relay_channels_mutex);
|
||||
list_for_each_entry(chan, &relay_channels, list) {
|
||||
if ((buf = *per_cpu_ptr(chan->buf, hotcpu)))
|
||||
continue;
|
||||
buf = relay_open_buf(chan, hotcpu);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR
|
||||
"relay_hotcpu_callback: cpu %d buffer "
|
||||
"creation failed\n", hotcpu);
|
||||
mutex_unlock(&relay_channels_mutex);
|
||||
return notifier_from_errno(-ENOMEM);
|
||||
}
|
||||
*per_cpu_ptr(chan->buf, hotcpu) = buf;
|
||||
mutex_lock(&relay_channels_mutex);
|
||||
list_for_each_entry(chan, &relay_channels, list) {
|
||||
if ((buf = *per_cpu_ptr(chan->buf, cpu)))
|
||||
continue;
|
||||
buf = relay_open_buf(chan, cpu);
|
||||
if (!buf) {
|
||||
pr_err("relay: cpu %d buffer creation failed\n", cpu);
|
||||
mutex_unlock(&relay_channels_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
mutex_unlock(&relay_channels_mutex);
|
||||
break;
|
||||
case CPU_DEAD:
|
||||
case CPU_DEAD_FROZEN:
|
||||
/* No need to flush the cpu : will be flushed upon
|
||||
* final relay_flush() call. */
|
||||
break;
|
||||
*per_cpu_ptr(chan->buf, cpu) = buf;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
mutex_unlock(&relay_channels_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1387,12 +1364,3 @@ const struct file_operations relay_file_operations = {
|
|||
.splice_read = relay_file_splice_read,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(relay_file_operations);
|
||||
|
||||
static __init int relay_init(void)
|
||||
{
|
||||
|
||||
hotcpu_notifier(relay_hotcpu_callback, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_initcall(relay_init);
|
||||
|
|
|
|||
Loading…
Reference in a new issue