From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757466AbcAJV5A (ORCPT ); Sun, 10 Jan 2016 16:57:00 -0500 Received: from vulcan.natalenko.name ([104.207.131.136]:37728 "EHLO vulcan.natalenko.name" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751645AbcAJV47 convert rfc822-to-8bit (ORCPT ); Sun, 10 Jan 2016 16:56:59 -0500 DMARC-Filter: OpenDMARC Filter v1.3.1 vulcan.natalenko.name 7A59278C5A Authentication-Results: vulcan.natalenko.name; dmarc=none header.from=natalenko.name From: Oleksandr Natalenko To: Neal Cardwell Cc: Yuchung Cheng , netdev , "linux-kernel@vger.kernel.org" , Patrick McHardy , Hideaki YOSHIFUJI , James Morris , Alexey Kuznetsov , "David S. Miller" Subject: Re: [REGRESSION] tcp/ipv4: kernel panic because of (possible) division by zero Date: Sun, 10 Jan 2016 23:56:54 +0200 Message-ID: <3240923.Qg3kfz0Bvr@spock> User-Agent: KMail/5.1 (Linux/4.3.0-pf3; KDE/5.17.0; x86_64; ; ) In-Reply-To: References: <26396443.iDTTxgChSj@spock> <1562805.Wa36G0OKaZ@spock> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org OK, it seems the assumption about YeAH is correct. Here is stacktrace fired by WARN_ON_ONCE(): https://gist.github.com/851cedcfca60d6120035 Is there sufficient info for you to prepare upstream patch? On неділя, 10 січня 2016 р. 12:29:17 EET Neal Cardwell wrote: > On Sun, Jan 10, 2016 at 9:57 AM, Oleksandr Natalenko > > wrote: > > I use YeAH. But YeAH code wasn't touched between 4.2 and 4.3. > > Oh, interesting. Looks like tcp_yeah_ssthresh() has a bug where its > intended reduction can be bigger than tp->snd_cwnd, leading to it > return a zero ssthresh (or even an ssthresh that underflows to ~4 > billion). If tcp_yeah_ssthresh() returns an ssthresh of 0 then PRR > will try to pull the cwnd down to 0. > > Can you please leave ECN and Yeah enabled and run something like the > following patch, to verify this conjecture? If the conjecture is > right, then the tcp_yeah warning should fire but not the new > tcp_cwnd_reduction() warning: > > ----------- > diff --git a/net/ipv4/tcp_yeah.c b/net/ipv4/tcp_yeah.c > index 17d3566..ef60cba 100644 > --- a/net/ipv4/tcp_yeah.c > +++ b/net/ipv4/tcp_yeah.c > @@ -206,6 +206,7 @@ static u32 tcp_yeah_ssthresh(struct sock *sk) > const struct tcp_sock *tp = tcp_sk(sk); > struct yeah *yeah = inet_csk_ca(sk); > u32 reduction; > + s32 ssthresh; > > if (yeah->doing_reno_now < TCP_YEAH_RHO) { > reduction = yeah->lastQ; > @@ -219,7 +220,9 @@ static u32 tcp_yeah_ssthresh(struct sock *sk) > yeah->fast_count = 0; > yeah->reno_count = max(yeah->reno_count>>1, 2U); > > - return tp->snd_cwnd - reduction; > + ssthresh = tp->snd_cwnd - reduction; > + if (WARN_ON_ONCE(ssthresh <= 0)) > + ssthresh = 1; > } > > static struct tcp_congestion_ops tcp_yeah __read_mostly = { > ----------- > > If that works, then we may just want a version of this patch without > the warning. > > Thanks! > neal