------------------------------------------------ Percent | Source code & Disassembly of vmlinux ------------------------------------------------ : : : : Disassembly of section .text: : : ffffffff810e4460 : : * : * Returns the number of slab objects which we shrunk. : */ : unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, : unsigned long lru_pages) : { 0.00 : ffffffff810e4460: 55 push %rbp 0.27 : ffffffff810e4461: 48 89 e5 mov %rsp,%rbp 0.00 : ffffffff810e4464: 41 57 push %r15 0.00 : ffffffff810e4466: 41 56 push %r14 0.36 : ffffffff810e4468: 41 55 push %r13 0.00 : ffffffff810e446a: 41 54 push %r12 0.00 : ffffffff810e446c: 53 push %rbx 0.00 : ffffffff810e446d: 48 83 ec 18 sub $0x18,%rsp 0.45 : ffffffff810e4471: e8 8a 54 f2 ff callq ffffffff81009900 : struct shrinker *shrinker; : unsigned long ret = 0; : : if (scanned == 0) : scanned = SWAP_CLUSTER_MAX; 0.00 : ffffffff810e4476: b8 20 00 00 00 mov $0x20,%eax : : if (!down_read_trylock(&shrinker_rwsem)) { : /* Assume we'll be able to shrink next time */ : ret = 1; 0.00 : ffffffff810e447b: 41 bc 01 00 00 00 mov $0x1,%r12d : { : struct shrinker *shrinker; : unsigned long ret = 0; : : if (scanned == 0) : scanned = SWAP_CLUSTER_MAX; 0.09 : ffffffff810e4481: 48 85 ff test %rdi,%rdi : * : * Returns the number of slab objects which we shrunk. : */ : unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, : unsigned long lru_pages) : { 0.00 : ffffffff810e4484: 49 89 fd mov %rdi,%r13 : unsigned long ret = 0; : : if (scanned == 0) : scanned = SWAP_CLUSTER_MAX; : : if (!down_read_trylock(&shrinker_rwsem)) { 0.00 : ffffffff810e4487: 48 c7 c7 30 16 a3 81 mov $0xffffffff81a31630,%rdi : { : struct shrinker *shrinker; : unsigned long ret = 0; : : if (scanned == 0) : scanned = SWAP_CLUSTER_MAX; 0.00 : ffffffff810e448e: 4c 0f 44 e8 cmove %rax,%r13 : * : * Returns the number of slab objects which we shrunk. : */ : unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, : unsigned long lru_pages) : { 0.27 : ffffffff810e4492: 41 89 f6 mov %esi,%r14d 0.00 : ffffffff810e4495: 49 89 d7 mov %rdx,%r15 : unsigned long ret = 0; : : if (scanned == 0) : scanned = SWAP_CLUSTER_MAX; : : if (!down_read_trylock(&shrinker_rwsem)) { 0.00 : ffffffff810e4498: e8 07 e7 f8 ff callq ffffffff81072ba4 0.00 : ffffffff810e449d: 85 c0 test %eax,%eax 0.00 : ffffffff810e449f: 0f 84 0f 01 00 00 je ffffffff810e45b4 : /* Assume we'll be able to shrink next time */ : ret = 1; : goto out; : } : : list_for_each_entry(shrinker, &shrinker_list, list) { 0.00 : ffffffff810e44a5: 48 8b 1d a4 d1 94 00 mov 0x94d1a4(%rip),%rbx # ffffffff81a31650 : unsigned long long delta; : unsigned long total_scan; : unsigned long max_pass; : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); : delta = (4 * scanned) / shrinker->seeks; 0.71 : ffffffff810e44ac: 49 c1 e5 02 shl $0x2,%r13 : */ : unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, : unsigned long lru_pages) : { : struct shrinker *shrinker; : unsigned long ret = 0; 0.00 : ffffffff810e44b0: 45 30 e4 xor %r12b,%r12b : unsigned long long delta; : unsigned long total_scan; : unsigned long max_pass; : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); : delta = (4 * scanned) / shrinker->seeks; 0.00 : ffffffff810e44b3: 4c 89 6d c8 mov %r13,-0x38(%rbp) : delta *= max_pass; : do_div(delta, lru_pages + 1); 0.00 : ffffffff810e44b7: 41 ff c7 inc %r15d : /* Assume we'll be able to shrink next time */ : ret = 1; : goto out; : } : : list_for_each_entry(shrinker, &shrinker_list, list) { 0.18 : ffffffff810e44ba: 48 83 eb 10 sub $0x10,%rbx 0.00 : ffffffff810e44be: e9 ce 00 00 00 jmpq ffffffff810e4591 : unsigned long long delta; : unsigned long total_scan; : unsigned long max_pass; : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); 0.00 : ffffffff810e44c3: 44 89 f2 mov %r14d,%edx 0.00 : ffffffff810e44c6: 31 f6 xor %esi,%esi 1.69 : ffffffff810e44c8: 48 89 df mov %rbx,%rdi 0.00 : ffffffff810e44cb: ff 13 callq *(%rbx) : delta = (4 * scanned) / shrinker->seeks; 0.62 : ffffffff810e44cd: 48 63 4b 08 movslq 0x8(%rbx),%rcx : list_for_each_entry(shrinker, &shrinker_list, list) { : unsigned long long delta; : unsigned long total_scan; : unsigned long max_pass; : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); 0.71 : ffffffff810e44d1: 4c 63 e8 movslq %eax,%r13 : delta = (4 * scanned) / shrinker->seeks; 0.09 : ffffffff810e44d4: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.36 : ffffffff810e44d8: 31 d2 xor %edx,%edx 0.36 : ffffffff810e44da: 48 f7 f1 div %rcx : delta *= max_pass; : do_div(delta, lru_pages + 1); 30.21 : ffffffff810e44dd: 31 d2 xor %edx,%edx : unsigned long total_scan; : unsigned long max_pass; : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); : delta = (4 * scanned) / shrinker->seeks; : delta *= max_pass; 0.00 : ffffffff810e44df: 49 0f af c5 imul %r13,%rax : do_div(delta, lru_pages + 1); 4.01 : ffffffff810e44e3: 49 f7 f7 div %r15 : shrinker->nr += delta; 42.16 : ffffffff810e44e6: 48 03 43 20 add 0x20(%rbx),%rax : if (shrinker->nr < 0) { 1.34 : ffffffff810e44ea: 48 85 c0 test %rax,%rax : : max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); : delta = (4 * scanned) / shrinker->seeks; : delta *= max_pass; : do_div(delta, lru_pages + 1); : shrinker->nr += delta; 2.23 : ffffffff810e44ed: 48 89 43 20 mov %rax,0x20(%rbx) : if (shrinker->nr < 0) { 0.00 : ffffffff810e44f1: 79 18 jns ffffffff810e450b : printk(KERN_ERR "shrink_slab: %pF negative objects to " 0.00 : ffffffff810e44f3: 48 8b 33 mov (%rbx),%rsi 0.00 : ffffffff810e44f6: 48 89 c2 mov %rax,%rdx 0.00 : ffffffff810e44f9: 48 c7 c7 c2 d7 7a 81 mov $0xffffffff817ad7c2,%rdi 0.00 : ffffffff810e4500: 31 c0 xor %eax,%eax 0.00 : ffffffff810e4502: e8 db 85 38 00 callq ffffffff8146cae2 : "delete nr=%ld\n", : shrinker->shrink, shrinker->nr); : shrinker->nr = max_pass; 0.00 : ffffffff810e4507: 4c 89 6b 20 mov %r13,0x20(%rbx) : /* : * Avoid risking looping forever due to too large nr value: : * never try to free more than twice the estimate number of : * freeable entries. : */ : if (shrinker->nr > max_pass * 2) 1.87 : ffffffff810e450b: 4d 01 ed add %r13,%r13 0.00 : ffffffff810e450e: 4c 39 6b 20 cmp %r13,0x20(%rbx) 0.00 : ffffffff810e4512: 76 04 jbe ffffffff810e4518 : shrinker->nr = max_pass * 2; 0.00 : ffffffff810e4514: 4c 89 6b 20 mov %r13,0x20(%rbx) : : total_scan = shrinker->nr; 6.77 : ffffffff810e4518: 4c 8b 6b 20 mov 0x20(%rbx),%r13 : shrinker->nr = 0; 0.00 : ffffffff810e451c: 48 c7 43 20 00 00 00 movq $0x0,0x20(%rbx) 0.00 : ffffffff810e4523: 00 : : while (total_scan >= SHRINK_BATCH) { 0.00 : ffffffff810e4524: eb 59 jmp ffffffff810e457f : long this_scan = SHRINK_BATCH; : int shrink_ret; : int nr_before; : : nr_before = (*shrinker->shrink)(shrinker, 0, gfp_mask); 0.00 : ffffffff810e4526: 31 f6 xor %esi,%esi 0.00 : ffffffff810e4528: 44 89 f2 mov %r14d,%edx 0.00 : ffffffff810e452b: 48 89 df mov %rbx,%rdi 0.00 : ffffffff810e452e: ff 13 callq *(%rbx) : shrink_ret = (*shrinker->shrink)(shrinker, this_scan, 0.00 : ffffffff810e4530: 44 89 f2 mov %r14d,%edx 0.00 : ffffffff810e4533: be 80 00 00 00 mov $0x80,%esi 0.00 : ffffffff810e4538: 48 89 df mov %rbx,%rdi 0.00 : ffffffff810e453b: 89 45 c0 mov %eax,-0x40(%rbp) 0.00 : ffffffff810e453e: ff 13 callq *(%rbx) : gfp_mask); : if (shrink_ret == -1) 0.00 : ffffffff810e4540: 83 f8 ff cmp $0xffffffff,%eax 0.00 : ffffffff810e4543: 8b 4d c0 mov -0x40(%rbp),%ecx 0.00 : ffffffff810e4546: 74 3d je ffffffff810e4585 : break; : if (shrink_ret < nr_before) 0.00 : ffffffff810e4548: 39 c8 cmp %ecx,%eax 0.00 : ffffffff810e454a: 7d 08 jge ffffffff810e4554 : ret += nr_before - shrink_ret; 0.00 : ffffffff810e454c: 29 c1 sub %eax,%ecx 0.00 : ffffffff810e454e: 48 63 c9 movslq %ecx,%rcx 0.00 : ffffffff810e4551: 49 01 cc add %rcx,%r12 : count_vm_events(SLABS_SCANNED, this_scan); 0.00 : ffffffff810e4554: be 80 00 00 00 mov $0x80,%esi 0.00 : ffffffff810e4559: bf 1f 00 00 00 mov $0x1f,%edi : total_scan -= this_scan; 0.00 : ffffffff810e455e: 49 83 c5 80 add $0xffffffffffffff80,%r13 : gfp_mask); : if (shrink_ret == -1) : break; : if (shrink_ret < nr_before) : ret += nr_before - shrink_ret; : count_vm_events(SLABS_SCANNED, this_scan); 0.00 : ffffffff810e4562: e8 d5 f2 ff ff callq ffffffff810e383c : total_scan -= this_scan; : : cond_resched(); 0.00 : ffffffff810e4567: 31 d2 xor %edx,%edx 0.00 : ffffffff810e4569: be 1a 01 00 00 mov $0x11a,%esi 0.00 : ffffffff810e456e: 48 c7 c7 1c d7 7a 81 mov $0xffffffff817ad71c,%rdi 0.00 : ffffffff810e4575: e8 ce 36 f6 ff callq ffffffff81047c48 <__might_sleep> 0.00 : ffffffff810e457a: e8 6b 01 39 00 callq ffffffff814746ea <_cond_resched> : shrinker->nr = max_pass * 2; : : total_scan = shrinker->nr; : shrinker->nr = 0; : : while (total_scan >= SHRINK_BATCH) { 1.43 : ffffffff810e457f: 49 83 fd 7f cmp $0x7f,%r13 0.00 : ffffffff810e4583: 77 a1 ja ffffffff810e4526 : total_scan -= this_scan; : : cond_resched(); : } : : shrinker->nr += total_scan; 0.00 : ffffffff810e4585: 4c 01 6b 20 add %r13,0x20(%rbx) : /* Assume we'll be able to shrink next time */ : ret = 1; : goto out; : } : : list_for_each_entry(shrinker, &shrinker_list, list) { 1.34 : ffffffff810e4589: 48 8b 5b 10 mov 0x10(%rbx),%rbx 0.00 : ffffffff810e458d: 48 83 eb 10 sub $0x10,%rbx 0.00 : ffffffff810e4591: 48 8b 43 10 mov 0x10(%rbx),%rax 0.00 : ffffffff810e4595: 0f 18 08 prefetcht0 (%rax) 1.52 : ffffffff810e4598: 48 8d 43 10 lea 0x10(%rbx),%rax 0.00 : ffffffff810e459c: 48 3d 50 16 a3 81 cmp $0xffffffff81a31650,%rax 0.00 : ffffffff810e45a2: 0f 85 1b ff ff ff jne ffffffff810e44c3 : cond_resched(); : } : : shrinker->nr += total_scan; : } : up_read(&shrinker_rwsem); 0.00 : ffffffff810e45a8: 48 c7 c7 30 16 a3 81 mov $0xffffffff81a31630,%rdi 0.00 : ffffffff810e45af: e8 3a e6 f8 ff callq ffffffff81072bee : out: : cond_resched(); 0.09 : ffffffff810e45b4: 31 d2 xor %edx,%edx 0.00 : ffffffff810e45b6: be 21 01 00 00 mov $0x121,%esi 0.00 : ffffffff810e45bb: 48 c7 c7 1c d7 7a 81 mov $0xffffffff817ad71c,%rdi 0.00 : ffffffff810e45c2: e8 81 36 f6 ff callq ffffffff81047c48 <__might_sleep> 0.18 : ffffffff810e45c7: e8 1e 01 39 00 callq ffffffff814746ea <_cond_resched> : return ret; : } 0.18 : ffffffff810e45cc: 48 83 c4 18 add $0x18,%rsp 0.00 : ffffffff810e45d0: 4c 89 e0 mov %r12,%rax 0.00 : ffffffff810e45d3: 5b pop %rbx 0.18 : ffffffff810e45d4: 41 5c pop %r12 0.00 : ffffffff810e45d6: 41 5d pop %r13 0.00 : ffffffff810e45d8: 41 5e pop %r14 0.00 : ffffffff810e45da: 41 5f pop %r15 0.36 : ffffffff810e45dc: 5d pop %rbp