qat: refactor error handling and add mutex locks

Error handling in qat driver code has been refactored.
Mutex lock handling has also been added during driver
attach and detach. Also pci_disable_busmaster() is called in
adf_detach() to ensure proper cleanup during device detachment.

Reviewed by:	markj, ziaee
MFC after:	2 weeks
Sponsored by:   Intel Corporation
Differential Revision:  https://reviews.freebsd.org/D50379

(cherry picked from commit ae1dc27639)
This commit is contained in:
Hareshx Sankar Raj 2025-05-07 05:32:10 -04:00 committed by Franco Fichtner
parent cfb6574431
commit 4e2ec609ae
8 changed files with 121 additions and 53 deletions

View file

@ -449,12 +449,6 @@ adf_dev_start_locked(struct adf_accel_dev *accel_dev)
struct list_head *list_itr;
set_bit(ADF_STATUS_STARTING, &accel_dev->status);
if (adf_devmgr_verify_id(&accel_dev->accel_id)) {
device_printf(GET_DEV(accel_dev),
"QAT: Device %d not found\n",
accel_dev->accel_id);
return ENODEV;
}
if (adf_ae_start(accel_dev)) {
device_printf(GET_DEV(accel_dev), "AE Start Failed\n");
return EFAULT;
@ -556,13 +550,6 @@ adf_dev_stop_locked(struct adf_accel_dev *accel_dev)
struct service_hndl *service;
struct list_head *list_itr;
if (adf_devmgr_verify_id(&accel_dev->accel_id)) {
device_printf(GET_DEV(accel_dev),
"QAT: Device %d not found\n",
accel_dev->accel_id);
return ENODEV;
}
if (!test_bit(ADF_STATUS_CONFIGURED, &accel_dev->status))
return 0;

View file

@ -84,7 +84,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int i = 0, bar_nr = 0, reg_val = 0;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@ -96,6 +96,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -108,9 +109,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called
*/
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -213,18 +215,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -243,8 +247,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -260,7 +269,9 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -158,7 +158,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int bar_nr;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 512. Implemented to avoid the issue of
@ -170,6 +170,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -180,9 +181,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called
*/
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -273,18 +275,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -303,8 +307,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -320,7 +329,9 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -101,6 +101,7 @@ adf_attach(device_t dev)
struct adf_cfg_device *cfg_dev = NULL;
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
accel_dev->is_vf = true;
pf = adf_devmgr_pci_to_accel_dev(pci_find_pf(dev));
@ -112,11 +113,13 @@ adf_attach(device_t dev)
accel_pci_dev->node = 0;
/* Add accel device to accel table */
if (adf_devmgr_add_dev(accel_dev, pf)) {
ret = adf_devmgr_add_dev(accel_dev, pf);
if (ret) {
device_printf(GET_DEV(accel_dev),
"Failed to add new accelerator device.\n");
return -EFAULT;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
hw_data = malloc(sizeof(*hw_data), M_QAT_4XXXVF, M_WAITOK | M_ZERO);
accel_dev->hw_device = hw_data;
@ -152,6 +155,8 @@ adf_attach(device_t dev)
NULL,
NULL,
&accel_dev->dma_tag);
if (ret)
goto out_err;
hw_data->accel_capabilities_mask = adf_4xxxvf_get_hw_cap(accel_dev);
@ -180,7 +185,9 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
@ -190,7 +197,7 @@ adf_attach(device_t dev)
ret = hw_data->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (!ret)
@ -212,8 +219,13 @@ adf_attach(device_t dev)
return ret;
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -231,7 +243,9 @@ adf_detach(device_t dev)
clear_bit(ADF_STATUS_RESTARTING, &accel_dev->status);
adf_dev_stop(accel_dev);
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -84,7 +84,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int i, bar_nr;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@ -95,6 +95,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -106,9 +107,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called */
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -202,18 +204,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -232,8 +236,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -249,7 +258,9 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -84,7 +84,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int i, bar_nr;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@ -96,6 +96,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -108,9 +109,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called
*/
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -201,18 +203,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_start(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -231,8 +235,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -248,7 +257,9 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -84,7 +84,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int i, bar_nr;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@ -95,6 +95,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -106,9 +107,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called */
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -203,18 +205,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -233,8 +237,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -250,7 +259,9 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}

View file

@ -84,7 +84,7 @@ adf_attach(device_t dev)
struct adf_accel_pci *accel_pci_dev;
struct adf_hw_device_data *hw_data;
unsigned int i, bar_nr;
int ret, rid;
int ret = 0, rid;
struct adf_cfg_device *cfg_dev = NULL;
/* Set pci MaxPayLoad to 256. Implemented to avoid the issue of
@ -95,6 +95,7 @@ adf_attach(device_t dev)
accel_dev = device_get_softc(dev);
mutex_init(&accel_dev->lock);
INIT_LIST_HEAD(&accel_dev->crypto_list);
accel_pci_dev = &accel_dev->accel_pci_dev;
accel_pci_dev->pci_dev = dev;
@ -104,9 +105,10 @@ adf_attach(device_t dev)
/* Add accel device to accel table.
* This should be called before adf_cleanup_accel is called */
if (adf_devmgr_add_dev(accel_dev, NULL)) {
ret = adf_devmgr_add_dev(accel_dev, NULL);
if (ret) {
device_printf(dev, "Failed to add new accelerator device.\n");
return ENXIO;
goto out_err_lock;
}
/* Allocate and configure device configuration structure */
@ -191,18 +193,20 @@ adf_attach(device_t dev)
bar->base_addr = rman_get_start(bar->virt_addr);
bar->size = rman_get_size(bar->virt_addr);
}
pci_enable_busmaster(dev);
ret = pci_enable_busmaster(dev);
if (ret)
goto out_err;
adf_dbgfs_init(accel_dev);
if (!accel_dev->hw_device->config_device) {
ret = EFAULT;
goto out_err;
goto out_err_disable;
}
ret = accel_dev->hw_device->config_device(accel_dev);
if (ret)
goto out_err;
goto out_err_disable;
ret = adf_dev_init(accel_dev);
if (ret)
@ -221,8 +225,13 @@ out_dev_stop:
adf_dev_stop(accel_dev);
out_dev_shutdown:
adf_dev_shutdown(accel_dev);
out_err_disable:
pci_disable_busmaster(dev);
out_err:
adf_cleanup_accel(accel_dev);
out_err_lock:
mutex_destroy(&accel_dev->lock);
return ret;
}
@ -238,7 +247,10 @@ adf_detach(device_t dev)
adf_dev_shutdown(accel_dev);
pci_disable_busmaster(dev);
adf_cleanup_accel(accel_dev);
mutex_destroy(&accel_dev->lock);
return 0;
}