Skip to content

Commit

Permalink
xen/multicall: special-case singleton hypercalls
Browse files Browse the repository at this point in the history
Singleton calls seem to end up being pretty common, so just
directly call the hypercall rather than going via multicall.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  • Loading branch information
Jeremy Fitzhardinge committed Jul 18, 2011
1 parent 4a7b005 commit eac303b
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions arch/x86/xen/multicalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ DEFINE_PER_CPU(unsigned long, xen_mc_irq_flags);
void xen_mc_flush(void)
{
struct mc_buffer *b = &__get_cpu_var(mc_buffer);
struct multicall_entry *mc;
int ret = 0;
unsigned long flags;
int i;
Expand All @@ -67,7 +68,24 @@ void xen_mc_flush(void)

trace_xen_mc_flush(b->mcidx, b->argidx, b->cbidx);

if (b->mcidx) {
switch (b->mcidx) {
case 0:
/* no-op */
BUG_ON(b->argidx != 0);
break;

case 1:
/* Singleton multicall - bypass multicall machinery
and just do the call directly. */
mc = &b->entries[0];

mc->result = privcmd_call(mc->op,
mc->args[0], mc->args[1], mc->args[2],
mc->args[3], mc->args[4]);
ret = mc->result < 0;
break;

default:
#if MC_DEBUG
memcpy(b->debug, b->entries,
b->mcidx * sizeof(struct multicall_entry));
Expand All @@ -94,11 +112,10 @@ void xen_mc_flush(void)
}
}
#endif
}

b->mcidx = 0;
b->argidx = 0;
} else
BUG_ON(b->argidx != 0);
b->mcidx = 0;
b->argidx = 0;

for (i = 0; i < b->cbidx; i++) {
struct callback *cb = &b->callbacks[i];
Expand Down

0 comments on commit eac303b

Please sign in to comment.