Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ibmvnic: merge do_change_param_reset into do_reset

Commit b27507bb59ed ("net/ibmvnic: unlock rtnl_lock in reset so
linkwatch_event can run") introduced do_change_param_reset function to
solve the rtnl lock issue. Majority of the code in do_change_param_reset
duplicates do_reset. Also, we can handle the rtnl lock issue in do_reset
itself. Hence merge do_change_param_reset back into do_reset to clean up
the code.

Signed-off-by: Lijun Pan <ljp@linux.ibm.com>
Link: https://lore.kernel.org/r/20210106213514.76027-1-ljp@linux.ibm.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Lijun Pan and committed by
Jakub Kicinski
3f5ec374 09b5b5fb

+44 -110
+44 -110
drivers/net/ethernet/ibm/ibmvnic.c
··· 1926 1926 } 1927 1927 1928 1928 /** 1929 - * do_change_param_reset returns zero if we are able to keep processing reset 1930 - * events, or non-zero if we hit a fatal error and must halt. 1931 - */ 1932 - static int do_change_param_reset(struct ibmvnic_adapter *adapter, 1933 - struct ibmvnic_rwi *rwi, 1934 - u32 reset_state) 1935 - { 1936 - struct net_device *netdev = adapter->netdev; 1937 - int i, rc; 1938 - 1939 - netdev_dbg(adapter->netdev, "Change param resetting driver (%d)\n", 1940 - rwi->reset_reason); 1941 - 1942 - netif_carrier_off(netdev); 1943 - adapter->reset_reason = rwi->reset_reason; 1944 - 1945 - ibmvnic_cleanup(netdev); 1946 - 1947 - if (reset_state == VNIC_OPEN) { 1948 - rc = __ibmvnic_close(netdev); 1949 - if (rc) 1950 - goto out; 1951 - } 1952 - 1953 - release_resources(adapter); 1954 - release_sub_crqs(adapter, 1); 1955 - release_crq_queue(adapter); 1956 - 1957 - adapter->state = VNIC_PROBED; 1958 - 1959 - rc = init_crq_queue(adapter); 1960 - 1961 - if (rc) { 1962 - netdev_err(adapter->netdev, 1963 - "Couldn't initialize crq. rc=%d\n", rc); 1964 - return rc; 1965 - } 1966 - 1967 - rc = ibmvnic_reset_init(adapter, true); 1968 - if (rc) { 1969 - rc = IBMVNIC_INIT_FAILED; 1970 - goto out; 1971 - } 1972 - 1973 - /* If the adapter was in PROBE state prior to the reset, 1974 - * exit here. 1975 - */ 1976 - if (reset_state == VNIC_PROBED) 1977 - goto out; 1978 - 1979 - rc = ibmvnic_login(netdev); 1980 - if (rc) { 1981 - goto out; 1982 - } 1983 - 1984 - rc = init_resources(adapter); 1985 - if (rc) 1986 - goto out; 1987 - 1988 - ibmvnic_disable_irqs(adapter); 1989 - 1990 - adapter->state = VNIC_CLOSED; 1991 - 1992 - if (reset_state == VNIC_CLOSED) 1993 - return 0; 1994 - 1995 - rc = __ibmvnic_open(netdev); 1996 - if (rc) { 1997 - rc = IBMVNIC_OPEN_FAILED; 1998 - goto out; 1999 - } 2000 - 2001 - /* refresh device's multicast list */ 2002 - ibmvnic_set_multi(netdev); 2003 - 2004 - /* kick napi */ 2005 - for (i = 0; i < adapter->req_rx_queues; i++) 2006 - napi_schedule(&adapter->napi[i]); 2007 - 2008 - out: 2009 - if (rc) 2010 - adapter->state = reset_state; 2011 - return rc; 2012 - } 2013 - 2014 - /** 2015 1929 * do_reset returns zero if we are able to keep processing reset events, or 2016 1930 * non-zero if we hit a fatal error and must halt. 2017 1931 */ ··· 1942 2028 adapter->state, adapter->failover_pending, 1943 2029 rwi->reset_reason, reset_state); 1944 2030 1945 - rtnl_lock(); 2031 + adapter->reset_reason = rwi->reset_reason; 2032 + /* requestor of VNIC_RESET_CHANGE_PARAM already has the rtnl lock */ 2033 + if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM)) 2034 + rtnl_lock(); 2035 + 1946 2036 /* 1947 2037 * Now that we have the rtnl lock, clear any pending failover. 1948 2038 * This will ensure ibmvnic_open() has either completed or will ··· 1956 2038 adapter->failover_pending = false; 1957 2039 1958 2040 netif_carrier_off(netdev); 1959 - adapter->reset_reason = rwi->reset_reason; 1960 2041 1961 2042 old_num_rx_queues = adapter->req_rx_queues; 1962 2043 old_num_tx_queues = adapter->req_tx_queues; ··· 1967 2050 if (reset_state == VNIC_OPEN && 1968 2051 adapter->reset_reason != VNIC_RESET_MOBILITY && 1969 2052 adapter->reset_reason != VNIC_RESET_FAILOVER) { 1970 - adapter->state = VNIC_CLOSING; 2053 + if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { 2054 + rc = __ibmvnic_close(netdev); 2055 + if (rc) 2056 + goto out; 2057 + } else { 2058 + adapter->state = VNIC_CLOSING; 1971 2059 1972 - /* Release the RTNL lock before link state change and 1973 - * re-acquire after the link state change to allow 1974 - * linkwatch_event to grab the RTNL lock and run during 1975 - * a reset. 1976 - */ 1977 - rtnl_unlock(); 1978 - rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); 1979 - rtnl_lock(); 1980 - if (rc) 1981 - goto out; 2060 + /* Release the RTNL lock before link state change and 2061 + * re-acquire after the link state change to allow 2062 + * linkwatch_event to grab the RTNL lock and run during 2063 + * a reset. 2064 + */ 2065 + rtnl_unlock(); 2066 + rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); 2067 + rtnl_lock(); 2068 + if (rc) 2069 + goto out; 1982 2070 1983 - if (adapter->state != VNIC_CLOSING) { 1984 - rc = -1; 1985 - goto out; 2071 + if (adapter->state != VNIC_CLOSING) { 2072 + rc = -1; 2073 + goto out; 2074 + } 2075 + 2076 + adapter->state = VNIC_CLOSED; 1986 2077 } 2078 + } 1987 2079 1988 - adapter->state = VNIC_CLOSED; 2080 + if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { 2081 + release_resources(adapter); 2082 + release_sub_crqs(adapter, 1); 2083 + release_crq_queue(adapter); 1989 2084 } 1990 2085 1991 2086 if (adapter->reset_reason != VNIC_RESET_NON_FATAL) { ··· 2006 2077 */ 2007 2078 adapter->state = VNIC_PROBED; 2008 2079 2009 - if (adapter->reset_reason == VNIC_RESET_MOBILITY) { 2080 + if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { 2081 + rc = init_crq_queue(adapter); 2082 + } else if (adapter->reset_reason == VNIC_RESET_MOBILITY) { 2010 2083 rc = ibmvnic_reenable_crq_queue(adapter); 2011 2084 release_sub_crqs(adapter, 1); 2012 2085 } else { ··· 2047 2116 goto out; 2048 2117 } 2049 2118 2050 - if (adapter->req_rx_queues != old_num_rx_queues || 2119 + if (adapter->reset_reason == VNIC_RESET_CHANGE_PARAM) { 2120 + rc = init_resources(adapter); 2121 + if (rc) 2122 + goto out; 2123 + } else if (adapter->req_rx_queues != old_num_rx_queues || 2051 2124 adapter->req_tx_queues != old_num_tx_queues || 2052 2125 adapter->req_rx_add_entries_per_subcrq != 2053 2126 old_num_rx_slots || ··· 2116 2181 /* restore the adapter state if reset failed */ 2117 2182 if (rc) 2118 2183 adapter->state = reset_state; 2119 - rtnl_unlock(); 2184 + /* requestor of VNIC_RESET_CHANGE_PARAM should still hold the rtnl lock */ 2185 + if (!(adapter->reset_reason == VNIC_RESET_CHANGE_PARAM)) 2186 + rtnl_unlock(); 2120 2187 2121 2188 netdev_dbg(adapter->netdev, "[S:%d FOP:%d] Reset done, rc %d\n", 2122 2189 adapter->state, adapter->failover_pending, rc); ··· 2249 2312 } 2250 2313 spin_unlock_irqrestore(&adapter->state_lock, flags); 2251 2314 2252 - if (rwi->reset_reason == VNIC_RESET_CHANGE_PARAM) { 2253 - /* CHANGE_PARAM requestor holds rtnl_lock */ 2254 - rc = do_change_param_reset(adapter, rwi, reset_state); 2255 - } else if (adapter->force_reset_recovery) { 2315 + if (adapter->force_reset_recovery) { 2256 2316 /* 2257 2317 * Since we are doing a hard reset now, clear the 2258 2318 * failover_pending flag so we don't ignore any