mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
net: microchip: sparx5: Add VCAP admin locking in debugFS
This ensures that the admin lock is taken before the debugFS functions starts iterating the VCAP rules. It also adds a separate function to decode a rule, which expects the lock to have been taken before it is called. Signed-off-by: Steen Hegelund <steen.hegelund@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
975d86acae
commit
9579e2c271
@@ -2170,47 +2170,53 @@ void vcap_free_rule(struct vcap_rule *rule)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vcap_free_rule);
|
||||
|
||||
struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id)
|
||||
/* Decode a rule from the VCAP cache and return a copy */
|
||||
struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem)
|
||||
{
|
||||
struct vcap_rule_internal *elem;
|
||||
struct vcap_rule_internal *ri;
|
||||
int err;
|
||||
|
||||
ri = NULL;
|
||||
ri = vcap_dup_rule(elem, elem->state == VCAP_RS_DISABLED);
|
||||
if (IS_ERR(ri))
|
||||
return ERR_PTR(PTR_ERR(ri));
|
||||
|
||||
if (ri->state == VCAP_RS_DISABLED)
|
||||
goto out;
|
||||
|
||||
err = vcap_read_rule(ri);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
err = vcap_decode_keyset(ri);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
err = vcap_decode_actionset(ri);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
out:
|
||||
return &ri->data;
|
||||
}
|
||||
|
||||
struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id)
|
||||
{
|
||||
struct vcap_rule_internal *elem;
|
||||
struct vcap_rule *rule;
|
||||
int err;
|
||||
|
||||
err = vcap_api_check(vctrl);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
elem = vcap_lookup_rule(vctrl, id);
|
||||
if (!elem)
|
||||
return NULL;
|
||||
|
||||
mutex_lock(&elem->admin->lock);
|
||||
ri = vcap_dup_rule(elem, elem->state == VCAP_RS_DISABLED);
|
||||
if (IS_ERR(ri))
|
||||
goto unlock;
|
||||
|
||||
if (ri->state == VCAP_RS_DISABLED)
|
||||
goto unlock;
|
||||
|
||||
err = vcap_read_rule(ri);
|
||||
if (err) {
|
||||
ri = ERR_PTR(err);
|
||||
goto unlock;
|
||||
}
|
||||
err = vcap_decode_keyset(ri);
|
||||
if (err) {
|
||||
ri = ERR_PTR(err);
|
||||
goto unlock;
|
||||
}
|
||||
err = vcap_decode_actionset(ri);
|
||||
if (err) {
|
||||
ri = ERR_PTR(err);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
unlock:
|
||||
rule = vcap_decode_rule(elem);
|
||||
mutex_unlock(&elem->admin->lock);
|
||||
return (struct vcap_rule *)ri;
|
||||
return rule;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vcap_get_rule);
|
||||
|
||||
|
||||
@@ -295,7 +295,7 @@ static int vcap_show_admin(struct vcap_control *vctrl,
|
||||
|
||||
vcap_show_admin_info(vctrl, admin, out);
|
||||
list_for_each_entry(elem, &admin->rules, list) {
|
||||
vrule = vcap_get_rule(vctrl, elem->data.id);
|
||||
vrule = vcap_decode_rule(elem);
|
||||
if (IS_ERR_OR_NULL(vrule)) {
|
||||
ret = PTR_ERR(vrule);
|
||||
break;
|
||||
@@ -404,8 +404,12 @@ static int vcap_debugfs_show(struct seq_file *m, void *unused)
|
||||
.prf = (void *)seq_printf,
|
||||
.dst = m,
|
||||
};
|
||||
int ret;
|
||||
|
||||
return vcap_show_admin(info->vctrl, info->admin, &out);
|
||||
mutex_lock(&info->admin->lock);
|
||||
ret = vcap_show_admin(info->vctrl, info->admin, &out);
|
||||
mutex_unlock(&info->admin->lock);
|
||||
return ret;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(vcap_debugfs);
|
||||
|
||||
@@ -417,8 +421,12 @@ static int vcap_raw_debugfs_show(struct seq_file *m, void *unused)
|
||||
.prf = (void *)seq_printf,
|
||||
.dst = m,
|
||||
};
|
||||
int ret;
|
||||
|
||||
return vcap_show_admin_raw(info->vctrl, info->admin, &out);
|
||||
mutex_lock(&info->admin->lock);
|
||||
ret = vcap_show_admin_raw(info->vctrl, info->admin, &out);
|
||||
mutex_unlock(&info->admin->lock);
|
||||
return ret;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(vcap_raw_debugfs);
|
||||
|
||||
|
||||
@@ -118,4 +118,7 @@ int vcap_find_keystream_keysets(struct vcap_control *vctrl, enum vcap_type vt,
|
||||
/* Get the keysets that matches the rule key type/mask */
|
||||
int vcap_rule_get_keysets(struct vcap_rule_internal *ri,
|
||||
struct vcap_keyset_list *matches);
|
||||
/* Decode a rule from the VCAP cache and return a copy */
|
||||
struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem);
|
||||
|
||||
#endif /* __VCAP_API_PRIVATE__ */
|
||||
|
||||
Reference in New Issue
Block a user