[Intel-wired-lan] [bug report] iavf: use mutexes for locking of critical sections

Dan Carpenter dan.carpenter at oracle.com
Tue Aug 24 08:10:39 UTC 2021


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:

	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