mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 00:39:48 +00:00
crypto: qat - fix state machines cleanup paths
[ Upstream commitc9ca9756f3
] Commit1bdc85550a
("crypto: qat - fix concurrency issue when device state changes") introduced the function adf_dev_down() which wraps the functions adf_dev_stop() and adf_dev_shutdown(). In a subsequent change, the sequence adf_dev_stop() followed by adf_dev_shutdown() was then replaced across the driver with just a call to the function adf_dev_down(). The functions adf_dev_stop() and adf_dev_shutdown() are called in error paths to stop the accelerator and free up resources and can be called even if the counterparts adf_dev_init() and adf_dev_start() did not complete successfully. However, the implementation of adf_dev_down() prevents the stop/shutdown sequence if the device is found already down. For example, if adf_dev_init() fails, the device status is not set as started and therefore a call to adf_dev_down() won't be calling adf_dev_shutdown() to undo what adf_dev_init() did. Do not check if a device is started in adf_dev_down() but do the equivalent check in adf_sysfs.c when handling a DEV_DOWN command from the user. Fixes:2b60f79c7b
("crypto: qat - replace state machine calls") Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Reviewed-by: Adam Guerin <adam.guerin@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
119d4350a5
commit
3b97788e92
2 changed files with 7 additions and 7 deletions
|
@ -440,13 +440,6 @@ int adf_dev_down(struct adf_accel_dev *accel_dev, bool reconfig)
|
|||
|
||||
mutex_lock(&accel_dev->state_lock);
|
||||
|
||||
if (!adf_dev_started(accel_dev)) {
|
||||
dev_info(&GET_DEV(accel_dev), "Device qat_dev%d already down\n",
|
||||
accel_dev->accel_id);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (reconfig) {
|
||||
ret = adf_dev_shutdown_cache_cfg(accel_dev);
|
||||
goto out;
|
||||
|
|
|
@ -52,6 +52,13 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
|
|||
case DEV_DOWN:
|
||||
dev_info(dev, "Stopping device qat_dev%d\n", accel_id);
|
||||
|
||||
if (!adf_dev_started(accel_dev)) {
|
||||
dev_info(&GET_DEV(accel_dev), "Device qat_dev%d already down\n",
|
||||
accel_id);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
ret = adf_dev_down(accel_dev, true);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in a new issue