arfs_rule
struct arfs_rule *arfs_rule;
mlx5e_for_each_arfs_rule(arfs_rule, htmp, arfs->arfs_tables, i, j) {
if (!work_pending(&arfs_rule->arfs_work) &&
arfs_rule->rxq, arfs_rule->flow_id,
arfs_rule->filter_id)) {
hlist_del_init(&arfs_rule->hlist);
hlist_add_head(&arfs_rule->hlist, &del_list);
hlist_for_each_entry_safe(arfs_rule, htmp, &del_list, hlist) {
if (arfs_rule->rule) {
mlx5_del_flow_rules(arfs_rule->rule);
priv->channel_stats[arfs_rule->rxq]->rq.arfs_expired++;
hlist_del(&arfs_rule->hlist);
kfree(arfs_rule);
struct arfs_rule *rule;
struct arfs_rule *arfs_rule)
struct arfs_tuple *tuple = &arfs_rule->tuple;
priv->channel_stats[arfs_rule->rxq]->rq.arfs_err++;
dest.tir_num = mlx5e_rx_res_get_tirn_direct(priv->rx_res, arfs_rule->rxq);
priv->channel_stats[arfs_rule->rxq]->rq.arfs_err++;
__func__, arfs_rule->filter_id, arfs_rule->rxq,
struct arfs_rule *arfs_rule = container_of(work,
struct arfs_rule,
struct mlx5e_priv *priv = arfs_rule->priv;
if (!arfs_rule->rule) {
rule = arfs_add_rule(priv, arfs_rule);
arfs_rule->rule = rule;
priv->channel_stats[arfs_rule->rxq]->rq.arfs_add++;
arfs_modify_rule_rq(priv, arfs_rule->rule,
arfs_rule->rxq);
static struct arfs_rule *arfs_alloc_rule(struct mlx5e_priv *priv,
struct arfs_rule *rule;
static struct arfs_rule *arfs_find_rule(struct arfs_table *arfs_t,
struct arfs_rule *arfs_rule;
hlist_for_each_entry(arfs_rule, head, hlist) {
if (arfs_cmp(&arfs_rule->tuple, fk))
return arfs_rule;
struct arfs_rule *arfs_rule;
arfs_rule = arfs_find_rule(arfs_t, &fk);
if (arfs_rule) {
if (arfs_rule->rxq == rxq_index || work_busy(&arfs_rule->arfs_work)) {
return arfs_rule->filter_id;
priv->channel_stats[arfs_rule->rxq]->rq.arfs_request_out++;
arfs_rule->rxq = rxq_index;
arfs_rule = arfs_alloc_rule(priv, arfs_t, &fk, rxq_index, flow_id);
if (!arfs_rule) {
queue_work(arfs->wq, &arfs_rule->arfs_work);
return arfs_rule->filter_id;