<div dir="ltr">ice_atomic_write_link_status in ice_link_update function is not protected by the spinlock, there maybe a situation:<div>1.dev_start call ice_link_update with wait_to_complete = 1,and get link_status = 0<br></div><div>2.LSC interrupt handler call ice_link_update and get link_status = 1</div><div>3.LSC interrupt handler call ice_atomic_write_link_status update link status to 1</div><div>4.dev_start call ice_atomic_write_link_status update link status to 0</div><div>So I think ice_atomic_write_link_status must be protected by spinlock</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Zhang, Qi Z <<a href="mailto:qi.z.zhang@intel.com">qi.z.zhang@intel.com</a>> 于2023年12月21日周四 10:44写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
> -----Original Message-----<br>
> From: Yang, Qiming <<a href="mailto:qiming.yang@intel.com" target="_blank">qiming.yang@intel.com</a>><br>
> Sent: Thursday, December 21, 2023 9:44 AM<br>
> To: Zhang, Qi Z <<a href="mailto:qi.z.zhang@intel.com" target="_blank">qi.z.zhang@intel.com</a>><br>
> Cc: <a href="mailto:dev@dpdk.org" target="_blank">dev@dpdk.org</a>; <a href="mailto:stable@dpdk.org" target="_blank">stable@dpdk.org</a><br>
> Subject: RE: [PATCH v2] net/ice: fix link update<br>
> <br>
> hi<br>
> <br>
> > -----Original Message-----<br>
> > From: Zhang, Qi Z <<a href="mailto:qi.z.zhang@intel.com" target="_blank">qi.z.zhang@intel.com</a>><br>
> > Sent: Thursday, December 14, 2023 4:41 PM<br>
> > To: Yang, Qiming <<a href="mailto:qiming.yang@intel.com" target="_blank">qiming.yang@intel.com</a>><br>
> > Cc: <a href="mailto:dev@dpdk.org" target="_blank">dev@dpdk.org</a>; Zhang, Qi Z <<a href="mailto:qi.z.zhang@intel.com" target="_blank">qi.z.zhang@intel.com</a>>; <a href="mailto:stable@dpdk.org" target="_blank">stable@dpdk.org</a><br>
> > Subject: [PATCH v2] net/ice: fix link update<br>
> ><br>
> > The ice_aq_get_link_info function is not thread-safe. However, it is<br>
> > possible to simultaneous invocations during both the dev_start and the<br>
> > LSC interrupt handler, potentially leading to unexpected adminq<br>
> > errors. This patch addresses the issue by introducing a thread-safe<br>
> > wrapper that utilizes a spinlock.<br>
> ><br>
> > Fixes: cf911d90e366 ("net/ice: support link update")<br>
> > Cc: <a href="mailto:stable@dpdk.org" target="_blank">stable@dpdk.org</a><br>
> ><br>
> > Signed-off-by: Qi Zhang <<a href="mailto:qi.z.zhang@intel.com" target="_blank">qi.z.zhang@intel.com</a>><br>
> > ---<br>
> > v2:<br>
> > - fix coding style warning.<br>
> ><br>
> > drivers/net/ice/ice_ethdev.c | 26 ++++++++++++++++++++------<br>
> > drivers/net/ice/ice_ethdev.h | 4 ++++<br>
> > 2 files changed, 24 insertions(+), 6 deletions(-)<br>
> ><br>
> > diff --git a/drivers/net/ice/ice_ethdev.c<br>
> > b/drivers/net/ice/ice_ethdev.c index 3ccba4db80..1f8ab5158a 100644<br>
> > --- a/drivers/net/ice/ice_ethdev.c<br>
> > +++ b/drivers/net/ice/ice_ethdev.c<br>
> > @@ -1804,6 +1804,7 @@ ice_pf_setup(struct ice_pf *pf)<br>
> > }<br>
> ><br>
> > pf->main_vsi = vsi;<br>
> > + rte_spinlock_init(&pf->link_lock);<br>
> ><br>
> > return 0;<br>
> > }<br>
> > @@ -3621,17 +3622,31 @@ ice_rxq_intr_setup(struct rte_eth_dev *dev)<br>
> > return 0;<br>
> > }<br>
> ><br>
> > +static enum ice_status<br>
> > +ice_get_link_info_safe(struct ice_pf *pf, bool ena_lse,<br>
> > + struct ice_link_status *link) {<br>
> > + struct ice_hw *hw = ICE_PF_TO_HW(pf);<br>
> > + int ret;<br>
> > +<br>
> > + rte_spinlock_lock(&pf->link_lock);<br>
> > +<br>
> > + ret = ice_aq_get_link_info(hw->port_info, ena_lse, link, NULL);<br>
> > +<br>
> > + rte_spinlock_unlock(&pf->link_lock);<br>
> > +<br>
> > + return ret;<br>
> > +}<br>
> > +<br>
> > static void<br>
> > ice_get_init_link_status(struct rte_eth_dev *dev) {<br>
> > - struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data-<br>
> > >dev_private);<br>
> > struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data-<br>
> > >dev_private);<br>
> > bool enable_lse = dev->data->dev_conf.intr_conf.lsc ? true : false;<br>
> > struct ice_link_status link_status;<br>
> > int ret;<br>
> ><br>
> > - ret = ice_aq_get_link_info(hw->port_info, enable_lse,<br>
> > - &link_status, NULL);<br>
> > + ret = ice_get_link_info_safe(pf, enable_lse, &link_status);<br>
> > if (ret != ICE_SUCCESS) {<br>
> > PMD_DRV_LOG(ERR, "Failed to get link info");<br>
> > pf->init_link_up = false;<br>
> > @@ -3996,7 +4011,7 @@ ice_link_update(struct rte_eth_dev *dev, int<br>
> > wait_to_complete) { #define CHECK_INTERVAL 50 /* 50ms */ #define<br>
> > MAX_REPEAT_TIME 40 /* 2s (40 * 50ms) in total */<br>
> > - struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data-<br>
> > >dev_private);<br>
> > + struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data-<br>
> > >dev_private);<br>
> > struct ice_link_status link_status;<br>
> > struct rte_eth_link link, old;<br>
> > int status;<br>
> > @@ -4010,8 +4025,7 @@ ice_link_update(struct rte_eth_dev *dev, int<br>
> > wait_to_complete)<br>
> ><br>
> > do {<br>
> > /* Get link status information from hardware */<br>
> > - status = ice_aq_get_link_info(hw->port_info, enable_lse,<br>
> > - &link_status, NULL);<br>
> > + status = ice_get_link_info_safe(pf, enable_lse, &link_status);<br>
> > if (status != ICE_SUCCESS) {<br>
> > link.link_speed = RTE_ETH_SPEED_NUM_100M;<br>
> > link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; diff -<br>
> -git<br>
> > a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index<br>
> > abe6dcdc23..d607f028e0 100644<br>
> > --- a/drivers/net/ice/ice_ethdev.h<br>
> > +++ b/drivers/net/ice/ice_ethdev.h<br>
> > @@ -548,6 +548,10 @@ struct ice_pf {<br>
> > uint64_t rss_hf;<br>
> > struct ice_tm_conf tm_conf;<br>
> > uint16_t outer_ethertype;<br>
> > + /* lock prevent race condition between lsc interrupt handler<br>
> > + * and link status update during dev_start.<br>
> > + */<br>
> > + rte_spinlock_t link_lock;<br>
> > };<br>
> ><br>
> > #define ICE_MAX_QUEUE_NUM 2048<br>
> > --<br>
> > 2.31.1<br>
> <br>
> <br>
> Acked-by: Qiming Yang <<a href="mailto:qiming.yang@intel.com" target="_blank">qiming.yang@intel.com</a>><br>
<br>
Applied to dpdk-next-net-intel.<br>
<br>
Thanks<br>
Qi<br>
</blockquote></div>