Message ID | 20220704140129.6463-1-fmdefrancesco@gmail.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ixgbe: Don't call kmap() on page allocated with GFP_ATOMIC | expand |
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 <ira.weiny@intel.com> > > 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 <ira.weiny@intel.com> > Suggested-by: Alexander Duyck <alexander.duyck@gmail.com> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> > --- > 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 >
On Tue, Jul 5, 2022 at 11:22 AM Ira Weiny <ira.weiny@intel.com> 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 <alexanderduyck@fb.com>
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Fabio M. De Francesco > Sent: Monday, July 4, 2022 7:31 PM > To: Brandeburg, Jesse <jesse.brandeburg@intel.com>; Nguyen, Anthony L > <anthony.l.nguyen@intel.com>; David S. Miller <davem@davemloft.net>; > Eric Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; > Paolo Abeni <pabeni@redhat.com>; Alexei Starovoitov <ast@kernel.org>; > Daniel Borkmann <daniel@iogearbox.net>; Jesper Dangaard Brouer > <hawk@kernel.org>; John Fastabend <john.fastabend@gmail.com>; intel- > wired-lan@lists.osuosl.org; netdev@vger.kernel.org; linux- > kernel@vger.kernel.org; bpf@vger.kernel.org > Cc: Weiny, Ira <ira.weiny@intel.com>; Fabio M. De Francesco > <fmdefrancesco@gmail.com> > 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 <ira.weiny@intel.com> > Suggested-by: Alexander Duyck <alexander.duyck@gmail.com> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> > --- > drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
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; }
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 <ira.weiny@intel.com> Suggested-by: Alexander Duyck <alexander.duyck@gmail.com> Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> --- drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)