lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <57851DFF.2010202@emindsoft.com.cn>
Date:	Wed, 13 Jul 2016 00:42:39 +0800
From:	Chen Gang <chengang@...ndsoft.com.cn>
To:	Vlastimil Babka <vbabka@...e.cz>, Minchan Kim <minchan@...nel.org>
CC:	akpm@...ux-foundation.org, mgorman@...hsingularity.net,
	mhocko@...e.com, gi-oh.kim@...fitbricks.com,
	iamjoonsoo.kim@....com, hillf.zj@...baba-inc.com,
	rientjes@...gle.com, linux-mm@...ck.org,
	linux-kernel@...r.kernel.org, Chen Gang <gang.chen.5i5j@...il.com>
Subject: Re: [PATCH] mm: migrate: Use bool instead of int for the return value
 of PageMovable


On 7/12/16 15:15, Vlastimil Babka wrote:
> On 07/11/2016 09:47 PM, Chen Gang wrote:
>>
>>
>> In our case, the 2 output size are same, but under x86_64, the insns are
>> different. After uses bool, it uses push/pop instead of branch, for me,
>> it should be a little better for catching.
> 
> You mean "caching"? I don't see how this is better for caching. After the push/pop, the same branch is still there, so it's not eliminated (which would be indeed better). Somehow the original version just avoids the function prologue (push rbp, mov rsp, rbp) for the !__PageMovable(page) case. That's something I would expect e.g. if it was marked likely(), but here it's probably just accidental that the heuristics think it's likely in the "int" case and not "bool". So it's not a valid reason for prefering int over bool. The question is perhaps if it's indeed likely or unlikely and should be marked as such :)
>

Oh, sorry, after check the details, the result is a little complex (2
things are mixed together, and likely can be also considered):

 - One return statement instead of the 3 statements which will change
   the detail instructions (in fact, it has negative effect).

 - gcc 6.0 and redhat gcc 4.8 generate the different results.


The related output are:

 - If use one return statement instead of the 3 statements with gcc 6.0,
   the result is my original outputs which we discussed before.

 - If still use 3 statements (only use true, false instead of 1, 0) with
   gcc 6.0, the 2 outputs are equal.

 - If still use 3 statements (only use true, false instead of 1, 0) with
   gcc 4.8, the 2 outputs are different, and obviously, the bool will be
   a little better (no "xor %ebx,%ebx").

 - If use one return statement instead of the 3 statements with gcc 4.8,
   the result is a little bad than keeping 3 statements.

 - If we add likely(), can get the same result: bool is a little better
   (no "movzbl %al,%eax").


All together:

 - For return statement, merging multi-statement together is not a good
   idea, it will let compiler generates a little bad code.

 - For gcc 6.0, in our case, the outputs are the same (and both enable
   'likely', too).

 - For gcc 4.8, in our case, 'bool' output is a little better than 'int'
   (after enable 'likely', also get the same result)


The int output by gcc 4.8:

  0000000000001150 <PageMovable>:
      1150:       48 8b 57 08             mov    0x8(%rdi),%rdx
      1154:       55                      push   %rbp
      1155:       48 89 e5                mov    %rsp,%rbp
      1158:       53                      push   %rbx
      1159:       31 db                   xor    %ebx,%ebx
      115b:       83 e2 03                and    $0x3,%edx
      115e:       48 83 fa 02             cmp    $0x2,%rdx
      1162:       74 05                   je     1169 <__SetPageMovable+0x1169>
      1164:       89 d8                   mov    %ebx,%eax
      1166:       5b                      pop    %rbx
      1167:       5d                      pop    %rbp
      1168:       c3                      retq
      1169:       e8 00 00 00 00          callq  116e <__SetPageMovable+0x116e>
      116e:       48 85 c0                test   %rax,%rax
      1171:       74 f1                   je     1164 <__SetPageMovable+0x1164>
      1173:       48 8b 40 68             mov    0x68(%rax),%rax
      1177:       48 85 c0                test   %rax,%rax
      117a:       74 e8                   je     1164 <__SetPageMovable+0x1164>
      117c:       31 db                   xor    %ebx,%ebx
      117e:       48 83 78 68 00          cmpq   $0x0,0x68(%rax)
      1183:       0f 95 c3                setne  %bl
      1186:       89 d8                   mov    %ebx,%eax
      1188:       5b                      pop    %rbx
      1189:       5d                      pop    %rbp
      118a:       c3                      retq
      118b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

