sctp: improve how SSN, TSN and ASCONF serial are compared
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Tue, 20 Sep 2016 21:19:14 +0000 (18:19 -0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Sep 2016 10:54:58 +0000 (06:54 -0400)
commit182691d0998400f35ad304718024e60feaa864aa
treeee337cdd7533abaf1e538a188184307c1de021f0
parenta3007446e53af07c53bdb4cabad7b3ea60859da4
sctp: improve how SSN, TSN and ASCONF serial are compared

Make it similar to time_before() macros:
- easier to understand
- make use of typecheck() to avoid working on unexpected variable types
  (made the issue on previous patch visible)
- for _[lg]te versions, slighly faster, as the compiler used to generate
  a sequence of cmp/je/cmp/js instructions and now it's sub/test/jle
  (for _lte):

Before, for sctp_outq_sack:
if (primary->cacc.changeover_active) {
    1f01: 80 b9 84 02 00 00 00  cmpb   $0x0,0x284(%rcx)
    1f08: 74 6e                 je     1f78 <sctp_outq_sack+0xe8>
u8 clear_cycling = 0;

if (TSN_lte(primary->cacc.next_tsn_at_change, sack_ctsn)) {
    1f0a: 8b 81 80 02 00 00     mov    0x280(%rcx),%eax
return ((s) - (t)) & TSN_SIGN_BIT;
}

static inline int TSN_lte(__u32 s, __u32 t)
{
return ((s) == (t)) || (((s) - (t)) & TSN_SIGN_BIT);
    1f10: 8b 7d bc              mov    -0x44(%rbp),%edi
    1f13: 39 c7                 cmp    %eax,%edi
    1f15: 74 25                 je     1f3c <sctp_outq_sack+0xac>
    1f17: 39 f8                 cmp    %edi,%eax
    1f19: 78 21                 js     1f3c <sctp_outq_sack+0xac>
primary->cacc.changeover_active = 0;

After:
if (primary->cacc.changeover_active) {
    1ee7: 80 b9 84 02 00 00 00  cmpb   $0x0,0x284(%rcx)
    1eee: 74 73                 je     1f63 <sctp_outq_sack+0xf3>
u8 clear_cycling = 0;

if (TSN_lte(primary->cacc.next_tsn_at_change, sack_ctsn)) {
    1ef0: 8b 81 80 02 00 00     mov    0x280(%rcx),%eax
    1ef6: 2b 45 b4              sub    -0x4c(%rbp),%eax
    1ef9: 85 c0                 test   %eax,%eax
    1efb: 7e 26                 jle    1f23 <sctp_outq_sack+0xb3>
primary->cacc.changeover_active = 0;

*_lt() generated pretty much the same code.
Tested with gcc (GCC) 6.1.1 20160621.

This patch also removes SSN_lte as it is not used and cleanups some
comments.

Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/sm.h