vdpa/mlx5: Keep notifiers during suspend but ignore
Unregistering notifiers is a costly operation. Instead of removing the notifiers during device suspend and adding them back at resume, simply ignore the call when the device is suspended. At resume time call queue_link_work() to make sure that the device state is propagated in case there were changes. For 1 vDPA device x 32 VQs (16 VQPs) attached to a large VM (256 GB RAM, 32 CPUs x 2 threads per core), the device suspend time is reduced from ~13 ms to ~2.5 ms. Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Acked-by: Eugenio Pérez <eperezma@redhat.com> Message-Id: <20240816090159.1967650-9-dtatulea@nvidia.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Lei Yang <leiyang@redhat.com>
This commit is contained in:
parent
5eb8c7eb1e
commit
55a7cb05b0
@ -2850,6 +2850,9 @@ static int event_handler(struct notifier_block *nb, unsigned long event, void *p
|
||||
struct mlx5_eqe *eqe = param;
|
||||
int ret = NOTIFY_DONE;
|
||||
|
||||
if (ndev->mvdev.suspended)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (event == MLX5_EVENT_TYPE_PORT_CHANGE) {
|
||||
switch (eqe->sub_type) {
|
||||
case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
|
||||
@ -3595,7 +3598,6 @@ static int mlx5_vdpa_suspend(struct vdpa_device *vdev)
|
||||
mlx5_vdpa_info(mvdev, "suspending device\n");
|
||||
|
||||
down_write(&ndev->reslock);
|
||||
unregister_link_notifier(ndev);
|
||||
err = suspend_vqs(ndev, 0, ndev->cur_num_vqs);
|
||||
mlx5_vdpa_cvq_suspend(mvdev);
|
||||
mvdev->suspended = true;
|
||||
@ -3617,7 +3619,7 @@ static int mlx5_vdpa_resume(struct vdpa_device *vdev)
|
||||
down_write(&ndev->reslock);
|
||||
mvdev->suspended = false;
|
||||
err = resume_vqs(ndev, 0, ndev->cur_num_vqs);
|
||||
register_link_notifier(ndev);
|
||||
queue_link_work(ndev);
|
||||
up_write(&ndev->reslock);
|
||||
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user