The bool output by gcc 4.8:

  0000000000001150 <PageMovable>:
      1150:       48 8b 57 08             mov    0x8(%rdi),%rdx
      1154:       55                      push   %rbp
      1155:       48 89 e5                mov    %rsp,%rbp
      1158:       53                      push   %rbx
      1159:       31 db                   xor    %ebx,%ebx
      115b:       83 e2 03                and    $0x3,%edx
      115e:       48 83 fa 02             cmp    $0x2,%rdx
      1162:       74 05                   je     1169 <__SetPageMovable+0x1169>
      1164:       89 d8                   mov    %ebx,%eax
      1166:       5b                      pop    %rbx
      1167:       5d                      pop    %rbp
      1168:       c3                      retq
      1169:       e8 00 00 00 00          callq  116e <__SetPageMovable+0x116e>
      116e:       48 85 c0                test   %rax,%rax
      1171:       74 f1                   je     1164 <__SetPageMovable+0x1164>
      1173:       48 8b 40 68             mov    0x68(%rax),%rax
      1177:       48 85 c0                test   %rax,%rax
      117a:       74 e8                   je     1164 <__SetPageMovable+0x1164>
      117c:       48 83 78 68 00          cmpq   $0x0,0x68(%rax)
      1181:       0f 95 c3                setne  %bl
      1184:       89 d8                   mov    %ebx,%eax
      1186:       5b                      pop    %rbx
      1187:       5d                      pop    %rbp
      1188:       c3                      retq
      1189:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

The int output by gcc 4.8 with likely():

  0000000000001150 <PageMovable>:
      1150:       48 8b 47 08             mov    0x8(%rdi),%rax
      1154:       83 e0 03                and    $0x3,%eax
      1157:       48 83 f8 02             cmp    $0x2,%rax
      115b:       74 03                   je     1160 <__SetPageMovable+0x1160>
      115d:       31 c0                   xor    %eax,%eax
      115f:       c3                      retq
      1160:       55                      push   %rbp
      1161:       48 89 e5                mov    %rsp,%rbp
      1164:       e8 00 00 00 00          callq  1169 <__SetPageMovable+0x1169>
      1169:       48 85 c0                test   %rax,%rax
      116c:       74 16                   je     1184 <__SetPageMovable+0x1184>
      116e:       48 8b 40 68             mov    0x68(%rax),%rax
      1172:       48 85 c0                test   %rax,%rax
      1175:       74 0d                   je     1184 <__SetPageMovable+0x1184>
      1177:       48 83 78 68 00          cmpq   $0x0,0x68(%rax)
      117c:       5d                      pop    %rbp
      117d:       0f 95 c0                setne  %al
      1180:       0f b6 c0                movzbl %al,%eax
      1183:       c3                      retq
      1184:       31 c0                   xor    %eax,%eax
      1186:       5d                      pop    %rbp
      1187:       c3                      retq
      1188:       0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
      118f:       00 

The bool output by gcc 4.8 with likely():

  0000000000001150 <PageMovable>:
      1150:       48 8b 47 08             mov    0x8(%rdi),%rax
      1154:       83 e0 03                and    $0x3,%eax
      1157:       48 83 f8 02             cmp    $0x2,%rax
      115b:       74 03                   je     1160 <__SetPageMovable+0x1160>
      115d:       31 c0                   xor    %eax,%eax
      115f:       c3                      retq
      1160:       55                      push   %rbp
      1161:       48 89 e5                mov    %rsp,%rbp
      1164:       e8 00 00 00 00          callq  1169 <__SetPageMovable+0x1169>
      1169:       48 85 c0                test   %rax,%rax
      116c:       74 13                   je     1181 <__SetPageMovable+0x1181>
      116e:       48 8b 40 68             mov    0x68(%rax),%rax
      1172:       48 85 c0                test   %rax,%rax
      1175:       74 0a                   je     1181 <__SetPageMovable+0x1181>
      1177:       48 83 78 68 00          cmpq   $0x0,0x68(%rax)
      117c:       5d                      pop    %rbp
      117d:       0f 95 c0                setne  %al
      1180:       c3                      retq
      1181:       31 c0                   xor    %eax,%eax
      1183:       5d                      pop    %rbp
      1184:       c3                      retq
      1185:       66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
      118c:       00 00 00 00 

