2022-08-25 14:21:09

by Yang Yingliang

[permalink] [raw]
Subject: [PATCH -next] habanalabs/gaudi2: fix free irq in error path in gaudi2_enable_msix()

Add two variables to store completion irq and event queue irq. And add
a new lable to free event queue irq in error path in gaudi2_enable_msix().

Fixes: d7bb1ac89b2f ("habanalabs: add gaudi2 asic-specific code")
Signed-off-by: Yang Yingliang <[email protected]>
---
drivers/misc/habanalabs/gaudi2/gaudi2.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/misc/habanalabs/gaudi2/gaudi2.c b/drivers/misc/habanalabs/gaudi2/gaudi2.c
index 98336a1a84b0..54eca19b270b 100644
--- a/drivers/misc/habanalabs/gaudi2/gaudi2.c
+++ b/drivers/misc/habanalabs/gaudi2/gaudi2.c
@@ -3518,6 +3518,7 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
struct asic_fixed_properties *prop = &hdev->asic_prop;
struct gaudi2_device *gaudi2 = hdev->asic_specific;
int rc, irq, i, j, user_irq_init_cnt;
+ int completion_irq, event_queue_irq;
irq_handler_t irq_handler;
struct hl_cq *cq;

@@ -3532,17 +3533,19 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
return rc;
}

- irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
+ completion_irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
- rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
+ rc = request_irq(completion_irq, hl_irq_handler_cq, 0,
+ gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
if (rc) {
dev_err(hdev->dev, "Failed to request IRQ %d", irq);
goto free_irq_vectors;
}

- irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
- rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
- &hdev->event_queue);
+ event_queue_irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
+ rc = request_irq(event_queue_irq, hl_irq_handler_eq, 0,
+ gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
+ &hdev->event_queue);
if (rc) {
dev_err(hdev->dev, "Failed to request IRQ %d", irq);
goto free_completion_irq;
@@ -3551,7 +3554,7 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
rc = gaudi2_dec_enable_msix(hdev);
if (rc) {
dev_err(hdev->dev, "Failed to enable decoder IRQ");
- goto free_completion_irq;
+ goto free_event_queue_irq;
}

for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;
@@ -3582,9 +3585,11 @@ static int gaudi2_enable_msix(struct hl_device *hdev)

gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);

+free_event_queue_irq:
+ free_irq(event_queue_irq, &hdev->event_queue);
+
free_completion_irq:
- irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
- free_irq(irq, cq);
+ free_irq(completion_irq, cq);

free_irq_vectors:
pci_free_irq_vectors(hdev->pdev);
--
2.25.1


2022-08-29 10:57:27

by Oded Gabbay

[permalink] [raw]
Subject: Re: [PATCH -next] habanalabs/gaudi2: fix free irq in error path in gaudi2_enable_msix()

