mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
vfio/mlx5: Fix racy bitfields and tighten struct layout
Bitfield operations are not atomic, they use a read-modify-write
pattern, therefore we should be careful not to pack bitfields that
can be concurrently updated into the same storage unit.
This split takes a binary approach: flags that are only modified
pre/post open/close remain bitfields, flags modified from user
action, including actions that reach across to another device (ex.
reset) use dedicated storage units.
Note mlx5_vhca_page_tracker.status is relocated to fill the alignment
hole this split exposes.
Bitfield justifications:
migrate_cap: written only in mlx5vf_cmd_set_migratable() at probe
chunk_mode: written only in mlx5vf_cmd_set_migratable() at probe
mig_state_cap: written only in mlx5vf_cmd_set_migratable() at probe
Dedicated storage units:
mdev_detach: written in the VF attach/detach event notifier
mlx5fv_vf_event() at runtime
log_active: written in mlx5vf_start_page_tracker()/
mlx5vf_stop_page_tracker() during runtime dirty tracking
deferred_reset: written in mlx5vf_state_mutex_unlock()/
mlx5vf_pci_aer_reset_done() during runtime reset handling
is_err: set by tracker error handling and dirty-log polling at runtime
object_changed: set by tracker event handling and cleared by dirty-log
polling at runtime
Fixes: 61a2f1460f ("vfio/mlx5: Manage the VF attach/detach callback from the PF")
Fixes: 79c3cf2799 ("vfio/mlx5: Init QP based resources for dirty tracking")
Fixes: f886473071 ("vfio/mlx5: Add support for tracker object change event")
Cc: Yishai Hadas <yishaih@nvidia.com>
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Alex Williamson <alex.williamson@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20260615191241.688297-5-alex.williamson@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
This commit is contained in:
parent
e73638e55f
commit
f2365a63b0
|
|
@ -158,26 +158,29 @@ struct mlx5_vhca_qp {
|
|||
struct mlx5_vhca_page_tracker {
|
||||
u32 id;
|
||||
u32 pdn;
|
||||
u8 is_err:1;
|
||||
u8 object_changed:1;
|
||||
/* Flags modified at runtime - dedicated storage unit */
|
||||
u8 is_err;
|
||||
u8 object_changed;
|
||||
int status;
|
||||
struct mlx5_uars_page *uar;
|
||||
struct mlx5_vhca_cq cq;
|
||||
struct mlx5_vhca_qp *host_qp;
|
||||
struct mlx5_vhca_qp *fw_qp;
|
||||
struct mlx5_nb nb;
|
||||
int status;
|
||||
};
|
||||
|
||||
struct mlx5vf_pci_core_device {
|
||||
struct vfio_pci_core_device core_device;
|
||||
int vf_id;
|
||||
u16 vhca_id;
|
||||
/* Flags only modified on setup/release - bitfield ok */
|
||||
u8 migrate_cap:1;
|
||||
u8 deferred_reset:1;
|
||||
u8 mdev_detach:1;
|
||||
u8 log_active:1;
|
||||
u8 chunk_mode:1;
|
||||
u8 mig_state_cap:1;
|
||||
/* Flags modified at runtime - dedicated storage unit */
|
||||
u8 mdev_detach;
|
||||
u8 log_active;
|
||||
u8 deferred_reset;
|
||||
struct completion tracker_comp;
|
||||
/* protect migration state */
|
||||
struct mutex state_mutex;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user