2023-01-07 05:16:35

by Geethasowjanya Akula

[permalink] [raw]
Subject: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context

Use GFP_ATOMIC flag instead of GFP_KERNEL while allocating memory
in atomic context.

Fixes: 4af1b64f80fb ("octeontx2-pf: Fix lmtst ID used in aura free")
Signed-off-by: Sunil Goutham <[email protected]>
Signed-off-by: Geetha sowjanya <[email protected]>
---
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index 88f8772a61cd..12e4365d53df 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -886,7 +886,7 @@ static int otx2_sq_init(struct otx2_nic *pfvf, u16 qidx, u16 sqb_aura)
}

sq->sqe_base = sq->sqe->base;
- sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list), GFP_KERNEL);
+ sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list), GFP_ATOMIC);
if (!sq->sg)
return -ENOMEM;

@@ -1378,7 +1378,7 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)

sq = &qset->sq[qidx];
sq->sqb_count = 0;
- sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_KERNEL);
+ sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_ATOMIC);
if (!sq->sqb_ptrs) {
err = -ENOMEM;
goto err_mem;
--
2.25.1


2023-01-08 13:26:43

by Leon Romanovsky

[permalink] [raw]
Subject: Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context

On Sat, Jan 07, 2023 at 10:11:39AM +0530, Geetha sowjanya wrote:
> Use GFP_ATOMIC flag instead of GFP_KERNEL while allocating memory
> in atomic context.

Awesome, but the changed functions don't run in atomic context.

>
> Fixes: 4af1b64f80fb ("octeontx2-pf: Fix lmtst ID used in aura free")
> Signed-off-by: Sunil Goutham <[email protected]>
> Signed-off-by: Geetha sowjanya <[email protected]>
> ---
> drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> index 88f8772a61cd..12e4365d53df 100644
> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> @@ -886,7 +886,7 @@ static int otx2_sq_init(struct otx2_nic *pfvf, u16 qidx, u16 sqb_aura)
> }
>
> sq->sqe_base = sq->sqe->base;
> - sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list), GFP_KERNEL);
> + sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list), GFP_ATOMIC);
> if (!sq->sg)
> return -ENOMEM;
>
> @@ -1378,7 +1378,7 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)
>
> sq = &qset->sq[qidx];
> sq->sqb_count = 0;
> - sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_KERNEL);
> + sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_ATOMIC);
> if (!sq->sqb_ptrs) {
> err = -ENOMEM;
> goto err_mem;
> --
> 2.25.1
>

2023-01-10 08:26:12

by Geethasowjanya Akula

[permalink] [raw]
Subject: Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context



-----Original Message-----
From: Leon Romanovsky <[email protected]>
Sent: Sunday, January 8, 2023 6:39 PM
To: Geethasowjanya Akula <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Subbaraya Sundeep Bhatta <[email protected]>; Hariprasad Kelam <[email protected]>; Sunil Kovvuri Goutham <[email protected]>
Subject: [EXT] Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context

External Email

----------------------------------------------------------------------
On Sat, Jan 07, 2023 at 10:11:39AM +0530, Geetha sowjanya wrote:
>> Use GFP_ATOMIC flag instead of GFP_KERNEL while allocating memory in
>> atomic context.

>Awesome, but the changed functions don't run in atomic context.

drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
1368 /* Flush accumulated messages */
1369 err = otx2_sync_mbox_msg(&pfvf->mbox);
1370 if (err)
1371 goto fail;
1372
1373 get_cpu();
^^^^^^^^^
The get_cpu() disables preemption.

1374 /* Allocate pointers and free them to aura/pool */
1375 for (qidx = 0; qidx < hw->tot_tx_queues; qidx++) {
1376 pool_id = otx2_get_pool_idx(pfvf, AURA_NIX_SQ, qidx);
1377 pool = &pfvf->qset.pool[pool_id];
1378
1379 sq = &qset->sq[qidx];
1380 sq->sqb_count = 0;
1381 sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_ATOMIC);

>> Fixes: 4af1b64f80fb ("octeontx2-pf: Fix lmtst ID used in aura free")
>> Signed-off-by: Sunil Goutham <[email protected]>
>> Signed-off-by: Geetha sowjanya <[email protected]>
>> ---
>> drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>> b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>> index 88f8772a61cd..12e4365d53df 100644
>> --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>> +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>> @@ -886,7 +886,7 @@ static int otx2_sq_init(struct otx2_nic *pfvf, u16 qidx, u16 sqb_aura)
>> }
>>
>> sq->sqe_base = sq->sqe->base;
>> - sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list), GFP_KERNEL);
>> + sq->sg = kcalloc(qset->sqe_cnt, sizeof(struct sg_list),
>> +GFP_ATOMIC);
>> if (!sq->sg)
>> return -ENOMEM;
>>
>> @@ -1378,7 +1378,7 @@ int otx2_sq_aura_pool_init(struct otx2_nic
>> *pfvf)
>>
>> sq = &qset->sq[qidx];
>> sq->sqb_count = 0;
>> - sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs), GFP_KERNEL);
>> + sq->sqb_ptrs = kcalloc(num_sqbs, sizeof(*sq->sqb_ptrs),
>> +GFP_ATOMIC);
>> if (!sq->sqb_ptrs) {
>> err = -ENOMEM;
>> goto err_mem;
>> --
>> 2.25.1
>>

2023-01-10 08:51:08

by Eric Dumazet

[permalink] [raw]
Subject: Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context

On Tue, Jan 10, 2023 at 8:54 AM Geethasowjanya Akula <[email protected]> wrote:
>
>
>
> -----Original Message-----
> From: Leon Romanovsky <[email protected]>
> Sent: Sunday, January 8, 2023 6:39 PM
> To: Geethasowjanya Akula <[email protected]>
> Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Subbaraya Sundeep Bhatta <[email protected]>; Hariprasad Kelam <[email protected]>; Sunil Kovvuri Goutham <[email protected]>
> Subject: [EXT] Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context
>
> External Email
>
> ----------------------------------------------------------------------
> On Sat, Jan 07, 2023 at 10:11:39AM +0530, Geetha sowjanya wrote:
> >> Use GFP_ATOMIC flag instead of GFP_KERNEL while allocating memory in
> >> atomic context.
>
> >Awesome, but the changed functions don't run in atomic context.
>
> drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
> 1368 /* Flush accumulated messages */
> 1369 err = otx2_sync_mbox_msg(&pfvf->mbox);
> 1370 if (err)
> 1371 goto fail;
> 1372
> 1373 get_cpu();
> ^^^^^^^^^
> The get_cpu() disables preemption.

Forcing GFP_ATOMIC in init functions is not desirable.

Please move around the get_cpu() so that we keep GFP_KERNEL whenever possible.

diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
index 88f8772a61cd527c2ab138fb5a996470a7dfd456..2e628e12cd1ff92756f054639abd777ea185680f
100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
@@ -1370,7 +1370,6 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)
if (err)
goto fail;

