]> git.itanic.dy.fi Git - linux-stable/commitdiff
mlxsw: pci: Allocate skbs using GFP_KERNEL during initialization
authorIdo Schimmel <idosch@nvidia.com>
Wed, 11 Oct 2023 14:39:12 +0000 (16:39 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Oct 2023 00:08:03 +0000 (17:08 -0700)
The driver allocates skbs during initialization and during Rx
processing. Take advantage of the fact that the former happens in
process context and allocate the skbs using GFP_KERNEL to decrease the
probability of allocation failure.

Tested with CONFIG_DEBUG_ATOMIC_SLEEP=y.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Link: https://lore.kernel.org/r/dfa6ed0926e045fe7c14f0894cc0c37fee81bf9d.1697034729.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/pci.c

index 51eea1f0529c86426001d6c65c805c390d1758c4..7fae963b2608817bb8debdc2d71fca167e6a13ba 100644 (file)
@@ -352,14 +352,15 @@ static void mlxsw_pci_wqe_frag_unmap(struct mlxsw_pci *mlxsw_pci, char *wqe,
 }
 
 static int mlxsw_pci_rdq_skb_alloc(struct mlxsw_pci *mlxsw_pci,
-                                  struct mlxsw_pci_queue_elem_info *elem_info)
+                                  struct mlxsw_pci_queue_elem_info *elem_info,
+                                  gfp_t gfp)
 {
        size_t buf_len = MLXSW_PORT_MAX_MTU;
        char *wqe = elem_info->elem;
        struct sk_buff *skb;
        int err;
 
-       skb = netdev_alloc_skb_ip_align(NULL, buf_len);
+       skb = __netdev_alloc_skb_ip_align(NULL, buf_len, gfp);
        if (!skb)
                return -ENOMEM;
 
@@ -420,7 +421,7 @@ static int mlxsw_pci_rdq_init(struct mlxsw_pci *mlxsw_pci, char *mbox,
        for (i = 0; i < q->count; i++) {
                elem_info = mlxsw_pci_queue_elem_info_producer_get(q);
                BUG_ON(!elem_info);
-               err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info);
+               err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info, GFP_KERNEL);
                if (err)
                        goto rollback;
                /* Everything is set up, ring doorbell to pass elem to HW */
@@ -640,7 +641,7 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
        if (q->consumer_counter++ != consumer_counter_limit)
                dev_dbg_ratelimited(&pdev->dev, "Consumer counter does not match limit in RDQ\n");
 
-       err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info);
+       err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info, GFP_ATOMIC);
        if (err) {
                dev_err_ratelimited(&pdev->dev, "Failed to alloc skb for RDQ\n");
                goto out;