Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3aef19f0 authored by Akinobu Mita's avatar Akinobu Mita Committed by Benjamin Herrenschmidt
Browse files

powerpc/pseries: Introduce pSeries_reconfig_notify()



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: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent e48f7eb2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+4 −6
Original line number Diff line number Diff line
@@ -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);
@@ -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 */

+18 −12
Original line number Diff line number Diff line
@@ -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)
{
@@ -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;
@@ -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;
	}

@@ -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);
@@ -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;
		}
	}