Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Jun 2015 09:18:07 -0400
From:      Julien Charbon <jch@freebsd.org>
To:        John Baldwin <jhb@FreeBSD.org>, src-committers@freebsd.org,  svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r284245 - head/sys/netinet
Message-ID:  <55798A8F.3080308@freebsd.org>
In-Reply-To: <5578ACEC.2070209@FreeBSD.org>
References:  <201506102043.t5AKh8YB058825@svn.freebsd.org> <5578ACEC.2070209@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--WHPKl0evAFXGXOSuORv2QMg5aobn7U5eH
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable


 Hi John,

On 10/06/15 17:32, John Baldwin wrote:
> On 6/10/15 4:43 PM, Julien Charbon wrote:
>> Author: jch
>> Date: Wed Jun 10 20:43:07 2015
>> New Revision: 284245
>> URL: https://svnweb.freebsd.org/changeset/base/284245
>>
>> Log:
>>   Fix a callout race condition introduced in TCP timers callouts with =
r281599.
>>   In TCP timer context, it is not enough to check callout_stop() retur=
n value
>>   to decide if a callout is still running or not, previous callout_res=
et()
>>   return values have also to be checked.
>>  =20
>>   Differential Revision:	https://reviews.freebsd.org/D2763
>>   Reviewed by:		hiren
>>   Approved by:		hiren
>>   MFC after:		1 day
>>   Sponsored by:		Verisign, Inc.
>>
>> Modified:
>>   head/sys/netinet/tcp_timer.c
>>   head/sys/netinet/tcp_timer.h
>>
>> Modified: head/sys/netinet/tcp_timer.c
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
>> --- head/sys/netinet/tcp_timer.c	Wed Jun 10 20:11:28 2015	(r284244)
>> +++ head/sys/netinet/tcp_timer.c	Wed Jun 10 20:43:07 2015	(r284245)
>> @@ -347,11 +347,12 @@ tcp_timer_2msl(void *xtp)
>>  		tp =3D tcp_close(tp);            =20
>>  	} else {
>>  		if (tp->t_state !=3D TCPS_TIME_WAIT &&
>> -		   ticks - tp->t_rcvtime <=3D TP_MAXIDLE(tp))
>> -		       callout_reset_on(&tp->t_timers->tt_2msl,
>> -			   TP_KEEPINTVL(tp), tcp_timer_2msl, tp,
>> -			   inp_to_cpuid(inp));
>> -	       else
>> +		   ticks - tp->t_rcvtime <=3D TP_MAXIDLE(tp)) {
>> +			if (!callout_reset(&tp->t_timers->tt_2msl,
>> +			   TP_KEEPINTVL(tp), tcp_timer_2msl, tp)) {
>> +				tp->t_timers->tt_flags &=3D ~TT_2MSL_RST;
>> +			}
>> +		} else
>>  		       tp =3D tcp_close(tp);
>=20
> Did you mean to use callout_reset() instead of callout_reset_on() here =
and
> elsewhere in this change?

 Thanks for this question.  Exactly, the goal here is to make clear that
once a TCP timer callout is scheduled on a core, we always reset this
callout on the same core.

 It was already the case before, but having only one callout_reset_on()
call in tcp_timer_activate() when we start callout the first time, and
callout_reset() calls everywhere else make it (hopefully) clearer.

 My 2 cents.

--
Julien


--WHPKl0evAFXGXOSuORv2QMg5aobn7U5eH
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQEcBAEBCgAGBQJVeYqYAAoJEKVlQ5Je6dhx400H/20EQhfM69CwW5ZmhYHGhCTg
cfubDWC9tfm5ipd6nzPw1Fp0ILp0Lk/BGvp0q7dFbY35kt5aRBbiY6sV7W6GJrge
Vf0g5zA06M37vHGZ8MK5GXcynWfX4GaXfvIvd99WLg4Hwj77YZLyMFSBfBFYA7be
IvDJ956k3fc9w7wve5RUgkXgAXCiedsJQYDxZlUMb9FgUq23qQpTup+Gnc36t4qa
X8YWrQuMJhbP59/hCcp3jRfqy8dEpbLSO44SiKQlcSCPZ7OYiODKgK2lobO9YXqA
EklPVNiWVEPiIPmoKUYayrNSGoGKvcB8CwFPzZ3XM5IzluG1W5n+O6Xl0jT9UBQ=
=L5Rs
-----END PGP SIGNATURE-----

--WHPKl0evAFXGXOSuORv2QMg5aobn7U5eH--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?55798A8F.3080308>