]> www.infradead.org Git - users/jedix/linux-maple.git/commit
e1000e: Separate signaling for link check/link up
authorBenjamin Poirier <bpoirier@suse.com>
Fri, 21 Jul 2017 18:36:26 +0000 (11:36 -0700)
committerJack Vogel <jack.vogel@oracle.com>
Mon, 8 Jan 2018 17:48:17 +0000 (09:48 -0800)
commitb8e68b00c09fb3929b85bf35a94e090a52798406
tree133b2990ec94a5687f6df0d27268a409f1d3ca49
parentc38916edd05143619096dc94496cc97eb880f6af
e1000e: Separate signaling for link check/link up

Lennart reported the following race condition:

\ e1000_watchdog_task
    \ e1000e_has_link
        \ hw->mac.ops.check_for_link() === e1000e_check_for_copper_link
            /* link is up */
            mac->get_link_status = false;

                            /* interrupt */
                            \ e1000_msix_other
                                hw->mac.get_link_status = true;

        link_active = !hw->mac.get_link_status
        /* link_active is false, wrongly */

This problem arises because the single flag get_link_status is used to
signal two different states: link status needs checking and link status is
down.

Avoid the problem by using the return value of .check_for_link to signal
the link status to e1000e_has_link().

Reported-by: Lennart Sorensen <lsorense@csclub.uwaterloo.ca>
Signed-off-by: Benjamin Poirier <bpoirier@suse.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Orabug: 27069012
(cherry picked from commit 19110cfbb34d4af0cdfe14cd243f3b09dc95b013)
Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
Reviewed-by: Ethan Zhao <ethan.zhao@oracle.com>
drivers/net/ethernet/intel/e1000e/mac.c
drivers/net/ethernet/intel/e1000e/netdev.c