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

ixgbe: merge reset task into service task

This change is meant to further help to reduce possible configuration
collisions between the various tasklets. This change combines the device
reset with the service task. As a result it is now not possible to be
updating the link on the device while also resetting the part.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Evan Swanson <evan.swanson@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

authored by

Alexander Duyck and committed by
Jeff Kirsher
c83c6cbd 93c52dd0

+38 -24
+1 -1
drivers/net/ixgbe/ixgbe.h
··· 381 381 #define IXGBE_FLAG2_TEMP_SENSOR_CAPABLE (u32)(1 << 2) 382 382 #define IXGBE_FLAG2_SEARCH_FOR_SFP (u32)(1 << 4) 383 383 #define IXGBE_FLAG2_SFP_NEEDS_RESET (u32)(1 << 5) 384 + #define IXGBE_FLAG2_RESET_REQUESTED (u32)(1 << 6) 384 385 385 386 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 386 387 u16 bd_number; ··· 455 454 bool link_up; 456 455 unsigned long link_check_timeout; 457 456 458 - struct work_struct reset_task; 459 457 struct work_struct fdir_reinit_task; 460 458 struct work_struct check_overtemp_task; 461 459 struct work_struct service_task;
+37 -23
drivers/net/ixgbe/ixgbe_main.c
··· 833 833 #define DESC_NEEDED (TXD_USE_COUNT(IXGBE_MAX_DATA_PER_TXD) /* skb->data */ + \ 834 834 MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1) /* for context */ 835 835 836 - static void ixgbe_tx_timeout(struct net_device *netdev); 836 + /** 837 + * ixgbe_tx_timeout_reset - initiate reset due to Tx timeout 838 + * @adapter: driver private struct 839 + **/ 840 + static void ixgbe_tx_timeout_reset(struct ixgbe_adapter *adapter) 841 + { 842 + 843 + /* Do the reset outside of interrupt context */ 844 + if (!test_bit(__IXGBE_DOWN, &adapter->state)) { 845 + adapter->flags2 |= IXGBE_FLAG2_RESET_REQUESTED; 846 + ixgbe_service_event_schedule(adapter); 847 + } 848 + } 837 849 838 850 /** 839 851 * ixgbe_clean_tx_irq - Reclaim resources after transmit completes ··· 927 915 adapter->tx_timeout_count + 1, tx_ring->queue_index); 928 916 929 917 /* schedule immediate reset if we believe we hung */ 930 - ixgbe_tx_timeout(adapter->netdev); 918 + ixgbe_tx_timeout_reset(adapter); 931 919 932 920 /* the adapter is about to reset, no point in enabling stuff */ 933 921 return true; ··· 4198 4186 4199 4187 ixgbe_napi_disable_all(adapter); 4200 4188 4189 + adapter->flags2 &= ~IXGBE_FLAG2_RESET_REQUESTED; 4201 4190 adapter->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE; 4202 4191 4203 4192 del_timer_sync(&adapter->service_timer); ··· 4301 4288 { 4302 4289 struct ixgbe_adapter *adapter = netdev_priv(netdev); 4303 4290 4304 - adapter->tx_timeout_count++; 4305 - 4306 4291 /* Do the reset outside of interrupt context */ 4307 - schedule_work(&adapter->reset_task); 4308 - } 4309 - 4310 - static void ixgbe_reset_task(struct work_struct *work) 4311 - { 4312 - struct ixgbe_adapter *adapter; 4313 - adapter = container_of(work, struct ixgbe_adapter, reset_task); 4314 - 4315 - /* If we're already down or resetting, just bail */ 4316 - if (test_bit(__IXGBE_DOWN, &adapter->state) || 4317 - test_bit(__IXGBE_RESETTING, &adapter->state)) 4318 - return; 4319 - 4320 - ixgbe_dump(adapter); 4321 - netdev_err(adapter->netdev, "Reset adapter\n"); 4322 - ixgbe_reinit_locked(adapter); 4292 + ixgbe_tx_timeout_reset(adapter); 4323 4293 } 4324 4294 4325 4295 /** ··· 6170 6174 * to get done, so reset controller to flush Tx. 6171 6175 * (Do the reset outside of interrupt context). 6172 6176 */ 6173 - schedule_work(&adapter->reset_task); 6177 + adapter->flags2 |= IXGBE_FLAG2_RESET_REQUESTED; 6174 6178 } 6175 6179 } 6176 6180 } ··· 6337 6341 ixgbe_service_event_schedule(adapter); 6338 6342 } 6339 6343 6344 + static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter) 6345 + { 6346 + if (!(adapter->flags2 & IXGBE_FLAG2_RESET_REQUESTED)) 6347 + return; 6348 + 6349 + adapter->flags2 &= ~IXGBE_FLAG2_RESET_REQUESTED; 6350 + 6351 + /* If we're already down or resetting, just bail */ 6352 + if (test_bit(__IXGBE_DOWN, &adapter->state) || 6353 + test_bit(__IXGBE_RESETTING, &adapter->state)) 6354 + return; 6355 + 6356 + ixgbe_dump(adapter); 6357 + netdev_err(adapter->netdev, "Reset adapter\n"); 6358 + adapter->tx_timeout_count++; 6359 + 6360 + ixgbe_reinit_locked(adapter); 6361 + } 6362 + 6340 6363 /** 6341 6364 * ixgbe_service_task - manages and runs subtasks 6342 6365 * @work: pointer to work_struct containing our data ··· 6366 6351 struct ixgbe_adapter, 6367 6352 service_task); 6368 6353 6354 + ixgbe_reset_subtask(adapter); 6369 6355 ixgbe_sfp_detection_subtask(adapter); 6370 6356 ixgbe_sfp_link_config_subtask(adapter); 6371 6357 ixgbe_watchdog_subtask(adapter); ··· 7548 7532 7549 7533 setup_timer(&adapter->service_timer, &ixgbe_service_timer, 7550 7534 (unsigned long) adapter); 7551 - 7552 - INIT_WORK(&adapter->reset_task, ixgbe_reset_task); 7553 7535 7554 7536 INIT_WORK(&adapter->service_task, ixgbe_service_task); 7555 7537 clear_bit(__IXGBE_SERVICE_SCHED, &adapter->state);