diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-17 16:30:26 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-17 16:30:26 -0700 |
commit | 39c2028531332cab1325637c2100f3189fa1be72 (patch) | |
tree | d425172e9caaad2b63a0b5964cc2165c215401fe | |
parent | 5c7dd710f691d1b44c39e32d2f05b4286ff51f99 (diff) | |
parent | 8ce6909f77ba1b7bcdea65cc2388fd1742b6d669 (diff) | |
download | linux-39c2028531332cab1325637c2100f3189fa1be72.tar.gz linux-39c2028531332cab1325637c2100f3189fa1be72.tar.bz2 linux-39c2028531332cab1325637c2100f3189fa1be72.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull two networking fixes from David S. Miller:
1) Thanks to Willy Tarreau and Eric Dumazet, we've unlocked a bug that's
been present in do_tcp_sendpages() since that function was written in
2002.
When we block to wait for memory we have to unconditionally try and
push out pending TCP data, otherwise we can block for an unreasonably
long amount of time.
2) Fix deadlock in e1000, fixes kernel bugzilla 43132
From Tushar Dave.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
e1000: Prevent reset task killing itself.
tcp: do_tcp_sendpages() must try to push data out on oom conditions
-rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 6 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 3 |
2 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 37caa8885c2a..8d8908d2a9b1 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -493,7 +493,11 @@ out: static void e1000_down_and_stop(struct e1000_adapter *adapter) { set_bit(__E1000_DOWN, &adapter->flags); - cancel_work_sync(&adapter->reset_task); + + /* Only kill reset task if adapter is not resetting */ + if (!test_bit(__E1000_RESETTING, &adapter->flags)) + cancel_work_sync(&adapter->reset_task); + cancel_delayed_work_sync(&adapter->watchdog_task); cancel_delayed_work_sync(&adapter->phy_info_task); cancel_delayed_work_sync(&adapter->fifo_stall_task); diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 1272a88c2a63..6589e11d57b6 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -851,8 +851,7 @@ new_segment: wait_for_sndbuf: set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); wait_for_memory: - if (copied) - tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); + tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH); if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) goto do_error; |