On Thu, Aug 25, 2022 at 4:23 PM Yang Yingliang <[email protected]> wrote:
>
> Add two variables to store completion irq and event queue irq. And add
> a new lable to free event queue irq in error path in gaudi2_enable_msix().
>
> Fixes: d7bb1ac89b2f ("habanalabs: add gaudi2 asic-specific code")
> Signed-off-by: Yang Yingliang <[email protected]>
> ---
> drivers/misc/habanalabs/gaudi2/gaudi2.c | 21 +++++++++++++--------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/misc/habanalabs/gaudi2/gaudi2.c b/drivers/misc/habanalabs/gaudi2/gaudi2.c
> index 98336a1a84b0..54eca19b270b 100644
> --- a/drivers/misc/habanalabs/gaudi2/gaudi2.c
> +++ b/drivers/misc/habanalabs/gaudi2/gaudi2.c
> @@ -3518,6 +3518,7 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
> struct asic_fixed_properties *prop = &hdev->asic_prop;
> struct gaudi2_device *gaudi2 = hdev->asic_specific;
> int rc, irq, i, j, user_irq_init_cnt;
> + int completion_irq, event_queue_irq;
> irq_handler_t irq_handler;
> struct hl_cq *cq;
>
> @@ -3532,17 +3533,19 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
> return rc;
> }
>
> - irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
> + completion_irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
> cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
> - rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
> + rc = request_irq(completion_irq, hl_irq_handler_cq, 0,
> + gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
> if (rc) {
> dev_err(hdev->dev, "Failed to request IRQ %d", irq);
Please fix the error prints to print the correct irq.
And I think you should remove the "irq" local variable completely.

Oded

> goto free_irq_vectors;
> }
>
> - irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
> - rc = request_irq(irq, hl_irq_handler_eq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
> - &hdev->event_queue);
> + event_queue_irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_EVENT_QUEUE);
> + rc = request_irq(event_queue_irq, hl_irq_handler_eq, 0,
> + gaudi2_irq_name(GAUDI2_IRQ_NUM_EVENT_QUEUE),
> + &hdev->event_queue);
> if (rc) {
> dev_err(hdev->dev, "Failed to request IRQ %d", irq);
> goto free_completion_irq;
> @@ -3551,7 +3554,7 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
> rc = gaudi2_dec_enable_msix(hdev);
> if (rc) {
> dev_err(hdev->dev, "Failed to enable decoder IRQ");
> - goto free_completion_irq;
> + goto free_event_queue_irq;
> }
>
> for (i = GAUDI2_IRQ_NUM_USER_FIRST, j = prop->user_dec_intr_count, user_irq_init_cnt = 0;
> @@ -3582,9 +3585,11 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
>
> gaudi2_dec_disable_msix(hdev, GAUDI2_IRQ_NUM_SHARED_DEC1_ABNRM + 1);
>
> +free_event_queue_irq:
> + free_irq(event_queue_irq, &hdev->event_queue);
> +
> free_completion_irq:
> - irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
> - free_irq(irq, cq);
> + free_irq(completion_irq, cq);
>
> free_irq_vectors:
> pci_free_irq_vectors(hdev->pdev);
> --
> 2.25.1
>

2022-09-13 02:32:31

by Yang Yingliang

[permalink] [raw]
Subject: Re: [PATCH -next] habanalabs/gaudi2: fix free irq in error path in gaudi2_enable_msix()


On 2022/8/29 18:14, Oded Gabbay wrote:
> On Thu, Aug 25, 2022 at 4:23 PM Yang Yingliang <[email protected]> wrote:
>> Add two variables to store completion irq and event queue irq. And add
>> a new lable to free event queue irq in error path in gaudi2_enable_msix().
>>
>> Fixes: d7bb1ac89b2f ("habanalabs: add gaudi2 asic-specific code")
>> Signed-off-by: Yang Yingliang <[email protected]>
>> ---
>> drivers/misc/habanalabs/gaudi2/gaudi2.c | 21 +++++++++++++--------
>> 1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/misc/habanalabs/gaudi2/gaudi2.c b/drivers/misc/habanalabs/gaudi2/gaudi2.c
>> index 98336a1a84b0..54eca19b270b 100644
>> --- a/drivers/misc/habanalabs/gaudi2/gaudi2.c
>> +++ b/drivers/misc/habanalabs/gaudi2/gaudi2.c
>> @@ -3518,6 +3518,7 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
>> struct asic_fixed_properties *prop = &hdev->asic_prop;
>> struct gaudi2_device *gaudi2 = hdev->asic_specific;
>> int rc, irq, i, j, user_irq_init_cnt;
>> + int completion_irq, event_queue_irq;
>> irq_handler_t irq_handler;
>> struct hl_cq *cq;
>>
>> @@ -3532,17 +3533,19 @@ static int gaudi2_enable_msix(struct hl_device *hdev)
>> return rc;
>> }
>>
>> - irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
>> + completion_irq = pci_irq_vector(hdev->pdev, GAUDI2_IRQ_NUM_COMPLETION);
>> cq = &hdev->completion_queue[GAUDI2_RESERVED_CQ_CS_COMPLETION];
>> - rc = request_irq(irq, hl_irq_handler_cq, 0, gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
>> + rc = request_irq(completion_irq, hl_irq_handler_cq, 0,
>> + gaudi2_irq_name(GAUDI2_IRQ_NUM_COMPLETION), cq);
>> if (rc) {
>> dev_err(hdev->dev, "Failed to request IRQ %d", irq);
> Please fix the error prints to print the correct irq.
OK.
> And I think you should remove the "irq" local variable completely.
'irq' will be used later, it can not be removed.

Thanks,
Yang
>
> Oded
>