2022-07-04 14:05:36

by Fabio M. De Francesco

[permalink] [raw]
Subject: [PATCH] ixgbe: Don't call kmap() on page allocated with GFP_ATOMIC

Pages allocated with GFP_ATOMIC cannot come from Highmem. This is why
there is no need to call kmap() on them.

Therefore, don't call kmap() on rx_buffer->page() and instead use a
plain page_address() to get the kernel address.

Suggested-by: Ira Weiny <[email protected]>
Suggested-by: Alexander Duyck <[email protected]>
Signed-off-by: Fabio M. De Francesco <[email protected]>
---
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index 628d0eb0599f..71196fd92f81 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -1966,15 +1966,13 @@ static bool ixgbe_check_lbtest_frame(struct ixgbe_rx_buffer *rx_buffer,

frame_size >>= 1;

- data = kmap(rx_buffer->page) + rx_buffer->page_offset;
+ data = page_address(rx_buffer->page) + rx_buffer->page_offset;

if (data[3] != 0xFF ||
data[frame_size + 10] != 0xBE ||
data[frame_size + 12] != 0xAF)
match = false;

- kunmap(rx_buffer->page);
-
return match;
}

--
2.36.1


2022-07-05 19:01:24

by Ira Weiny

[permalink] [raw]
Subject: Re: [PATCH] ixgbe: Don't call kmap() on page allocated with GFP_ATOMIC

On Mon, Jul 04, 2022 at 04:01:29PM +0200, Fabio M. De Francesco wrote:
> Pages allocated with GFP_ATOMIC cannot come from Highmem. This is why
> there is no need to call kmap() on them.

I'm still not 100% sure where this page gets allocated but AFAICT it is
allocated in ixgbe_alloc_mapped_page() which calls dev_alloc_pages() for the
allocation which is where the GFP_ATOMIC is specified.

I think I would add this detail here.

That said, and assuming my analysis is correct, the code looks fine so:

Reviewed-by: Ira Weiny <[email protected]>

>
> Therefore, don't call kmap() on rx_buffer->page() and instead use a
> plain page_address() to get the kernel address.
>
> Suggested-by: Ira Weiny <[email protected]>
> Suggested-by: Alexander Duyck <[email protected]>
> Signed-off-by: Fabio M. De Francesco <[email protected]>
> ---
> drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> index 628d0eb0599f..71196fd92f81 100644
> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
> @@ -1966,15 +1966,13 @@ static bool ixgbe_check_lbtest_frame(struct ixgbe_rx_buffer *rx_buffer,
>
> frame_size >>= 1;
>
> - data = kmap(rx_buffer->page) + rx_buffer->page_offset;
> + data = page_address(rx_buffer->page) + rx_buffer->page_offset;
>
> if (data[3] != 0xFF ||
> data[frame_size + 10] != 0xBE ||
> data[frame_size + 12] != 0xAF)
> match = false;
>
> - kunmap(rx_buffer->page);
> -
> return match;
> }
>
> --
> 2.36.1
>

2022-07-05 20:15:01

by Alexander Duyck

[permalink] [raw]
Subject: Re: [PATCH] ixgbe: Don't call kmap() on page allocated with GFP_ATOMIC

On Tue, Jul 5, 2022 at 11:22 AM Ira Weiny <[email protected]> wrote:
>
> On Mon, Jul 04, 2022 at 04:01:29PM +0200, Fabio M. De Francesco wrote:
> > Pages allocated with GFP_ATOMIC cannot come from Highmem. This is why
> > there is no need to call kmap() on them.
>
> I'm still not 100% sure where this page gets allocated but AFAICT it is
> allocated in ixgbe_alloc_mapped_page() which calls dev_alloc_pages() for the
> allocation which is where the GFP_ATOMIC is specified.
>
> I think I would add this detail here.
>
> That said, and assuming my analysis is correct, the code looks fine so:

Yeah, this is actually called out in other spots in the buffer
cleaning path. This is just something I had overlooked and left in
place back a few refactors ago.. :-)

https://elixir.bootlin.com/linux/latest/source/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c#L1795

Reviewed-by: Alexander Duyck <[email protected]>

2022-08-04 14:35:24

by G, GurucharanX

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH] ixgbe: Don't call kmap() on page allocated with GFP_ATOMIC



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf Of
> Fabio M. De Francesco
> Sent: Monday, July 4, 2022 7:31 PM
> To: Brandeburg, Jesse <[email protected]>; Nguyen, Anthony L
> <[email protected]>; David S. Miller <[email protected]>;
> Eric Dumazet <[email protected]>; Jakub Kicinski <[email protected]>;
> Paolo Abeni <[email protected]>; Alexei Starovoitov <[email protected]>;
> Daniel Borkmann <[email protected]>; Jesper Dangaard Brouer
> <[email protected]>; John Fastabend <[email protected]>; intel-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]
> Cc: Weiny, Ira <[email protected]>; Fabio M. De Francesco
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH] ixgbe: Don't call kmap() on page allocated
> with GFP_ATOMIC
>
> Pages allocated with GFP_ATOMIC cannot come from Highmem. This is why
> there is no need to call kmap() on them.
>
> Therefore, don't call kmap() on rx_buffer->page() and instead use a plain
> page_address() to get the kernel address.
>
> Suggested-by: Ira Weiny <[email protected]>
> Suggested-by: Alexander Duyck <[email protected]>
> Signed-off-by: Fabio M. De Francesco <[email protected]>
> ---
> drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>

Tested-by: Gurucharan <[email protected]> (A Contingent worker at Intel)