[Intel-wired-lan] [bug report] iavf: use mutexes for locking of critical sections
Stefan Assmann
sassmann at kpanic.de
Tue Aug 24 08:25:24 UTC 2021
On 24.08.21 10:10, Dan Carpenter wrote:
> Hello Stefan Assmann,
>
> The patch 5ac49f3c2702: "iavf: use mutexes for locking of critical
> sections" from Aug 4, 2021, leads to the following
> Smatch static checker warning:
Thanks for the report, I'll take a look!
Stefan
> drivers/net/ethernet/intel/iavf/iavf_main.c:2019 iavf_watchdog_task()
> error: double unlocked '&adapter->crit_lock' (orig line 1968)
>
> drivers/net/ethernet/intel/iavf/iavf_main.c
> 1932 static void iavf_watchdog_task(struct work_struct *work)
> 1933 {
> 1934 struct iavf_adapter *adapter = container_of(work,
> 1935 struct iavf_adapter,
> 1936 watchdog_task.work);
> 1937 struct iavf_hw *hw = &adapter->hw;
> 1938 u32 reg_val;
> 1939
> 1940 if (!mutex_trylock(&adapter->crit_lock))
> 1941 goto restart_watchdog;
> 1942
> 1943 if (adapter->flags & IAVF_FLAG_PF_COMMS_FAILED)
> 1944 adapter->state = __IAVF_COMM_FAILED;
> 1945
> 1946 switch (adapter->state) {
> 1947 case __IAVF_COMM_FAILED:
> 1948 reg_val = rd32(hw, IAVF_VFGEN_RSTAT) &
> 1949 IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
> 1950 if (reg_val == VIRTCHNL_VFR_VFACTIVE ||
> 1951 reg_val == VIRTCHNL_VFR_COMPLETED) {
> 1952 /* A chance for redemption! */
> 1953 dev_err(&adapter->pdev->dev,
> 1954 "Hardware came out of reset. Attempting reinit.\n");
> 1955 adapter->state = __IAVF_STARTUP;
> 1956 adapter->flags &= ~IAVF_FLAG_PF_COMMS_FAILED;
> 1957 queue_delayed_work(iavf_wq, &adapter->init_task, 10);
> 1958 mutex_unlock(&adapter->crit_lock);
> 1959 /* Don't reschedule the watchdog, since we've restarted
> 1960 * the init task. When init_task contacts the PF and
> 1961 * gets everything set up again, it'll restart the
> 1962 * watchdog for us. Down, boy. Sit. Stay. Woof.
> 1963 */
> 1964 return;
> 1965 }
> 1966 adapter->aq_required = 0;
> 1967 adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> 1968 mutex_unlock(&adapter->crit_lock);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Unlocked here
>
> 1969 queue_delayed_work(iavf_wq,
> 1970 &adapter->watchdog_task,
> 1971 msecs_to_jiffies(10));
> 1972 goto watchdog_done;
> ^^^^^^^^^^^^^^^^^^^
> Goto
>
> 1973 case __IAVF_RESETTING:
> 1974 mutex_unlock(&adapter->crit_lock);
> 1975 queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
> 1976 return;
> 1977 case __IAVF_DOWN:
> 1978 case __IAVF_DOWN_PENDING:
> 1979 case __IAVF_TESTING:
> 1980 case __IAVF_RUNNING:
> 1981 if (adapter->current_op) {
> 1982 if (!iavf_asq_done(hw)) {
> 1983 dev_dbg(&adapter->pdev->dev,
> 1984 "Admin queue timeout\n");
> 1985 iavf_send_api_ver(adapter);
> 1986 }
> 1987 } else {
> 1988 /* An error will be returned if no commands were
> 1989 * processed; use this opportunity to update stats
> 1990 */
> 1991 if (iavf_process_aq_command(adapter) &&
> 1992 adapter->state == __IAVF_RUNNING)
> 1993 iavf_request_stats(adapter);
> 1994 }
> 1995 break;
> 1996 case __IAVF_REMOVE:
> 1997 mutex_unlock(&adapter->crit_lock);
> 1998 return;
> 1999 default:
> 2000 goto restart_watchdog;
> 2001 }
> 2002
> 2003 /* check for hw reset */
> 2004 reg_val = rd32(hw, IAVF_VF_ARQLEN1) & IAVF_VF_ARQLEN1_ARQENABLE_MASK;
> 2005 if (!reg_val) {
> 2006 adapter->flags |= IAVF_FLAG_RESET_PENDING;
> 2007 adapter->aq_required = 0;
> 2008 adapter->current_op = VIRTCHNL_OP_UNKNOWN;
> 2009 dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
> 2010 queue_work(iavf_wq, &adapter->reset_task);
> 2011 goto watchdog_done;
> 2012 }
> 2013
> 2014 schedule_delayed_work(&adapter->client_task, msecs_to_jiffies(5));
> 2015 watchdog_done:
> 2016 if (adapter->state == __IAVF_RUNNING ||
> 2017 adapter->state == __IAVF_COMM_FAILED)
> 2018 iavf_detect_recover_hung(&adapter->vsi);
> --> 2019 mutex_unlock(&adapter->crit_lock);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Double unlock.
>
> 2020 restart_watchdog:
> 2021 if (adapter->aq_required)
> 2022 queue_delayed_work(iavf_wq, &adapter->watchdog_task,
> 2023 msecs_to_jiffies(20));
> 2024 else
> 2025 queue_delayed_work(iavf_wq, &adapter->watchdog_task, HZ * 2);
> 2026 queue_work(iavf_wq, &adapter->adminq_task);
> 2027 }
>
> regards,
> dan carpenter
>
More information about the Intel-wired-lan
mailing list