- get_cpu();
/* Allocate pointers and free them to aura/pool */
for (qidx = 0; qidx < hw->tot_tx_queues; qidx++) {
pool_id = otx2_get_pool_idx(pfvf, AURA_NIX_SQ, qidx);
@@ -1388,13 +1387,17 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)
err = otx2_alloc_rbuf(pfvf, pool, &bufptr);
if (err)
goto err_mem;
+ /* __cn10k_aura_freeptr() needs to be called
+ * with preemption disabled.
+ */
+ get_cpu();
pfvf->hw_ops->aura_freeptr(pfvf, pool_id, bufptr);
+ put_cpu();
sq->sqb_ptrs[sq->sqb_count++] = (u64)bufptr;
}
}

err_mem:
- put_cpu();
return err ? -ENOMEM : 0;

fail:

2023-01-10 09:57:31

by Geethasowjanya Akula

[permalink] [raw]
Subject: RE: [EXT] Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context



-----Original Message-----
From: Eric Dumazet <[email protected]>
Sent: Tuesday, January 10, 2023 2:05 PM
To: Geethasowjanya Akula <[email protected]>
Cc: Leon Romanovsky <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Subbaraya Sundeep Bhatta <[email protected]>; Hariprasad Kelam <[email protected]>; Sunil Kovvuri Goutham <[email protected]>
Subject: [EXT] Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic context

External Email

----------------------------------------------------------------------
On Tue, Jan 10, 2023 at 8:54 AM Geethasowjanya Akula <[email protected]> wrote:
>>
>>
>>
>> -----Original Message-----
>> From: Leon Romanovsky <[email protected]>
>> Sent: Sunday, January 8, 2023 6:39 PM
>> To: Geethasowjanya Akula <[email protected]>
>> Cc: [email protected]; [email protected];
>> [email protected]; [email protected]; [email protected];
>> [email protected]; Subbaraya Sundeep Bhatta <[email protected]>;
>> Hariprasad Kelam <[email protected]>; Sunil Kovvuri Goutham
>> <[email protected]>
>> Subject: [EXT] Re: [net PATCH] octeontx2-pf: Use GFP_ATOMIC in atomic
>> context
>>
>> External Email
>>
>> ----------------------------------------------------------------------
>> On Sat, Jan 07, 2023 at 10:11:39AM +0530, Geetha sowjanya wrote:
>> >> Use GFP_ATOMIC flag instead of GFP_KERNEL while allocating memory
>> >> in atomic context.
>>
>> >Awesome, but the changed functions don't run in atomic context.
>>
>> drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>> 1368 /* Flush accumulated messages */
>> 1369 err = otx2_sync_mbox_msg(&pfvf->mbox);
>> 1370 if (err)
>> 1371 goto fail;
>> 1372
>> 1373 get_cpu();
>> ^^^^^^^^^
>> The get_cpu() disables preemption.

>Forcing GFP_ATOMIC in init functions is not desirable.
>
>Please move around the get_cpu() so that we keep GFP_KERNEL whenever possible.
Ok will submit v2 with suggested changes.
>
>diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>index 88f8772a61cd527c2ab138fb5a996470a7dfd456..2e628e12cd1ff92756f054639abd777ea185680f
>100644
>--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c
>@@ -1370,7 +1370,6 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)
> if (err)
> goto fail;
>
>- get_cpu();
> /* Allocate pointers and free them to aura/pool */
> for (qidx = 0; qidx < hw->tot_tx_queues; qidx++) {
> pool_id = otx2_get_pool_idx(pfvf, AURA_NIX_SQ, qidx); @@ -1388,13 +1387,17 @@ int otx2_sq_aura_pool_init(struct otx2_nic *pfvf)
> err = otx2_alloc_rbuf(pfvf, pool, &bufptr);
> if (err)
> goto err_mem;
>+ /* __cn10k_aura_freeptr() needs to be called
>+ * with preemption disabled.
>+ */
>+ get_cpu();
> pfvf->hw_ops->aura_freeptr(pfvf, pool_id, bufptr);
>+ put_cpu();
> sq->sqb_ptrs[sq->sqb_count++] = (u64)bufptr;
> }
> }
>
> err_mem:
>- put_cpu();
> return err ? -ENOMEM : 0;
>
> fail: