]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commit
net: sched: flower: refactor reoffload for concurrent access
authorVlad Buslov <vladbu@mellanox.com>
Wed, 24 Apr 2019 06:53:31 +0000 (09:53 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2019 18:53:28 +0000 (11:53 -0700)
commitc049d56eb219661c9ae48d596c3e633973f89d1f
treeed3b8089da89fa4eff606e6ec40c42193d44e43d
parenta3ddd94f3efb3a9eda8ce7183f821a9c4fa3b47f
net: sched: flower: refactor reoffload for concurrent access

Recent changes that introduced unlocked flower did not properly account for
case when reoffload is initiated concurrently with filter updates. To fix
the issue, extend flower with 'hw_filters' list that is used to store
filters that don't have 'skip_hw' flag set. Filter is added to the list
when it is inserted to hardware and only removed from it after being
unoffloaded from all drivers that parent block is attached to. This ensures
that concurrent reoffload can still access filter that is being deleted and
prevents race condition when driver callback can be removed when filter is
no longer accessible trough idr, but is still present in hardware.

Refactor fl_change() to respect new filter reference counter and to release
filter reference with __fl_put() in case of error, instead of directly
deallocating filter memory. This allows for concurrent access to filter
from fl_reoffload() and protects it with reference counting. Refactor
fl_reoffload() to iterate over hw_filters list instead of idr. Implement
fl_get_next_hw_filter() helper function that is used to iterate over
hw_filters list with reference counting and skips filters that are being
concurrently deleted.

Fixes: 92149190067d ("net: sched: flower: set unlocked flag for flower proto ops")
Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Reviewed-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_flower.c