Message ID | 3de2a4e3a61b58f948b3fd3b0f0763fabcd9a819.1717684365.git.petrm@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b4a3a89fffcdf09702b1f161b914e52abca1894d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | mlxsw: ACL fixes | expand |
On Thu, Jun 06, 2024 at 04:49:41PM +0200, Petr Machata wrote: > From: Ido Schimmel <idosch@nvidia.com> > > The library supports aggregation of objects into other objects only if > the parent object does not have a parent itself. That is, nesting is not > supported. > > Aggregation happens in two cases: Without and with hints, where hints > are a pre-computed recommendation on how to aggregate the provided > objects. > > Nesting is not possible in the first case due to a check that prevents > it, but in the second case there is no check because the assumption is > that nesting cannot happen when creating objects based on hints. The > violation of this assumption leads to various warnings and eventually to > a general protection fault [1]. > > Before fixing the root cause, error out when nesting happens and warn. > > [1] > general protection fault, probably for non-canonical address 0xdead000000000d90: 0000 [#1] PREEMPT SMP PTI > CPU: 1 PID: 1083 Comm: kworker/1:9 Tainted: G W 6.9.0-rc6-custom-gd9b4f1cca7fb #7 > Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 > Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work > RIP: 0010:mlxsw_sp_acl_erp_bf_insert+0x25/0x80 > [...] > Call Trace: > <TASK> > mlxsw_sp_acl_atcam_entry_add+0x256/0x3c0 > mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 > mlxsw_sp_acl_tcam_vchunk_migrate_one+0x16b/0x270 > mlxsw_sp_acl_tcam_vregion_rehash_work+0xbe/0x510 > process_one_work+0x151/0x370 > worker_thread+0x2cb/0x3e0 > kthread+0xd0/0x100 > ret_from_fork+0x34/0x50 > ret_from_fork_asm+0x1a/0x30 > </TASK> > > Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation") > Reported-by: Alexander Zubkov <green@qrator.net> > Signed-off-by: Ido Schimmel <idosch@nvidia.com> > Reviewed-by: Amit Cohen <amcohen@nvidia.com> > Tested-by: Alexander Zubkov <green@qrator.net> > Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Simon Horman <horms@kernel.org>
diff --git a/lib/objagg.c b/lib/objagg.c index 955538c90223..0f99ea5f5371 100644 --- a/lib/objagg.c +++ b/lib/objagg.c @@ -167,6 +167,9 @@ static int objagg_obj_parent_assign(struct objagg *objagg, { void *delta_priv; + if (WARN_ON(!objagg_obj_is_root(parent))) + return -EINVAL; + delta_priv = objagg->ops->delta_create(objagg->priv, parent->obj, objagg_obj->obj); if (IS_ERR(delta_priv))