crypto: qat - ensure correct order in VF restarting handler
authorMichal Witwicki <michal.witwicki@intel.com>
Wed, 17 Jul 2024 11:44:59 +0000 (07:44 -0400)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 2 Aug 2024 13:11:20 +0000 (21:11 +0800)
In the process of sending the ADF_PF2VF_MSGTYPE_RESTARTING message to
Virtual Functions (VFs), the Physical Function (PF) should set the
`vf->restarting` flag to true before dispatching the message.
This change is necessary to prevent a race condition where the handling
of the ADF_VF2PF_MSGTYPE_RESTARTING_COMPLETE message (which sets the
`vf->restarting` flag to false) runs immediately after the message is sent,
but before the flag is set to true.

Set the `vf->restarting` to true before sending the message
ADF_PF2VF_MSGTYPE_RESTARTING, if supported by the version of the
protocol and if the VF is started.

Fixes: ec26f8e6c784 ("crypto: qat - update PFVF protocol for recovery")
Signed-off-by: Michal Witwicki <michal.witwicki@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_common/adf_pfvf_pf_msg.c

index 0e31f4b41844e0a8d53de4000c4d574afab989f4..0cee3b23dee90bf8b033463b3fadcd6196cb534d 100644 (file)
@@ -18,14 +18,17 @@ void adf_pf2vf_notify_restarting(struct adf_accel_dev *accel_dev)
 
        dev_dbg(&GET_DEV(accel_dev), "pf2vf notify restarting\n");
        for (i = 0, vf = accel_dev->pf.vf_info; i < num_vfs; i++, vf++) {
-               vf->restarting = false;
+               if (vf->init && vf->vf_compat_ver >= ADF_PFVF_COMPAT_FALLBACK)
+                       vf->restarting = true;
+               else
+                       vf->restarting = false;
+
                if (!vf->init)
                        continue;
+
                if (adf_send_pf2vf_msg(accel_dev, i, msg))
                        dev_err(&GET_DEV(accel_dev),
                                "Failed to send restarting msg to VF%d\n", i);
-               else if (vf->vf_compat_ver >= ADF_PFVF_COMPAT_FALLBACK)
-                       vf->restarting = true;
        }
 }