Skip to content

Commit

Permalink
powerpc/pseries: Introduce pSeries_reconfig_notify()
Browse files Browse the repository at this point in the history
This introduces pSeries_reconfig_notify() as a just wrapper of
blocking_notifier_call_chain() for pSeries_reconfig_chain.

This is a preparation to improvement of error code on reconfiguration
notifier failure.

Signed-off-by: Akinobu Mita <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: [email protected]
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
  • Loading branch information
mita authored and ozbenh committed Jun 29, 2011
1 parent e48f7eb commit 3aef19f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 19 deletions.
2 changes: 1 addition & 1 deletion arch/powerpc/include/asm/pSeries_reconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#ifdef CONFIG_PPC_PSERIES
extern int pSeries_reconfig_notifier_register(struct notifier_block *);
extern void pSeries_reconfig_notifier_unregister(struct notifier_block *);
extern struct blocking_notifier_head pSeries_reconfig_chain;
extern int pSeries_reconfig_notify(unsigned long action, void *p);
/* Not the best place to put this, will be fixed when we move some
* of the rtas suspend-me stuff to pseries */
extern void pSeries_coalesce_init(void);
Expand Down
10 changes: 4 additions & 6 deletions arch/powerpc/platforms/pseries/dlpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,12 +262,11 @@ int dlpar_attach_node(struct device_node *dn)
if (!dn->parent)
return -ENOMEM;

rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
PSERIES_RECONFIG_ADD, dn);
if (rc == NOTIFY_BAD) {
rc = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, dn);
if (rc) {
printk(KERN_ERR "Failed to add device node %s\n",
dn->full_name);
return -ENOMEM; /* For now, safe to assume kmalloc failure */
return rc;
}

of_attach_node(dn);
Expand Down Expand Up @@ -297,8 +296,7 @@ int dlpar_detach_node(struct device_node *dn)
remove_proc_entry(dn->pde->name, parent->pde);
#endif

blocking_notifier_call_chain(&pSeries_reconfig_chain,
PSERIES_RECONFIG_REMOVE, dn);
pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, dn);
of_detach_node(dn);
of_node_put(dn); /* Must decrement the refcount */

Expand Down
30 changes: 18 additions & 12 deletions arch/powerpc/platforms/pseries/reconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ static struct device_node *derive_parent(const char *path)
return parent;
}

BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);
static BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);

int pSeries_reconfig_notifier_register(struct notifier_block *nb)
{
Expand All @@ -109,6 +109,16 @@ void pSeries_reconfig_notifier_unregister(struct notifier_block *nb)
blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb);
}

int pSeries_reconfig_notify(unsigned long action, void *p)
{
int err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
action, p);

if (err == NOTIFY_BAD)
return -ENOMEM; /* For now, safe to assume kmalloc failure */
return 0;
}

static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
{
struct device_node *np;
Expand All @@ -132,11 +142,9 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist
goto out_err;
}

err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
PSERIES_RECONFIG_ADD, np);
if (err == NOTIFY_BAD) {
err = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, np);
if (err) {
printk(KERN_ERR "Failed to add device node %s\n", path);
err = -ENOMEM; /* For now, safe to assume kmalloc failure */
goto out_err;
}

Expand Down Expand Up @@ -173,8 +181,7 @@ static int pSeries_reconfig_remove_node(struct device_node *np)

remove_node_proc_entries(np);

blocking_notifier_call_chain(&pSeries_reconfig_chain,
PSERIES_RECONFIG_REMOVE, np);
pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, np);
of_detach_node(np);

of_node_put(parent);
Expand Down Expand Up @@ -472,11 +479,10 @@ static int do_update_property(char *buf, size_t bufsize)
else
action = PSERIES_DRCONF_MEM_REMOVE;

rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
action, value);
if (rc == NOTIFY_BAD) {
rc = prom_update_property(np, oldprop, newprop);
return -ENOMEM;
rc = pSeries_reconfig_notify(action, value);
if (rc) {
prom_update_property(np, oldprop, newprop);
return rc;
}
}

Expand Down

0 comments on commit 3aef19f

Please sign in to comment.