drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
The adf_init_aer() won't destroy device_reset_wq when alloc_workqueue()
for device_sriov_wq failed. Add destroy_workqueue for device_reset_wq to
fix this issue.
Fixes: 4469f9b23468 ("crypto: qat - re-enable sriov after pf reset")
Signed-off-by: Wang Hai <wanghai38@huawei.com>
---
drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_aer.c b/drivers/crypto/intel/qat/qat_common/adf_aer.c
index ec7913ab00a2..907144ec7e65 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_aer.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_aer.c
@@ -281,8 +281,10 @@ int adf_init_aer(void)
return -EFAULT;
device_sriov_wq = alloc_workqueue("qat_device_sriov_wq", 0, 0);
- if (!device_sriov_wq)
+ if (!device_sriov_wq) {
+ destroy_workqueue(device_reset_wq);
return -EFAULT;
+ }
return 0;
}
--
2.17.1
On Thu, Oct 24, 2024 at 10:00:57PM +0800, Wang Hai wrote: > The adf_init_aer() won't destroy device_reset_wq when alloc_workqueue() > for device_sriov_wq failed. Add destroy_workqueue for device_reset_wq to > fix this issue. > > Fixes: 4469f9b23468 ("crypto: qat - re-enable sriov after pf reset") > Signed-off-by: Wang Hai <wanghai38@huawei.com> > --- > drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/crypto/intel/qat/qat_common/adf_aer.c b/drivers/crypto/intel/qat/qat_common/adf_aer.c > index ec7913ab00a2..907144ec7e65 100644 > --- a/drivers/crypto/intel/qat/qat_common/adf_aer.c > +++ b/drivers/crypto/intel/qat/qat_common/adf_aer.c > @@ -281,8 +281,10 @@ int adf_init_aer(void) > return -EFAULT; > > device_sriov_wq = alloc_workqueue("qat_device_sriov_wq", 0, 0); > - if (!device_sriov_wq) > + if (!device_sriov_wq) { > + destroy_workqueue(device_reset_wq); The missing destroy_workqueue() here is intentional as the device_reset_wq is destroyed in adf_exit_aer() which is called if adf_init_aer() fails, see [1]. With this change, destroy_workqueue() is called twice. Regards, -- Giovanni [1] https://elixir.bootlin.com/linux/v6.11.5/source/drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c#L425
On 2024/10/24 23:04, Cabiddu, Giovanni wrote: > On Thu, Oct 24, 2024 at 10:00:57PM +0800, Wang Hai wrote: >> The adf_init_aer() won't destroy device_reset_wq when alloc_workqueue() >> for device_sriov_wq failed. Add destroy_workqueue for device_reset_wq to >> fix this issue. >> >> Fixes: 4469f9b23468 ("crypto: qat - re-enable sriov after pf reset") >> Signed-off-by: Wang Hai <wanghai38@huawei.com> >> --- >> drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++- >> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/crypto/intel/qat/qat_common/adf_aer.c b/drivers/crypto/intel/qat/qat_common/adf_aer.c >> index ec7913ab00a2..907144ec7e65 100644 >> --- a/drivers/crypto/intel/qat/qat_common/adf_aer.c >> +++ b/drivers/crypto/intel/qat/qat_common/adf_aer.c >> @@ -281,8 +281,10 @@ int adf_init_aer(void) >> return -EFAULT; >> >> device_sriov_wq = alloc_workqueue("qat_device_sriov_wq", 0, 0); >> - if (!device_sriov_wq) >> + if (!device_sriov_wq) { >> + destroy_workqueue(device_reset_wq); > The missing destroy_workqueue() here is intentional as the device_reset_wq > is destroyed in adf_exit_aer() which is called if adf_init_aer() fails, > see [1]. > Hi, Giovanni. Thanks for the review. If adf_init_aer() fails, it will goto err_aer and then call adf_exit_misc_wq() instead of goto err_pf_wq and then call adf_exit_aer(). So this patch is needed. static long adf_ctl_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { ... if (adf_init_aer()) goto err_aer; ... err_pf_wq: adf_exit_aer(); // will not be called when adf_init_aer() failed err_aer: adf_exit_misc_wq(); err_misc_wq: ... } > With this change, destroy_workqueue() is called twice. > > Regards, >
On Fri, Oct 25, 2024 at 09:24:52AM +0800, Wang Hai wrote: > > > On 2024/10/24 23:04, Cabiddu, Giovanni wrote: > > On Thu, Oct 24, 2024 at 10:00:57PM +0800, Wang Hai wrote: > > > The adf_init_aer() won't destroy device_reset_wq when alloc_workqueue() > > > for device_sriov_wq failed. Add destroy_workqueue for device_reset_wq to > > > fix this issue. > > > > > > Fixes: 4469f9b23468 ("crypto: qat - re-enable sriov after pf reset") > > > Signed-off-by: Wang Hai <wanghai38@huawei.com> > > > --- > > > drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++- > > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/crypto/intel/qat/qat_common/adf_aer.c b/drivers/crypto/intel/qat/qat_common/adf_aer.c > > > index ec7913ab00a2..907144ec7e65 100644 > > > --- a/drivers/crypto/intel/qat/qat_common/adf_aer.c > > > +++ b/drivers/crypto/intel/qat/qat_common/adf_aer.c > > > @@ -281,8 +281,10 @@ int adf_init_aer(void) > > > return -EFAULT; > > > device_sriov_wq = alloc_workqueue("qat_device_sriov_wq", 0, 0); > > > - if (!device_sriov_wq) > > > + if (!device_sriov_wq) { > > > + destroy_workqueue(device_reset_wq); > > The missing destroy_workqueue() here is intentional as the device_reset_wq > > is destroyed in adf_exit_aer() which is called if adf_init_aer() fails, > > see [1]. > > > Hi, Giovanni. > > Thanks for the review. > > If adf_init_aer() fails, it will goto err_aer and then call > adf_exit_misc_wq() instead of goto err_pf_wq and then call > adf_exit_aer(). So this patch is needed. Sorry, I overlooked it. You are right. On the error path I would also set device_reset_wq to NULL. if (!device_sriov_wq) { destroy_workqueue(device_reset_wq); device_reset_wq = NULL; return -EFAULT; } Regards, -- Giovanni
On 2024/10/25 16:32, Cabiddu, Giovanni wrote: > On Fri, Oct 25, 2024 at 09:24:52AM +0800, Wang Hai wrote: >> >> >> On 2024/10/24 23:04, Cabiddu, Giovanni wrote: >>> On Thu, Oct 24, 2024 at 10:00:57PM +0800, Wang Hai wrote: >>>> The adf_init_aer() won't destroy device_reset_wq when alloc_workqueue() >>>> for device_sriov_wq failed. Add destroy_workqueue for device_reset_wq to >>>> fix this issue. >>>> >>>> Fixes: 4469f9b23468 ("crypto: qat - re-enable sriov after pf reset") >>>> Signed-off-by: Wang Hai <wanghai38@huawei.com> >>>> --- >>>> drivers/crypto/intel/qat/qat_common/adf_aer.c | 4 +++- >>>> 1 file changed, 3 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/crypto/intel/qat/qat_common/adf_aer.c b/drivers/crypto/intel/qat/qat_common/adf_aer.c >>>> index ec7913ab00a2..907144ec7e65 100644 >>>> --- a/drivers/crypto/intel/qat/qat_common/adf_aer.c >>>> +++ b/drivers/crypto/intel/qat/qat_common/adf_aer.c >>>> @@ -281,8 +281,10 @@ int adf_init_aer(void) >>>> return -EFAULT; >>>> device_sriov_wq = alloc_workqueue("qat_device_sriov_wq", 0, 0); >>>> - if (!device_sriov_wq) >>>> + if (!device_sriov_wq) { >>>> + destroy_workqueue(device_reset_wq); >>> The missing destroy_workqueue() here is intentional as the device_reset_wq >>> is destroyed in adf_exit_aer() which is called if adf_init_aer() fails, >>> see [1]. >>> >> Hi, Giovanni. >> >> Thanks for the review. >> >> If adf_init_aer() fails, it will goto err_aer and then call >> adf_exit_misc_wq() instead of goto err_pf_wq and then call >> adf_exit_aer(). So this patch is needed. > Sorry, I overlooked it. You are right. > On the error path I would also set device_reset_wq to NULL. > if (!device_sriov_wq) { > destroy_workqueue(device_reset_wq); > device_reset_wq = NULL; > return -EFAULT; > } > Thanks for the suggestion, I will send a v2 patch > Regards, >
© 2016 - 2024 Red Hat, Inc.