Re:[PATCH 1/1] indirect function calls elimination in IO scheduler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jens Axboe writes

> I don't really see the patch doing what you describe - the indirect
> function calls are the same.

For example on Pentium4 in the function elv_next_request() the line
            struct request *rq =
q->elevator->ops->elevator_next_req_fn(q);
before patch had required 11% of function running time as oprofile
reports
           %
    26  0.0457 :c0270ecb:       mov    0xc(%edi),%eax
  3455  6.0670 :c0270ece:       mov    (%eax),%eax
  2848  5.0011 :c0270ed0:       mov    %edi,(%esp)
  1538  2.7008 :c0270ed3:       call   *0xc(%eax)

	A patch which would delete all indirect calls was tryed
        struct request *rq = q->elevator_cp.ops.elevator_next_req_fn(q);
     9  0.0224 :c0270eea:       mov    %edi,(%esp)
  3814  9.4793 :c0270eed:       call   *0x18(%edi)

But additional memory would be needed for 'ops' in each queue. The
intermediate (proposed) patch has the same timing effect but saves some
memory:
	struct request *rq =
q->elevator_cp.ops->elevator_next_req_fn(q);
drivers/block/elevator.c:351
ffffffff802a8b97:       49 8b 44 24 18          mov    0x18(%r12),%rax
ffffffff802a8b9c:       4c 89 e7                mov    %r12,%rdi
ffffffff802a8b9f:       ff 50 18                callq  *0x18(%rax)

For Itanium the difference is huge:
	Before patch:
drivers/block/elevator.c:351
a0000001002cbb60:       0d f0 00 4c 18 10       [MFI]   ld8 r30=[r38]
a0000001002cbb66:       00 00 00 02 00 c0               nop.f 0x0
a0000001002cbb6c:       05 00 01 84                     mov r46=r32;;
a0000001002cbb70:       0b e8 00 3c 18 10       [MMI]   ld8 r29=[r30];;
a0000001002cbb76:       c0 c1 74 00 42 00               adds r28=24,r29
a0000001002cbb7c:       00 00 04 00                     nop.i 0x0;;
a0000001002cbb80:       0b d0 00 38 18 10       [MMI]   ld8 r26=[r28];;
a0000001002cbb86:       b0 41 68 30 28 00               ld8 r27=[r26],8
a0000001002cbb8c:       00 00 04 00                     nop.i 0x0;;
a0000001002cbb90:       11 08 00 34 18 10       [MIB]   ld8 r1=[r26]
a0000001002cbb96:       70 d8 04 80 03 00               mov b7=r27
a0000001002cbb9c:       78 00 80 10
br.call.sptk.many

	After patching there is no object code for considered line. It
is scattered mixed with other source code lines.

Leonid
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux