<div dir="ltr"><div>Hey Tim,</div><div><br></div><div>Thanks for the hint on the backport comments/description. I remember having to do some minor context adjustments when I cherry-picked this last time, but re-running against a fresh tree only gives me some "Auto-merging" messages.</div><div>Would you like me to send out a v3 with the proper cherry-pick message?<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 31, 2023 at 10:25 AM Tim Gardner <<a href="mailto:tim.gardner@canonical.com">tim.gardner@canonical.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 3/31/23 6:22 AM, Heitor Alves de Siqueira wrote:<br>
> From: Dave Ertman <<a href="mailto:david.m.ertman@intel.com" target="_blank">david.m.ertman@intel.com</a>><br>
> <br>
> BugLink: <a href="https://bugs.launchpad.net/bugs/2004262" rel="noreferrer" target="_blank">https://bugs.launchpad.net/bugs/2004262</a><br>
> <br>
> RDMA is not supported in ice on a PF that has been added to a bonded<br>
> interface. To enforce this, when an interface enters a bond, we unplug<br>
> the auxiliary device that supports RDMA functionality.  This unplug<br>
> currently happens in the context of handling the netdev bonding event.<br>
> This event is sent to the ice driver under RTNL context.  This is causing<br>
> a deadlock where the RDMA driver is waiting for the RTNL lock to complete<br>
> the removal.<br>
> <br>
> Defer the unplugging/re-plugging of the auxiliary device to the service<br>
> task so that it is not performed under the RTNL lock context.<br>
> <br>
> Cc: <a href="mailto:stable@vger.kernel.org" target="_blank">stable@vger.kernel.org</a> # 6.1.x<br>
> Reported-by: Jaroslav Pulchart <<a href="mailto:jaroslav.pulchart@gooddata.com" target="_blank">jaroslav.pulchart@gooddata.com</a>><br>
> Link: <a href="https://lore.kernel.org/netdev/CAK8fFZ6A_Gphw_3-QMGKEFQk=sfCw1Qmq0TVZK3rtAi7vb621A@mail.gmail.com/" rel="noreferrer" target="_blank">https://lore.kernel.org/netdev/CAK8fFZ6A_Gphw_3-QMGKEFQk=sfCw1Qmq0TVZK3rtAi7vb621A@mail.gmail.com/</a><br>
> Fixes: 5cb1ebdbc434 ("ice: Fix race condition during interface enslave")<br>
> Fixes: 4eace75e0853 ("RDMA/irdma: Report the correct link speed")<br>
> Signed-off-by: Dave Ertman <<a href="mailto:david.m.ertman@intel.com" target="_blank">david.m.ertman@intel.com</a>><br>
> Tested-by: Arpana Arland <<a href="mailto:arpanax.arland@intel.com" target="_blank">arpanax.arland@intel.com</a>> (A Contingent worker at Intel)<br>
> Signed-off-by: Tony Nguyen <<a href="mailto:anthony.l.nguyen@intel.com" target="_blank">anthony.l.nguyen@intel.com</a>><br>
> Reviewed-by: Leon Romanovsky <<a href="mailto:leonro@nvidia.com" target="_blank">leonro@nvidia.com</a>><br>
> Link: <a href="https://lore.kernel.org/r/20230310194833.3074601-1-anthony.l.nguyen@intel.com" rel="noreferrer" target="_blank">https://lore.kernel.org/r/20230310194833.3074601-1-anthony.l.nguyen@intel.com</a><br>
> Signed-off-by: Jakub Kicinski <<a href="mailto:kuba@kernel.org" target="_blank">kuba@kernel.org</a>><br>
> (backported from commit 248401cb2c4612d83eb0c352ee8103b78b8eb365)<br>
> Signed-off-by: Heitor Alves de Siqueira <<a href="mailto:halves@canonical.com" target="_blank">halves@canonical.com</a>><br>
> ---<br>
>   drivers/net/ethernet/intel/ice/ice.h      | 14 +++++---------<br>
>   drivers/net/ethernet/intel/ice/ice_main.c | 19 ++++++++-----------<br>
>   2 files changed, 13 insertions(+), 20 deletions(-)<br>
> <br>
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h<br>
> index 89bca2ed895a..2d67876c53a6 100644<br>
> --- a/drivers/net/ethernet/intel/ice/ice.h<br>
> +++ b/drivers/net/ethernet/intel/ice/ice.h<br>
> @@ -399,6 +399,7 @@ enum ice_pf_flags {<br>
>       ICE_FLAG_MDD_AUTO_RESET_VF,<br>
>       ICE_FLAG_LINK_LENIENT_MODE_ENA,<br>
>       ICE_FLAG_PLUG_AUX_DEV,<br>
> +     ICE_FLAG_UNPLUG_AUX_DEV,<br>
>       ICE_FLAG_MTU_CHANGED,<br>
>       ICE_PF_FLAGS_NBITS              /* must be last */<br>
>   };<br>
> @@ -706,16 +707,11 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)<br>
>    */<br>
>   static inline void ice_clear_rdma_cap(struct ice_pf *pf)<br>
>   {<br>
> -     /* We can directly unplug aux device here only if the flag bit<br>
> -      * ICE_FLAG_PLUG_AUX_DEV is not set because ice_unplug_aux_dev()<br>
> -      * could race with ice_plug_aux_dev() called from<br>
> -      * ice_service_task(). In this case we only clear that bit now and<br>
> -      * aux device will be unplugged later once ice_plug_aux_device()<br>
> -      * called from ice_service_task() finishes (see ice_service_task()).<br>
> +     /* defer unplug to service task to avoid RTNL lock and<br>
> +      * clear PLUG bit so that pending plugs don't interfere<br>
>        */<br>
> -     if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))<br>
> -             ice_unplug_aux_dev(pf);<br>
> -<br>
> +     clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags);<br>
> +     set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags);<br>
>       clear_bit(ICE_FLAG_RDMA_ENA, pf->flags);<br>
>       clear_bit(ICE_FLAG_AUX_ENA, pf->flags);<br>
>   }<br>
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c<br>
> index ffbba5f6b7a5..d3462fc650d1 100644<br>
> --- a/drivers/net/ethernet/intel/ice/ice_main.c<br>
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c<br>
> @@ -2156,18 +2156,15 @@ static void ice_service_task(struct work_struct *work)<br>
>               }<br>
>       }<br>
>   <br>
> -     if (test_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) {<br>
> -             /* Plug aux device per request */<br>
> -             ice_plug_aux_dev(pf);<br>
> +     /* unplug aux dev per request, if an unplug request came in<br>
> +      * while processing a plug request, this will handle it<br>
> +      */<br>
> +     if (test_and_clear_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags))<br>
> +             ice_unplug_aux_dev(pf);<br>
>   <br>
> -             /* Mark plugging as done but check whether unplug was<br>
> -              * requested during ice_plug_aux_dev() call<br>
> -              * (e.g. from ice_clear_rdma_cap()) and if so then<br>
> -              * plug aux device.<br>
> -              */<br>
> -             if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))<br>
> -                     ice_unplug_aux_dev(pf);<br>
> -     }<br>
> +     /* Plug aux device per request */<br>
> +     if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))<br>
> +             ice_plug_aux_dev(pf);<br>
>   <br>
>       if (test_and_clear_bit(ICE_FLAG_MTU_CHANGED, pf->flags)) {<br>
>               struct iidc_event *event;<br>
<br>
This is a clean cherry pick for me. Do you have some cruft in your tree <br>
preventing clean application ? Also, when you declare that a patch is a <br>
backport you should describe what changes you had to make in order to <br>
get the patch to apply. For example,<br>
<br>
(backported from commit 248401cb2c4612d83eb0c352ee8103b78b8eb365)<br>
[Heitor - simple context adjustments]<br>
<br>
-- <br>
-----------<br>
Tim Gardner<br>
Canonical, Inc<br>
<br>
</blockquote></div>