i40e: Add sending commands in atomic context
authorJedrzej Jagielski <jedrzej.jagielski@intel.com>
Fri, 14 Jan 2022 13:19:28 +0000 (13:19 +0000)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 3 Feb 2022 21:13:50 +0000 (13:13 -0800)
Change functions:
- i40e_aq_add_macvlan
- i40e_aq_remove_macvlan
- i40e_aq_delete_element
- i40e_aq_add_vsi
- i40e_aq_update_vsi_params
to explicitly use i40e_asq_send_command_atomic(..., true)
instead of i40e_asq_send_command, as they use mutexes and do some
work in an atomic context.
Without this change setting vlan via netdev will fail with
call trace cased by bug "BUG: scheduling while atomic".

Signed-off-by: Witold Fijalkowski <witoldx.fijalkowski@intel.com>
Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Tested-by: Gurucharan G <gurucharanx.g@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/i40e/i40e_common.c

index 9ddeb01..e830987 100644 (file)
@@ -1899,8 +1899,9 @@ i40e_status i40e_aq_add_vsi(struct i40e_hw *hw,
 
        desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
 
-       status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
-                                   sizeof(vsi_ctx->info), cmd_details);
+       status = i40e_asq_send_command_atomic(hw, &desc, &vsi_ctx->info,
+                                             sizeof(vsi_ctx->info),
+                                             cmd_details, true);
 
        if (status)
                goto aq_add_vsi_exit;
@@ -2287,8 +2288,9 @@ i40e_status i40e_aq_update_vsi_params(struct i40e_hw *hw,
 
        desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
 
-       status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
-                                   sizeof(vsi_ctx->info), cmd_details);
+       status = i40e_asq_send_command_atomic(hw, &desc, &vsi_ctx->info,
+                                             sizeof(vsi_ctx->info),
+                                             cmd_details, true);
 
        vsi_ctx->vsis_allocated = le16_to_cpu(resp->vsi_used);
        vsi_ctx->vsis_unallocated = le16_to_cpu(resp->vsi_free);
@@ -2673,8 +2675,8 @@ i40e_status i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
        if (buf_size > I40E_AQ_LARGE_BUF)
                desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
 
-       status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
-                                      cmd_details);
+       status = i40e_asq_send_command_atomic(hw, &desc, mv_list, buf_size,
+                                             cmd_details, true);
 
        return status;
 }
@@ -2715,8 +2717,8 @@ i40e_status i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
        if (buf_size > I40E_AQ_LARGE_BUF)
                desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
 
-       status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
-                                      cmd_details);
+       status = i40e_asq_send_command_atomic(hw, &desc, mv_list, buf_size,
+                                             cmd_details, true);
 
        return status;
 }
@@ -3868,7 +3870,8 @@ i40e_status i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
 
        cmd->seid = cpu_to_le16(seid);
 
-       status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
+       status = i40e_asq_send_command_atomic(hw, &desc, NULL, 0,
+                                             cmd_details, true);
 
        return status;
 }