|
@@ -104,11 +104,11 @@ static int __tcf_action_put(struct tc_action *p, bool bind)
|
|
|
{
|
|
|
struct tcf_idrinfo *idrinfo = p->idrinfo;
|
|
|
|
|
|
- if (refcount_dec_and_lock(&p->tcfa_refcnt, &idrinfo->lock)) {
|
|
|
+ if (refcount_dec_and_mutex_lock(&p->tcfa_refcnt, &idrinfo->lock)) {
|
|
|
if (bind)
|
|
|
atomic_dec(&p->tcfa_bindcnt);
|
|
|
idr_remove(&idrinfo->action_idr, p->tcfa_index);
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
|
|
|
tcf_action_cleanup(p);
|
|
|
return 1;
|
|
@@ -200,7 +200,7 @@ static int tcf_dump_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
|
|
|
struct tc_action *p;
|
|
|
unsigned long id = 1;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
|
|
|
s_i = cb->args[0];
|
|
|
|
|
@@ -235,7 +235,7 @@ done:
|
|
|
if (index >= 0)
|
|
|
cb->args[0] = index + 1;
|
|
|
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
if (n_i) {
|
|
|
if (act_flags & TCA_FLAG_LARGE_DUMP_ON)
|
|
|
cb->args[1] = n_i;
|
|
@@ -277,18 +277,18 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
|
|
|
if (nla_put_string(skb, TCA_KIND, ops->kind))
|
|
|
goto nla_put_failure;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
idr_for_each_entry_ul(idr, p, id) {
|
|
|
ret = tcf_idr_release_unsafe(p);
|
|
|
if (ret == ACT_P_DELETED) {
|
|
|
module_put(ops->owner);
|
|
|
n_i++;
|
|
|
} else if (ret < 0) {
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
goto nla_put_failure;
|
|
|
}
|
|
|
}
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
|
|
|
if (nla_put_u32(skb, TCA_FCNT, n_i))
|
|
|
goto nla_put_failure;
|
|
@@ -324,13 +324,13 @@ int tcf_idr_search(struct tc_action_net *tn, struct tc_action **a, u32 index)
|
|
|
struct tcf_idrinfo *idrinfo = tn->idrinfo;
|
|
|
struct tc_action *p;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
p = idr_find(&idrinfo->action_idr, index);
|
|
|
if (IS_ERR(p))
|
|
|
p = NULL;
|
|
|
else if (p)
|
|
|
refcount_inc(&p->tcfa_refcnt);
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
|
|
|
if (p) {
|
|
|
*a = p;
|
|
@@ -345,10 +345,10 @@ static int tcf_idr_delete_index(struct tcf_idrinfo *idrinfo, u32 index)
|
|
|
struct tc_action *p;
|
|
|
int ret = 0;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
p = idr_find(&idrinfo->action_idr, index);
|
|
|
if (!p) {
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
return -ENOENT;
|
|
|
}
|
|
|
|
|
@@ -358,7 +358,7 @@ static int tcf_idr_delete_index(struct tcf_idrinfo *idrinfo, u32 index)
|
|
|
|
|
|
WARN_ON(p != idr_remove(&idrinfo->action_idr,
|
|
|
p->tcfa_index));
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
|
|
|
tcf_action_cleanup(p);
|
|
|
module_put(owner);
|
|
@@ -369,7 +369,7 @@ static int tcf_idr_delete_index(struct tcf_idrinfo *idrinfo, u32 index)
|
|
|
ret = -EPERM;
|
|
|
}
|
|
|
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -431,10 +431,10 @@ void tcf_idr_insert(struct tc_action_net *tn, struct tc_action *a)
|
|
|
{
|
|
|
struct tcf_idrinfo *idrinfo = tn->idrinfo;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
/* Replace ERR_PTR(-EBUSY) allocated by tcf_idr_check_alloc */
|
|
|
WARN_ON(!IS_ERR(idr_replace(&idrinfo->action_idr, a, a->tcfa_index)));
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
}
|
|
|
EXPORT_SYMBOL(tcf_idr_insert);
|
|
|
|
|
@@ -444,10 +444,10 @@ void tcf_idr_cleanup(struct tc_action_net *tn, u32 index)
|
|
|
{
|
|
|
struct tcf_idrinfo *idrinfo = tn->idrinfo;
|
|
|
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
/* Remove ERR_PTR(-EBUSY) allocated by tcf_idr_check_alloc */
|
|
|
WARN_ON(!IS_ERR(idr_remove(&idrinfo->action_idr, index)));
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
}
|
|
|
EXPORT_SYMBOL(tcf_idr_cleanup);
|
|
|
|
|
@@ -465,14 +465,14 @@ int tcf_idr_check_alloc(struct tc_action_net *tn, u32 *index,
|
|
|
int ret;
|
|
|
|
|
|
again:
|
|
|
- spin_lock(&idrinfo->lock);
|
|
|
+ mutex_lock(&idrinfo->lock);
|
|
|
if (*index) {
|
|
|
p = idr_find(&idrinfo->action_idr, *index);
|
|
|
if (IS_ERR(p)) {
|
|
|
/* This means that another process allocated
|
|
|
* index but did not assign the pointer yet.
|
|
|
*/
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
goto again;
|
|
|
}
|
|
|
|
|
@@ -485,7 +485,7 @@ again:
|
|
|
} else {
|
|
|
*a = NULL;
|
|
|
ret = idr_alloc_u32(&idrinfo->action_idr, NULL, index,
|
|
|
- *index, GFP_ATOMIC);
|
|
|
+ *index, GFP_KERNEL);
|
|
|
if (!ret)
|
|
|
idr_replace(&idrinfo->action_idr,
|
|
|
ERR_PTR(-EBUSY), *index);
|
|
@@ -494,12 +494,12 @@ again:
|
|
|
*index = 1;
|
|
|
*a = NULL;
|
|
|
ret = idr_alloc_u32(&idrinfo->action_idr, NULL, index,
|
|
|
- UINT_MAX, GFP_ATOMIC);
|
|
|
+ UINT_MAX, GFP_KERNEL);
|
|
|
if (!ret)
|
|
|
idr_replace(&idrinfo->action_idr, ERR_PTR(-EBUSY),
|
|
|
*index);
|
|
|
}
|
|
|
- spin_unlock(&idrinfo->lock);
|
|
|
+ mutex_unlock(&idrinfo->lock);
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL(tcf_idr_check_alloc);
|