On Thu, 15 Mar 2012 15:46:31 +0200
Avi Kivity <[email protected]> wrote:
> You can look at what's happening by doing
>
> perf record -a -f
> perf report
>
> using the TUI, select 'annotate rmap_get_next'
>
> You should see where the time is spent.
>
Since the default sampling rate was not enough to get consistent numbers,
I raised the frequency to 50K/sec; so there was surely some overheads
during that sampling.
>From the result below, it seems to be the prologue and epilogue on which
we spent most of our time.
Takuya
===
Percent | Source code & Disassembly of kvm.ko
------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 0001d260 <rmap_get_next>:
: * Must be used with a valid iterator: e.g. after
rmap_get_first().
: *
: * Returns true if spte is found, false otherwise.
: */
: static bool rmap_get_next(struct rmap_iterator *iter)
: {
1.75 : 1d260: push %ebp
17.54 : 1d261: mov %esp,%ebp
12.28 : 1d263: push %ebx
7.02 : 1d264: call 1d265 <rmap_get_next+0x5>
: if (iter->desc) {
1.75 : 1d269: mov 0x4(%eax),%ecx
: * Must be used with a valid iterator: e.g. after
rmap_get_first().
: *
: * Returns true if spte is found, false otherwise.
: */
: static bool rmap_get_next(struct rmap_iterator *iter)
: {
22.81 : 1d26c: mov %eax,%edx
: if (iter->desc) {
0.00 : 1d26e: test %ecx,%ecx
0.00 : 1d270: je 1d2b8 <rmap_get_next+0x58>
: if (iter->pos < PTE_LIST_EXT - 1) {
0.00 : 1d272: mov 0x8(%eax),%eax
0.00 : 1d275: cmp $0x5,%eax
0.00 : 1d278: jg 1d298 <rmap_get_next+0x38>
: ++iter->pos;
0.00 : 1d27a: add $0x1,%eax
0.00 : 1d27d: mov %eax,0x8(%edx)
: iter->sptep =
iter->desc->sptes[iter->pos];
0.00 : 1d280: mov (%ecx,%eax,4),%ebx
: if (iter->sptep)
: return true;
0.00 : 1d283: mov $0x1,%eax
: {
: if (iter->desc) {
: if (iter->pos < PTE_LIST_EXT - 1) {
: ++iter->pos;
: iter->sptep =
iter->desc->sptes[iter->pos];
: if (iter->sptep)
0.00 : 1d288: test %ebx,%ebx
: static bool rmap_get_next(struct rmap_iterator *iter)
: {
: if (iter->desc) {
: if (iter->pos < PTE_LIST_EXT - 1) {
: ++iter->pos;
: iter->sptep =
iter->desc->sptes[iter->pos];
0.00 : 1d28a: mov %ebx,(%edx)
: if (iter->sptep)
0.00 : 1d28c: je 1d298 <rmap_get_next+0x38>
: }
: }
:
: iter->sptep = NULL;
: return false;
: }
0.00 : 1d28e: pop %ebx
0.00 : 1d28f: pop %ebp
0.00 : 1d290: ret
0.00 : 1d291: lea 0x0(%esi,%eiz,1),%esi
: iter->sptep =
iter->desc->sptes[iter->pos];
: if (iter->sptep)
: return true;
: }
:
: iter->desc = iter->desc->more;
0.00 : 1d298: mov 0x1c(%ecx),%eax
:
: if (iter->desc) {
0.00 : 1d29b: test %eax,%eax
: iter->sptep =
iter->desc->sptes[iter->pos];
: if (iter->sptep)
: return true;
: }
:
: iter->desc = iter->desc->more;
0.00 : 1d29d: mov %eax,0x4(%edx)
:
: if (iter->desc) {
0.00 : 1d2a0: je 1d2b8 <rmap_get_next+0x58>
: iter->pos = 0;
0.00 : 1d2a2: movl $0x0,0x8(%edx)
: iter->sptep =
iter->desc->sptes[iter->pos];
0.00 : 1d2a9: mov (%eax),%eax
0.00 : 1d2ab: mov %eax,(%edx)
0.00 : 1d2ad: mov $0x1,%eax
: }
: }
:
: iter->sptep = NULL;
: return false;
: }
0.00 : 1d2b2: pop %ebx
0.00 : 1d2b3: pop %ebp
0.00 : 1d2b4: ret
0.00 : 1d2b5: lea 0x0(%esi),%esi
: /* desc->sptes[0] cannot be NULL */
: return true;
: }
: }
:
: iter->sptep = NULL;
0.00 : 1d2b8: movl $0x0,(%edx)
: return false;
1.75 : 1d2be: xor %eax,%eax
: }
12.28 : 1d2c0: pop %ebx
22.81 : 1d2c1: pop %ebp
0.00 : 1d2c2: ret
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html