Thanks.
 
>> The orig:
>>
>>   0000000000001290 <PageMovable>:
>>       1290:       48 8b 47 08             mov    0x8(%rdi),%rax
>>       1294:       83 e0 03                and    $0x3,%eax
>>       1297:       48 83 f8 02             cmp    $0x2,%rax
>>       129b:       74 03                   je     12a0 <__SetPageMovable+0x12a0>
>>       129d:       31 c0                   xor    %eax,%eax
>>       129f:       c3                      retq
>>       12a0:       55                      push   %rbp
>>       12a1:       48 89 e5                mov    %rsp,%rbp
>>       12a4:       e8 00 00 00 00          callq  12a9 <__SetPageMovable+0x12a9>
>>       12a9:       48 85 c0                test   %rax,%rax
>>       12ac:       74 17                   je     12c5 <__SetPageMovable+0x12c5>
>>       12ae:       48 8b 50 68             mov    0x68(%rax),%rdx
>>       12b2:       48 85 d2                test   %rdx,%rdx
>>       12b5:       74 0e                   je     12c5 <__SetPageMovable+0x12c5>
>>       12b7:       48 83 7a 68 00          cmpq   $0x0,0x68(%rdx)
>>       12bc:       b8 01 00 00 00          mov    $0x1,%eax
>>       12c1:       74 02                   je     12c5 <__SetPageMovable+0x12c5>
>>       12c3:       5d                      pop    %rbp
>>       12c4:       c3                      retq
>>       12c5:       31 c0                   xor    %eax,%eax
>>       12c7:       5d                      pop    %rbp
>>       12c8:       c3                      retq
>>       12c9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
>>
>> The new:
>>
>>   0000000000001290 <PageMovable>:
>>       1290:       48 8b 47 08             mov    0x8(%rdi),%rax
>>       1294:       55                      push   %rbp
>>       1295:       48 89 e5                mov    %rsp,%rbp
>>       1298:       53                      push   %rbx
>>       1299:       31 db                   xor    %ebx,%ebx
>>       129b:       83 e0 03                and    $0x3,%eax
>>       129e:       48 83 f8 02             cmp    $0x2,%rax
>>       12a2:       74 05                   je     12a9 <__SetPageMovable+0x12a9>
>>       12a4:       89 d8                   mov    %ebx,%eax
>>       12a6:       5b                      pop    %rbx
>>       12a7:       5d                      pop    %rbp
>>       12a8:       c3                      retq
>>       12a9:       e8 00 00 00 00          callq  12ae <__SetPageMovable+0x12ae>
>>       12ae:       48 85 c0                test   %rax,%rax
>>       12b1:       74 f1                   je     12a4 <__SetPageMovable+0x12a4>
>>       12b3:       48 8b 40 68             mov    0x68(%rax),%rax
>>       12b7:       48 85 c0                test   %rax,%rax
>>       12ba:       74 e8                   je     12a4 <__SetPageMovable+0x12a4>
>>       12bc:       48 83 78 68 00          cmpq   $0x0,0x68(%rax)
>>       12c1:       0f 95 c3                setne  %bl
>>       12c4:       89 d8                   mov    %ebx,%eax
>>       12c6:       5b                      pop    %rbx
>>       12c7:       5d                      pop    %rbp
>>       12c8:       c3                      retq
>>       12c9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
>>
>> Thanks.
>>
> 
> 

-- 
Chen Gang (陈刚)

Managing Natural Environments is the Duty of Human Beings.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