Skip to content

Commit a92f7a6

Browse files
catSully012kuba-moo
authored andcommitted
gve: Fix GFP flags when allocing pages
Use GFP_ATOMIC when allocating pages out of the hotpath, continue to use GFP_KERNEL when allocating pages during setup. GFP_KERNEL will allow blocking which allows it to succeed more often in a low memory enviornment but in the hotpath we do not want to allow the allocation to block. Fixes: f5cedc8 ("gve: Add transmit and receive support") Signed-off-by: Catherine Sullivan <[email protected]> Signed-off-by: David Awogbemila <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 2f65132 commit a92f7a6

File tree

4 files changed

+7
-6
lines changed

4 files changed

+7
-6
lines changed

drivers/net/ethernet/google/gve/gve.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ static inline bool gve_is_gqi(struct gve_priv *priv)
843843
/* buffers */
844844
int gve_alloc_page(struct gve_priv *priv, struct device *dev,
845845
struct page **page, dma_addr_t *dma,
846-
enum dma_data_direction);
846+
enum dma_data_direction, gfp_t gfp_flags);
847847
void gve_free_page(struct device *dev, struct page *page, dma_addr_t dma,
848848
enum dma_data_direction);
849849
/* tx handling */

drivers/net/ethernet/google/gve/gve_main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -766,9 +766,9 @@ static void gve_free_rings(struct gve_priv *priv)
766766

767767
int gve_alloc_page(struct gve_priv *priv, struct device *dev,
768768
struct page **page, dma_addr_t *dma,
769-
enum dma_data_direction dir)
769+
enum dma_data_direction dir, gfp_t gfp_flags)
770770
{
771-
*page = alloc_page(GFP_KERNEL);
771+
*page = alloc_page(gfp_flags);
772772
if (!*page) {
773773
priv->page_alloc_fail++;
774774
return -ENOMEM;
@@ -811,7 +811,7 @@ static int gve_alloc_queue_page_list(struct gve_priv *priv, u32 id,
811811
for (i = 0; i < pages; i++) {
812812
err = gve_alloc_page(priv, &priv->pdev->dev, &qpl->pages[i],
813813
&qpl->page_buses[i],
814-
gve_qpl_dma_dir(priv, id));
814+
gve_qpl_dma_dir(priv, id), GFP_KERNEL);
815815
/* caller handles clean up */
816816
if (err)
817817
return -ENOMEM;

drivers/net/ethernet/google/gve/gve_rx.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ static int gve_rx_alloc_buffer(struct gve_priv *priv, struct device *dev,
8686
dma_addr_t dma;
8787
int err;
8888

89-
err = gve_alloc_page(priv, dev, &page, &dma, DMA_FROM_DEVICE);
89+
err = gve_alloc_page(priv, dev, &page, &dma, DMA_FROM_DEVICE,
90+
GFP_ATOMIC);
9091
if (err)
9192
return err;
9293

drivers/net/ethernet/google/gve/gve_rx_dqo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ static int gve_alloc_page_dqo(struct gve_priv *priv,
157157
int err;
158158

159159
err = gve_alloc_page(priv, &priv->pdev->dev, &buf_state->page_info.page,
160-
&buf_state->addr, DMA_FROM_DEVICE);
160+
&buf_state->addr, DMA_FROM_DEVICE, GFP_KERNEL);
161161
if (err)
162162
return err;
163163

0 commit comments

Comments
 (0)