mlxsw: Various ACL fixes
Subsystems (3)
Petr Machata
maintainercover mlxsw: Various ACL fixes
Ido Schimmel writes:
Fix various problems in the ACL (i.e., flower offload) code. See the commit messages for more details.
Ido Schimmel (9):
mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity
update
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
mlxsw: spectrum_acl_tcam: Rate limit error message
mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
mlxsw: spectrum_acl_tcam: Fix warning during rehash
mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
.../mellanox/mlxsw/spectrum_acl_tcam.c | 115 +++++++++++------- .../mellanox/mlxsw/spectrum_acl_tcam.h | 5 +- 2 files changed, 75 insertions(+), 45 deletions(-)
Signature · 1 line
2.43.0
Petr Machata
maintainerPATCH 1/9 mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
From: Ido Schimmel <[email protected]>
Region identifiers can be allocated both when user space tries to insert a new tc filter and when filters are migrated from one region to another as part of the rehash delayed work.
There is no lock protecting the bitmap from which these identifiers are allocated from, which is racy and leads to bad parameter errors from the device's firmware.
Fix by converting the bitmap to IDA which handles its own locking. For consistency, do the same for the group identifiers that are part of the same structure.
--- .../mellanox/mlxsw/spectrum_acl_tcam.c | 61 ++++++++----------- .../mellanox/mlxsw/spectrum_acl_tcam.h | 5 +- 2 files changed, 30 insertions(+), 36 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +27 -34
@@ -10,6 +10,7 @@#include <linux/netdevice.h> #include <linux/mutex.h> #include <linux/refcount.h> +#include <linux/idr.h> #include <net/devlink.h> #include <trace/events/mlxsw.h>
@@ -58,41 +59,43 @@ int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp,static int mlxsw_sp_acl_tcam_region_id_get (struct mlxsw_sp_acl_tcam *tcam,u16 *p_id) { -u16 id; +int id; - id =find_first_zero_bit (tcam->used_regions, tcam->max_regions); -if (id < tcam->max_regions) { -__set_bit (id, tcam->used_regions); - *p_id = id; -return 0 ; - } -return -ENOBUFS ; + id =ida_alloc_max (&tcam->used_regions, tcam->max_regions -1 , +GFP_KERNEL ); +if (id <0 ) +return id; + + *p_id = id; + +return 0 ; }static void mlxsw_sp_acl_tcam_region_id_put (struct mlxsw_sp_acl_tcam *tcam,u16 id) { -__clear_bit (id, tcam->used_regions); +ida_free (&tcam->used_regions, id); }static int mlxsw_sp_acl_tcam_group_id_get (struct mlxsw_sp_acl_tcam *tcam,u16 *p_id) { -u16 id; +int id; - id =find_first_zero_bit (tcam->used_groups, tcam->max_groups); -if (id < tcam->max_groups) { -__set_bit (id, tcam->used_groups); - *p_id = id; -return 0 ; - } -return -ENOBUFS ; + id =ida_alloc_max (&tcam->used_groups, tcam->max_groups -1 , +GFP_KERNEL ); +if (id <0 ) +return id; + + *p_id = id; + +return 0 ; }static void mlxsw_sp_acl_tcam_group_id_put (struct mlxsw_sp_acl_tcam *tcam,u16 id) { -__clear_bit (id, tcam->used_groups); +ida_free (&tcam->used_groups, id); }struct mlxsw_sp_acl_tcam_pattern {
@@ -1549,19 +1552,11 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,if (max_tcam_regions < max_regions) max_regions = max_tcam_regions; - tcam->used_regions =bitmap_zalloc (max_regions,GFP_KERNEL ); -if (!tcam->used_regions) { - err = -ENOMEM ; - goto err_alloc_used_regions; - } +ida_init (&tcam->used_regions); tcam->max_regions = max_regions; max_groups =MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_GROUPS ); - tcam->used_groups =bitmap_zalloc (max_groups,GFP_KERNEL ); -if (!tcam->used_groups) { - err = -ENOMEM ; - goto err_alloc_used_groups; - } +ida_init (&tcam->used_groups); tcam->max_groups = max_groups; tcam->max_group_size =MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_GROUP_SIZE );
@@ -1575,10 +1570,8 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp,return 0 ; err_tcam_init: -bitmap_free (tcam->used_groups); -err_alloc_used_groups: -bitmap_free (tcam->used_regions); -err_alloc_used_regions: +ida_destroy (&tcam->used_groups); +ida_destroy (&tcam->used_regions);mlxsw_sp_acl_tcam_rehash_params_unregister (mlxsw_sp); err_rehash_params_register:mutex_destroy (&tcam->lock);
@@ -1591,8 +1584,8 @@ void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp,const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; ops->fini (mlxsw_sp, tcam->priv); -bitmap_free (tcam->used_groups); -bitmap_free (tcam->used_regions); +ida_destroy (&tcam->used_groups); +ida_destroy (&tcam->used_regions);mlxsw_sp_acl_tcam_rehash_params_unregister (mlxsw_sp);mutex_destroy (&tcam->lock); }
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h +3 -2
@@ -6,15 +6,16 @@#include <linux/list.h> #include <linux/parman.h> +#include <linux/idr.h> #include "reg.h" #include "spectrum.h" #include "core_acl_flex_keys.h" struct mlxsw_sp_acl_tcam { -unsigned long *used_regions;/* bit array */ +struct ida used_regions;unsigned int max_regions; -unsigned long *used_groups;/* bit array */ +struct ida used_groups;unsigned int max_groups;unsigned int max_group_size;struct mutex lock;/* guards vregion list */
Signature · 1 line
2.43.0
Re: [PATCH net 1/9] mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
Quoted 14 lines · Petr Machata
From: Ido Schimmel <[email protected]>
Region identifiers can be allocated both when user space tries to insert a new tc filter and when filters are migrated from one region to another as part of the rehash delayed work.
There is no lock protecting the bitmap from which these identifiers are allocated from, which is racy and leads to bad parameter errors from the device's firmware.
Fix by converting the bitmap to IDA which handles its own locking. For consistency, do the same for the group identifiers that are part of the same structure.
Quoted 6 lines
Fixes 2bffc5322fd8 ("mlxsw: spectrum_acl: Don't take mutex in mlxsw_sp_acl_tcam_vregion_rehash_work()")Reported-by Amit Cohen <[email protected]>Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
Petr Machata
maintainerPATCH 2/9 mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
The purpose of the rehash delayed work is to reduce the number of masks (eRPs) used by an ACL region as the eRP bank is a global and limited resource.
This is done in three steps:
1. Creating a new set of masks and a new ACL region which will use the new masks and to which the existing filters will be migrated to. The new region is assigned to 'vregion->region' and the region from which the filters are migrated from is assigned to 'vregion->region2'.
2. Migrating all the filters from the old region to the new region.
3. Destroying the old region and setting 'vregion->region2' to NULL.
Only the second steps is performed under the 'vregion->lock' mutex although its comments says that among other things it "Protects consistency of region, region2 pointers".
This is problematic as the first step can race with filter insertion from user space that uses 'vregion->region', but under the mutex.
Fix by holding the mutex across the entirety of the delayed work and not only during the second step.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +2 -2
@@ -718,7 +718,9 @@ static void mlxsw_sp_acl_tcam_vregion_rehash_work(struct work_struct *work) rehash.dw.work);int credits =MLXSW_SP_ACL_TCAM_VREGION_REHASH_CREDITS ; +mutex_lock (&vregion->lock);mlxsw_sp_acl_tcam_vregion_rehash (vregion->mlxsw_sp, vregion, &credits); +mutex_unlock (&vregion->lock);if (credits <0 )/* Rehash gone out of credits so it was interrupted. * Schedule the work as soon as possible to continue.
@@ -1323,7 +1325,6 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,int err, err2;trace_mlxsw_sp_acl_tcam_vregion_migrate (mlxsw_sp, vregion); -mutex_lock (&vregion->lock); err =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);if (err) {
@@ -1343,7 +1344,6 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,/* Let the rollback to be continued later on. */ } } -mutex_unlock (&vregion->lock);trace_mlxsw_sp_acl_tcam_vregion_migrate_end (mlxsw_sp, vregion);return err; }
Signature · 1 line
2.43.0
Re: [PATCH net 2/9] mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
Quoted 24 lines · Petr Machata
From: Ido Schimmel <[email protected]>
The purpose of the rehash delayed work is to reduce the number of masks (eRPs) used by an ACL region as the eRP bank is a global and limited resource.
This is done in three steps:
1. Creating a new set of masks and a new ACL region which will use the new masks and to which the existing filters will be migrated to. The new region is assigned to '
vregion->region' and the region from which the filters are migrated from is assigned to 'vregion->region2'.2. Migrating all the filters from the old region to the new region.
3. Destroying the old region and setting '
vregion->region2' to NULL.Only the second steps is performed under the '
vregion->lock' mutex although its comments says that among other things it "Protects consistency of region, region2 pointers".This is problematic as the first step can race with filter insertion from user space that uses '
vregion->region', but under the mutex.
Quoted 8 lines
Fix by holding the mutex across the entirety of the delayed work and not only during the second step.
Fixes 2bffc5322fd8 ("mlxsw: spectrum_acl: Don't take mutex in mlxsw_sp_acl_tcam_vregion_rehash_work()")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
Petr Machata
maintainerPATCH 3/9 mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
The rule activity update delayed work periodically traverses the list of configured rules and queries their activity from the device.
As part of this task it accesses the entry pointed by 'ventry->entry', but this entry can be changed concurrently by the rehash delayed work, leading to a use-after-free [1].
Fix by closing the race and perform the activity query under the 'vregion->lock' mutex.
[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_tcam_flower_rule_activity_get+0x121/0x140 Read of size 8 at addr ffff8881054ed808 by task kworker/0:18/181 CPU: 0 PID: 181 Comm: kworker/0:18 Not tainted 6.9.0-rc2-custom-00781-gd5ab772d32f7 #2 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_rule_activity_update_work Call Trace: <TASK> dump_stack_lvl+0xc6/0x120 print_report+0xce/0x670 kasan_report+0xd7/0x110 mlxsw_sp_acl_tcam_flower_rule_activity_get+0x121/0x140 mlxsw_sp_acl_rule_activity_update_work+0x219/0x400 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 1039: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 __kasan_kmalloc+0x8f/0xa0 __kmalloc+0x19c/0x360 mlxsw_sp_acl_tcam_entry_create+0x7b/0x1f0 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x30d/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 Freed by task 1039: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 poison_slab_object+0x102/0x170 __kasan_slab_free+0x14/0x30 kfree+0xc1/0x290 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x3d7/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30
--- .../net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +8 -2
@@ -1159,8 +1159,14 @@ mlxsw_sp_acl_tcam_ventry_activity_get(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam_ventry *ventry, bool *activity) { - return mlxsw_sp_acl_tcam_entry_activity_get(mlxsw_sp, - ventry->entry, activity); + struct mlxsw_sp_acl_tcam_vregion *vregion = ventry->vchunk->vregion; +int err; + +mutex_lock (&vregion->lock); + err =mlxsw_sp_acl_tcam_entry_activity_get (mlxsw_sp, ventry->entry, + activity); +mutex_unlock (&vregion->lock); +return err; } static int
Signature · 1 line
2.43.0
Re: [PATCH net 3/9] mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update
Quoted 14 lines · Petr Machata
From: Ido Schimmel <[email protected]>
The rule activity update delayed work periodically traverses the list of configured rules and queries their activity from the device.
As part of this task it accesses the entry pointed by '
ventry->entry', but this entry can be changed concurrently by the rehash delayed work, leading to a use-after-free [1].Fix by closing the race and perform the activity query under the '
vregion->lock' mutex.[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_tcam_flower_rule_activity_get+0x121/0x140
...
Quoted 5 lines
Fixes 2bffc5322fd8 ("mlxsw: spectrum_acl: Don't take mutex in mlxsw_sp_acl_tcam_vregion_rehash_work()")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
...
Petr Machata
maintainerPATCH 4/9 mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
The rehash delayed work migrates filters from one region to another according to the number of available credits.
The migrated from region is destroyed at the end of the work if the number of credits is non-negative as the assumption is that this is indicative of migration being complete. This assumption is incorrect as a non-negative number of credits can also be the result of a failed migration.
The destruction of a region that still has filters referencing it can result in a use-after-free [1].
Fix by not destroying the region if migration failed.
[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_ctcam_region_entry_remove+0x21d/0x230 Read of size 8 at addr ffff8881735319e8 by task kworker/0:31/3858 CPU: 0 PID: 3858 Comm: kworker/0:31 Tainted: G W 6.9.0-rc2-custom-00782-gf2275c2157d8 #5 Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work Call Trace: <TASK> dump_stack_lvl+0xc6/0x120 print_report+0xce/0x670 kasan_report+0xd7/0x110 mlxsw_sp_acl_ctcam_region_entry_remove+0x21d/0x230 mlxsw_sp_acl_ctcam_entry_del+0x2e/0x70 mlxsw_sp_acl_atcam_entry_del+0x81/0x210 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x3cd/0xb50 mlxsw_sp_acl_tcam_vregion_rehash_work+0x157/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 174: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 __kasan_kmalloc+0x8f/0xa0 __kmalloc+0x19c/0x360 mlxsw_sp_acl_tcam_region_create+0xdf/0x9c0 mlxsw_sp_acl_tcam_vregion_rehash_work+0x954/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30 Freed by task 7: kasan_save_stack+0x33/0x60 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 poison_slab_object+0x102/0x170 __kasan_slab_free+0x14/0x30 kfree+0xc1/0x290 mlxsw_sp_acl_tcam_region_destroy+0x272/0x310 mlxsw_sp_acl_tcam_vregion_rehash_work+0x731/0x1300 process_one_work+0x8eb/0x19b0 worker_thread+0x6c9/0xf70 kthread+0x2c9/0x3b0 ret_from_fork+0x4d/0x80 ret_from_fork_asm+0x1a/0x30
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +1 -0
@@ -1451,6 +1451,7 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, ctx, credits);if (err) {dev_err (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" ); +return ; }if (*credits >=0 )
Signature · 1 line
2.43.0
Re: [PATCH net 4/9] mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
Quoted 18 lines · Petr Machata
From: Ido Schimmel <[email protected]>
The rehash delayed work migrates filters from one region to another according to the number of available credits.
The migrated from region is destroyed at the end of the work if the number of credits is non-negative as the assumption is that this is indicative of migration being complete. This assumption is incorrect as a non-negative number of credits can also be the result of a failed migration.
The destruction of a region that still has filters referencing it can result in a use-after-free [1].
Fix by not destroying the region if migration failed.
[1]
BUG: KASAN: slab-use-after-free in mlxsw_sp_acl_ctcam_region_entry_remove+0x21d/0x230
...
Quoted 5 lines
Fixes c9c9af91f1d9 ("mlxsw: spectrum_acl: Allow to interrupt/continue rehash work")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
...
Petr Machata
maintainerPATCH 5/9 mlxsw: spectrum_acl_tcam: Rate limit error message
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
In the rare cases when the device resources are exhausted it is likely that the rehash delayed work will fail. An error message will be printed whenever this happens which can be overwhelming considering the fact that the work is per-region and that there can be hundreds of regions.
Fix by rate limiting the error message.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +1 -1
@@ -1450,7 +1450,7 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, err =mlxsw_sp_acl_tcam_vregion_migrate (mlxsw_sp, vregion, ctx, credits);if (err) { -dev_err (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" ); +dev_err_ratelimited (mlxsw_sp->bus_info->dev,"Failed to migrate vregion\n" );return ; }
Signature · 1 line
2.43.0
Re: [PATCH net 5/9] mlxsw: spectrum_acl_tcam: Rate limit error message
Quoted 7 lines · Petr Machata
From: Ido Schimmel <[email protected]>
In the rare cases when the device resources are exhausted it is likely that the rehash delayed work will fail. An error message will be printed whenever this happens which can be overwhelming considering the fact that the work is per-region and that there can be hundreds of regions.
Quoted 7 lines
Fix by rate limiting the error message.
Fixes e5e7962ee5c2 ("mlxsw: spectrum_acl: Implement region migration according to hints")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
Petr Machata
maintainerPATCH 6/9 mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
The rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
If the migration fails, the code tries to migrate the filters back to the old region. However, the rollback itself can also fail in which case another migration will be erroneously performed. Besides the fact that this ping pong is not a very good idea, it also creates a problem.
Each virtual chunk references two chunks: The currently used one ('vchunk->chunk') and a backup ('vchunk->chunk2'). During migration the first holds the chunk we want to migrate filters to and the second holds the chunk we are migrating filters from.
The code currently assumes - but does not verify - that the backup chunk does not exist (NULL) if the currently used chunk does not reference the target region. This assumption breaks when we are trying to rollback a rollback, resulting in the backup chunk being overwritten and leaked [1].
Fix by not rolling back a failed rollback and add a warning to avoid future cases.
[1]
WARNING: CPU: 5 PID: 1063 at lib/parman.c:291 parman_destroy+0x17/0x20 Modules linked in: CPU: 5 PID: 1063 Comm: kworker/5:11 Tainted: G W 6.9.0-rc2-custom-00784-gc6a05c468a0b #14 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:parman_destroy+0x17/0x20 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_region_fini+0x19/0x60 mlxsw_sp_acl_tcam_region_destroy+0x49/0xf0 mlxsw_sp_acl_tcam_vregion_rehash_work+0x1f1/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +4 -0
@@ -1200,6 +1200,8 @@ mlxsw_sp_acl_tcam_vchunk_migrate_start(struct mlxsw_sp *mlxsw_sp, {struct mlxsw_sp_acl_tcam_chunk *new_chunk; +WARN_ON (vchunk->chunk2); + new_chunk =mlxsw_sp_acl_tcam_chunk_create (mlxsw_sp, vchunk, region);if (IS_ERR (new_chunk))return PTR_ERR (new_chunk);
@@ -1334,6 +1336,8 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp, err =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);if (err) { +if (ctx->this_is_rollback) +return err;/* In case migration was not successful, we need to swap * so the original region pointer is assigned again * to vregion->region.
Signature · 1 line
2.43.0
Re: [PATCH net 6/9] mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
Quoted 46 lines · Petr Machata
From: Ido Schimmel <[email protected]>
The rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
If the migration fails, the code tries to migrate the filters back to the old region. However, the rollback itself can also fail in which case another migration will be erroneously performed. Besides the fact that this ping pong is not a very good idea, it also creates a problem.
Each virtual chunk references two chunks: The currently used one ('
vchunk->chunk') and a backup ('vchunk->chunk2'). During migration the first holds the chunk we want to migrate filters to and the second holds the chunk we are migrating filters from.The code currently assumes - but does not verify - that the backup chunk does not exist (NULL) if the currently used chunk does not reference the target region. This assumption breaks when we are trying to rollback a rollback, resulting in the backup chunk being overwritten and leaked [1].
Fix by not rolling back a failed rollback and add a warning to avoid future cases.
[1]
WARNING: CPU: 5 PID: 1063 at lib/parman.c:291 parman_destroy+0x17/0x20 Modules linked in: CPU: 5 PID: 1063 Comm: kworker/5:11 Tainted: G W 6.9.0-rc2-custom-00784-gc6a05c468a0b #14 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:parman_destroy+0x17/0x20 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_region_fini+0x19/0x60 mlxsw_sp_acl_tcam_region_destroy+0x49/0xf0 mlxsw_sp_acl_tcam_vregion_rehash_work+0x1f1/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
Quoted 5 lines
Fixes 843500518509 ("mlxsw: spectrum_acl: Do rollback as another call to mlxsw_sp_acl_tcam_vchunk_migrate_all()")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
...
Petr Machata
maintainerPATCH 7/9 mlxsw: spectrum_acl_tcam: Fix warning during rehash
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
As previously explained, the rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
When the work runs out of credits it stores the current chunk and entry as markers in the per-work context so that it would know where to resume the migration from the next time the work is scheduled.
Upon error, the chunk marker is reset to NULL, but without resetting the entry markers despite being relative to it. This can result in migration being resumed from an entry that does not belong to the chunk being migrated. In turn, this will eventually lead to a chunk being iterated over as if it is an entry. Because of how the two structures happen to be defined, this does not lead to KASAN splats, but to warnings such as [1].
Fix by creating a helper that resets all the markers and call it from all the places the currently only reset the chunk marker. For good measures also call it when starting a completely new rehash. Add a warning to avoid future cases.
[1]
WARNING: CPU: 7 PID: 1076 at drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c:407 mlxsw_afk_encode+0x242/0x2f0 Modules linked in: CPU: 7 PID: 1076 Comm: kworker/7:24 Tainted: G W 6.9.0-rc3-custom-00880-g29e61d91b77b #29 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_afk_encode+0x242/0x2f0 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_entry_add+0xd9/0x3c0 mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x109/0x290 mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 </TASK>
--- .../mellanox/mlxsw/spectrum_acl_tcam.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +17 -3
@@ -730,6 +730,17 @@ static void mlxsw_sp_acl_tcam_vregion_rehash_work(struct work_struct *work)mlxsw_sp_acl_tcam_vregion_rehash_work_schedule (vregion); } +static void +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (struct mlxsw_sp_acl_tcam_rehash_ctx *ctx) +{ +/* The entry markers are relative to the current chunk and therefore +* needs to be reset together with the chunk marker. +*/ + ctx->current_vchunk =NULL ; + ctx->start_ventry =NULL ; + ctx->stop_ventry =NULL ; +} +static void mlxsw_sp_acl_tcam_rehash_ctx_vchunk_changed (struct mlxsw_sp_acl_tcam_vchunk *vchunk) {
@@ -752,7 +763,7 @@ mlxsw_sp_acl_tcam_rehash_ctx_vregion_changed(struct mlxsw_sp_acl_tcam_vregion *v* the current chunk pointer to make sure all chunks * are properly migrated. */ - vregion->rehash.ctx.current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (&vregion->rehash.ctx); } static struct mlxsw_sp_acl_tcam_vregion *
@@ -1220,7 +1231,7 @@ mlxsw_sp_acl_tcam_vchunk_migrate_end(struct mlxsw_sp *mlxsw_sp, {mlxsw_sp_acl_tcam_chunk_destroy (mlxsw_sp, vchunk->chunk2); vchunk->chunk2 =NULL ; - ctx->current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx); } static int
@@ -1252,6 +1263,8 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp, ventry =list_first_entry (&vchunk->ventry_list,typeof (*ventry), list); +WARN_ON (ventry->vchunk != vchunk); +list_for_each_entry_from (ventry, &vchunk->ventry_list, list) {/* During rollback, once we reach the ventry that failed * to migrate, we are done.
@@ -1343,7 +1356,7 @@ mlxsw_sp_acl_tcam_vregion_migrate(struct mlxsw_sp *mlxsw_sp,* to vregion->region. */ swap (vregion->region, vregion->region2); - ctx->current_vchunk =NULL ; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx); ctx->this_is_rollback = true; err2 =mlxsw_sp_acl_tcam_vchunk_migrate_all (mlxsw_sp, vregion, ctx, credits);
@@ -1402,6 +1415,7 @@ mlxsw_sp_acl_tcam_vregion_rehash_start(struct mlxsw_sp *mlxsw_sp, ctx->hints_priv = hints_priv; ctx->this_is_rollback = false; +mlxsw_sp_acl_tcam_rehash_ctx_vchunk_reset (ctx);return 0 ;
Signature · 1 line
2.43.0
Re: [PATCH net 7/9] mlxsw: spectrum_acl_tcam: Fix warning during rehash
Quoted 44 lines · Petr Machata
From: Ido Schimmel <[email protected]>
As previously explained, the rehash delayed work migrates filters from one region to another. This is done by iterating over all chunks (all the filters with the same priority) in the region and in each chunk iterating over all the filters.
When the work runs out of credits it stores the current chunk and entry as markers in the per-work context so that it would know where to resume the migration from the next time the work is scheduled.
Upon error, the chunk marker is reset to NULL, but without resetting the entry markers despite being relative to it. This can result in migration being resumed from an entry that does not belong to the chunk being migrated. In turn, this will eventually lead to a chunk being iterated over as if it is an entry. Because of how the two structures happen to be defined, this does not lead to KASAN splats, but to warnings such as [1].
Fix by creating a helper that resets all the markers and call it from all the places the currently only reset the chunk marker. For good measures also call it when starting a completely new rehash. Add a warning to avoid future cases.
[1]
WARNING: CPU: 7 PID: 1076 at drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.c:407 mlxsw_afk_encode+0x242/0x2f0 Modules linked in: CPU: 7 PID: 1076 Comm: kworker/7:24 Tainted: G W 6.9.0-rc3-custom-00880-g29e61d91b77b #29 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_afk_encode+0x242/0x2f0 [...] Call Trace: <TASK> mlxsw_sp_acl_atcam_entry_add+0xd9/0x3c0 mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x109/0x290 mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x470 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 </TASK>
Quoted 5 lines
Fixes 6f9579d4e302 ("mlxsw: spectrum_acl: Remember where to continue rehash migration")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
Petr Machata
maintainerPATCH 8/9 mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
Both the function that migrates all the chunks within a region and the function that migrates all the entries within a chunk call list_first_entry() on the respective lists without checking that the lists are not empty. This is incorrect usage of the API, which leads to the following warning [1].
Fix by returning if the lists are empty as there is nothing to migrate in this case.
[1]
WARNING: CPU: 0 PID: 6437 at drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c:1266 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x1f1/0> Modules linked in: CPU: 0 PID: 6437 Comm: kworker/0:37 Not tainted 6.9.0-rc3-custom-00883-g94a65f079ef6 #39 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_tcam_vchunk_migrate_all+0x1f1/0x2c0 [...] Call Trace: <TASK> mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x4a0 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +7 -0
@@ -1254,6 +1254,9 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp,return 0 ; } +if (list_empty (&vchunk->ventry_list)) + goto out; +/* If the migration got interrupted, we have the ventry to start from * stored in context. */
@@ -1305,6 +1308,7 @@ mlxsw_sp_acl_tcam_vchunk_migrate_one(struct mlxsw_sp *mlxsw_sp, } } +out:mlxsw_sp_acl_tcam_vchunk_migrate_end (mlxsw_sp, vchunk, ctx);return 0 ; }
@@ -1318,6 +1322,9 @@ mlxsw_sp_acl_tcam_vchunk_migrate_all(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam_vchunk *vchunk;int err; +if (list_empty (&vregion->vchunk_list)) +return 0 ; +/* If the migration got interrupted, we have the vchunk * we are working on stored in context. */
Signature · 1 line
2.43.0
Re: [PATCH net 8/9] mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
Quoted 29 lines · Petr Machata
From: Ido Schimmel <[email protected]>
Both the function that migrates all the chunks within a region and the function that migrates all the entries within a chunk call
list_first_entry()on the respective lists without checking that the lists are not empty. This is incorrect usage of the API, which leads to the following warning [1].Fix by returning if the lists are empty as there is nothing to migrate in this case.
[1]
WARNING: CPU: 0 PID: 6437 at drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c:1266 mlxsw_sp_acl_tcam_vchunk_migrate_all+0x1f1/0> Modules linked in: CPU: 0 PID: 6437 Comm: kworker/0:37 Not tainted 6.9.0-rc3-custom-00883-g94a65f079ef6 #39 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_tcam_vchunk_migrate_all+0x1f1/0x2c0 [...] Call Trace: <TASK> mlxsw_sp_acl_tcam_vregion_rehash_work+0x6c/0x4a0 process_one_work+0x151/0x370 worker_thread+0x2cb/0x3e0 kthread+0xd0/0x100 ret_from_fork+0x34/0x50 ret_from_fork_asm+0x1a/0x30 </TASK>
Quoted 5 lines
Fixes 6f9579d4e302 ("mlxsw: spectrum_acl: Remember where to continue rehash migration")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Reviewed-by Petr Machata <[email protected]>Signed-off-by Petr Machata <[email protected]>
Petr Machata
maintainerPATCH 9/9 mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
In reply to Petr MachataFrom: Ido Schimmel <[email protected]>
The rehash delayed work is rescheduled with a delay if the number of credits at end of the work is not negative as supposedly it means that the migration ended. Otherwise, it is rescheduled immediately.
After "mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash" the above is no longer accurate as a non-negative number of credits is no longer indicative of the migration being done. It can also happen if the work encountered an error in which case the migration will resume the next time the work is scheduled.
The significance of the above is that it is possible for the work to be pending and associated with hints that were allocated when the migration started. This leads to the hints being leaked [1] when the work is canceled while pending as part of ACL region dismantle.
Fix by freeing the hints if hints are associated with a work that was canceled while pending.
Blame the original commit since the reliance on not having a pending work associated with hints is fragile.
[1]
unreferenced object 0xffff88810e7c3000 (size 256):
comm "kworker/0:16", pid 176, jiffies 4295460353 hex dump (first 32 bytes):
00 30 95 11 81 88 ff ff 61 00 00 00 00 00 00 80 .0......a.......
00 00 61 00 40 00 00 00 00 00 00 00 04 00 00 00 ..a.@...........
backtrace (crc 2544ddb9):
[<00000000cf8cfab3>] kmalloc_trace+0x23f/0x2a0
[<000000004d9a1ad9>] objagg_hints_get+0x42/0x390
[<000000000b143cf3>] mlxsw_sp_acl_erp_rehash_hints_get+0xca/0x400
[<0000000059bdb60a>] mlxsw_sp_acl_tcam_vregion_rehash_work+0x868/0x1160
[<00000000e81fd734>] process_one_work+0x59c/0xf20
[<00000000ceee9e81>] worker_thread+0x799/0x12c0
[<00000000bda6fe39>] kthread+0x246/0x300
[<0000000070056d23>] ret_from_fork+0x34/0x70
[<00000000dea2b93e>] ret_from_fork_asm+0x1a/0x30--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +5 -1
@@ -836,10 +836,14 @@ mlxsw_sp_acl_tcam_vregion_destroy(struct mlxsw_sp *mlxsw_sp,struct mlxsw_sp_acl_tcam *tcam = vregion->tcam;if (vgroup->vregion_rehash_enabled && ops->region_rehash_hints_get) { +struct mlxsw_sp_acl_tcam_rehash_ctx *ctx = &vregion->rehash.ctx; +mutex_lock (&tcam->lock);list_del (&vregion->tlist);mutex_unlock (&tcam->lock); -cancel_delayed_work_sync (&vregion->rehash.dw); +if (cancel_delayed_work_sync (&vregion->rehash.dw) && + ctx->hints_priv) + ops->region_rehash_hints_put (ctx->hints_priv); }mlxsw_sp_acl_tcam_vgroup_vregion_detach (mlxsw_sp, vregion);if (vregion->region2)
Signature · 1 line
2.43.0
Re: [PATCH net 9/9] mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
Quoted 40 lines · Petr Machata
From: Ido Schimmel <[email protected]>
The rehash delayed work is rescheduled with a delay if the number of credits at end of the work is not negative as supposedly it means that the migration ended. Otherwise, it is rescheduled immediately.
After "mlxsw:
spectrum_acl_tcam: Fix possible use-after-free during rehash" the above is no longer accurate as a non-negative number of credits is no longer indicative of the migration being done. It can also happen if the work encountered an error in which case the migration will resume the next time the work is scheduled.The significance of the above is that it is possible for the work to be pending and associated with hints that were allocated when the migration started. This leads to the hints being leaked [1] when the work is canceled while pending as part of ACL region dismantle.
Fix by freeing the hints if hints are associated with a work that was canceled while pending.
Blame the original commit since the reliance on not having a pending work associated with hints is fragile.
[1]
unreferenced object0xffff88810e7c3000(size 256):
comm "kworker/0:16", pid 176, jiffies 4295460353 hex dump (first 32 bytes):00 30 95 11 81 88 ff ff 61 00 00 00 00 00 00 80 .0......a....... 00 00 61 00 40 00 00 00 00 00 00 00 04 00 00 00 ..a.@........... backtrace (crc 2544ddb9): [<00000000cf8cfab3>] kmalloc_trace+0x23f/0x2a0 [<000000004d9a1ad9>] objagg_hints_get+0x42/0x390 [<000000000b143cf3>] mlxsw_sp_acl_erp_rehash_hints_get+0xca/0x400 [<0000000059bdb60a>] mlxsw_sp_acl_tcam_vregion_rehash_work+0x868/0x1160 [<00000000e81fd734>] process_one_work+0x59c/0xf20 [<00000000ceee9e81>] worker_thread+0x799/0x12c0 [<00000000bda6fe39>] kthread+0x246/0x300 [<0000000070056d23>] ret_from_fork+0x34/0x70 [<00000000dea2b93e>] ret_from_fork_asm+0x1a/0x30
Quoted 4 lines
Fixes c9c9af91f1d9 ("mlxsw: spectrum_acl: Allow to interrupt/continue rehash work")Signed-off-by Ido Schimmel <[email protected]>Tested-by Alexander Zubkov <[email protected]>Signed-off-by Petr Machata <[email protected]>
This series was applied to netdev/net.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net.git (main)
by Jakub Kicinski <[email protected]>:
Quoted 17 lines · On Mon, 22 Apr 2024 17:25:53 +0200 you wrote:
Ido Schimmel writes:
Fix various problems in the ACL (i.e., flower offload) code. See the commit messages for more details.
Ido Schimmel (9):
mlxsw:spectrum_acl_tcam: Fix race in region ID allocation
mlxsw:spectrum_acl_tcam: Fix race during rehash delayed work
mlxsw:spectrum_acl_tcam: Fix possible use-after-free during activity
update
mlxsw:spectrum_acl_tcam: Fix possible use-after-free during rehash
mlxsw:spectrum_acl_tcam: Rate limit error message
mlxsw:spectrum_acl_tcam: Fix memory leak during rehash
mlxsw:spectrum_acl_tcam: Fix warning during rehash
mlxsw:spectrum_acl_tcam: Fix incorrect list API usage
mlxsw:spectrum_acl_tcam: Fix memory leak when canceling rehash work
Quoted 1 line
[...]
Here is the summary with links:
- [net,1/9] mlxsw: spectrum_acl_tcam: Fix race in region ID allocation
https://git.kernel.org/netdev/net/c/627f9c1bb882 - [net,2/9] mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work https://git.kernel.org/netdev/net/c/d90cfe205624 - [net,3/9] mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update https://git.kernel.org/netdev/net/c/79b5b4b18bc8 - [net,4/9] mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash https://git.kernel.org/netdev/net/c/542259888899 - [net,5/9] mlxsw: spectrum_acl_tcam: Rate limit error message https://git.kernel.org/netdev/net/c/5bcf925587e9 - [net,6/9] mlxsw: spectrum_acl_tcam: Fix memory leak during rehash https://git.kernel.org/netdev/net/c/8ca3f7a7b613 - [net,7/9] mlxsw: spectrum_acl_tcam: Fix warning during rehash https://git.kernel.org/netdev/net/c/743edc8547a9 - [net,8/9] mlxsw: spectrum_acl_tcam: Fix incorrect list API usage https://git.kernel.org/netdev/net/c/b377add0f011 - [net,9/9] mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work https://git.kernel.org/netdev/net/c/fb4e2b70a719
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html