From 57acbe7f366abcbd80e7d1833269e0f6998668e7 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 29 Jul 2009 13:59:43 +0200 Subject: [PATCH] powerpc: OF convert to raw lock commit 5b659531c96943c3eea21b3dbcb83e6320d0f46b in tip. Replaced the RW lock for now with raw_spinlock. We have no raw_rwlocks in -rt right now and I doubt that the OF path is performance critical. Signed-off-by: Thomas Gleixner Signed-off-by: Paul Gortmaker --- drivers/of/base.c | 72 ++++++++++++++++++++++++++-------------------------- include/linux/of.h | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index b5ad974..4e40618 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -29,7 +29,7 @@ struct device_node *of_chosen; /* use when traversing tree through the allnext, child, sibling, * or parent members of struct device_node. */ -DEFINE_RWLOCK(devtree_lock); +DEFINE_RAW_SPINLOCK(devtree_lock); int of_n_addr_cells(struct device_node *np) { @@ -147,7 +147,7 @@ struct property *of_find_property(const struct device_node *np, if (!np) return NULL; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); for (pp = np->properties; pp != 0; pp = pp->next) { if (of_prop_cmp(pp->name, name) == 0) { if (lenp != 0) @@ -155,7 +155,7 @@ struct property *of_find_property(const struct device_node *np, break; } } - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return pp; } @@ -173,13 +173,13 @@ struct device_node *of_find_all_nodes(struct device_node *prev) { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = prev ? prev->allnext : allnodes; for (; np != NULL; np = np->allnext) if (of_node_get(np)) break; of_node_put(prev); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_all_nodes); @@ -282,9 +282,9 @@ struct device_node *of_get_parent(const struct device_node *node) if (!node) return NULL; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = of_node_get(node->parent); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_get_parent); @@ -307,10 +307,10 @@ struct device_node *of_get_next_parent(struct device_node *node) if (!node) return NULL; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); parent = of_node_get(node->parent); of_node_put(node); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return parent; } @@ -327,13 +327,13 @@ struct device_node *of_get_next_child(const struct device_node *node, { struct device_node *next; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); next = prev ? prev->sibling : node->child; for (; next; next = next->sibling) if (of_node_get(next)) break; of_node_put(prev); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return next; } EXPORT_SYMBOL(of_get_next_child); @@ -349,13 +349,13 @@ struct device_node *of_find_node_by_path(const char *path) { struct device_node *np = allnodes; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); for (; np; np = np->allnext) { if (np->full_name && (of_node_cmp(np->full_name, path) == 0) && of_node_get(np)) break; } - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_node_by_path); @@ -376,14 +376,14 @@ struct device_node *of_find_node_by_name(struct device_node *from, { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) if (np->name && (of_node_cmp(np->name, name) == 0) && of_node_get(np)) break; of_node_put(from); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_node_by_name); @@ -405,14 +405,14 @@ struct device_node *of_find_node_by_type(struct device_node *from, { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) if (np->type && (of_node_cmp(np->type, type) == 0) && of_node_get(np)) break; of_node_put(from); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_node_by_type); @@ -436,7 +436,7 @@ struct device_node *of_find_compatible_node(struct device_node *from, { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { if (type @@ -446,7 +446,7 @@ struct device_node *of_find_compatible_node(struct device_node *from, break; } of_node_put(from); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_compatible_node); @@ -469,7 +469,7 @@ struct device_node *of_find_node_with_property(struct device_node *from, struct device_node *np; struct property *pp; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { for (pp = np->properties; pp != 0; pp = pp->next) { @@ -481,7 +481,7 @@ struct device_node *of_find_node_with_property(struct device_node *from, } out: of_node_put(from); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_node_with_property); @@ -532,14 +532,14 @@ struct device_node *of_find_matching_node(struct device_node *from, { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); np = from ? from->allnext : allnodes; for (; np; np = np->allnext) { if (of_match_node(matches, np) && of_node_get(np)) break; } of_node_put(from); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_matching_node); @@ -628,12 +628,12 @@ struct device_node *of_find_node_by_phandle(phandle handle) { struct device_node *np; - read_lock(&devtree_lock); + raw_spin_lock(&devtree_lock); for (np = allnodes; np; np = np->allnext) if (np->phandle == handle) break; of_node_get(np); - read_unlock(&devtree_lock); + raw_spin_unlock(&devtree_lock); return np; } EXPORT_SYMBOL(of_find_node_by_phandle); @@ -788,18 +788,18 @@ int prom_add_property(struct device_node *np, struct property *prop) unsigned long flags; prop->next = NULL; - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (strcmp(prop->name, (*next)->name) == 0) { /* duplicate ! don't insert it */ - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); return -1; } next = &(*next)->next; } *next = prop; - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); #ifdef CONFIG_PROC_DEVICETREE /* try to add to proc as well if it was initialized */ @@ -824,7 +824,7 @@ int prom_remove_property(struct device_node *np, struct property *prop) unsigned long flags; int found = 0; - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (*next == prop) { @@ -837,7 +837,7 @@ int prom_remove_property(struct device_node *np, struct property *prop) } next = &(*next)->next; } - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); if (!found) return -ENODEV; @@ -867,7 +867,7 @@ int prom_update_property(struct device_node *np, unsigned long flags; int found = 0; - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); next = &np->properties; while (*next) { if (*next == oldprop) { @@ -881,7 +881,7 @@ int prom_update_property(struct device_node *np, } next = &(*next)->next; } - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); if (!found) return -ENODEV; @@ -911,12 +911,12 @@ void of_attach_node(struct device_node *np) { unsigned long flags; - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); np->sibling = np->parent->child; np->allnext = allnodes; np->parent->child = np; allnodes = np; - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); } /** @@ -930,7 +930,7 @@ void of_detach_node(struct device_node *np) struct device_node *parent; unsigned long flags; - write_lock_irqsave(&devtree_lock, flags); + raw_spin_lock_irqsave(&devtree_lock, flags); parent = np->parent; if (!parent) @@ -961,7 +961,7 @@ void of_detach_node(struct device_node *np) of_node_set_flag(np, OF_DETACHED); out_unlock: - write_unlock_irqrestore(&devtree_lock, flags); + raw_spin_unlock_irqrestore(&devtree_lock, flags); } #endif /* defined(CONFIG_OF_DYNAMIC) */ diff --git a/include/linux/of.h b/include/linux/of.h index a367e19..4993e26 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -68,7 +68,7 @@ struct device_node { /* Pointer for first entry in chain of all nodes. */ extern struct device_node *allnodes; extern struct device_node *of_chosen; -extern rwlock_t devtree_lock; +extern raw_spinlock_t devtree_lock; static inline int of_node_check_flag(struct device_node *n, unsigned long flag) { -- 1.7.0.4