Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a122d623 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Jeremy Fitzhardinge
Browse files

xen: add some debug output for failed multicalls



Multicalls are expected to never fail, and the normal response to a
failed multicall is very terse.  In the interests of better
debuggability, add some more verbose output.  It may be worth turning
this off once it all seems more tested.

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
parent e3d26976
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -26,11 +26,16 @@

#include "multicalls.h"

#define MC_DEBUG	1

#define MC_BATCH	32
#define MC_ARGS		(MC_BATCH * 16 / sizeof(u64))

struct mc_buffer {
	struct multicall_entry entries[MC_BATCH];
#if MC_DEBUG
	struct multicall_entry debug[MC_BATCH];
#endif
	u64 args[MC_ARGS];
	struct callback {
		void (*fn)(void *);
@@ -56,11 +61,31 @@ void xen_mc_flush(void)
	local_irq_save(flags);

	if (b->mcidx) {
#if MC_DEBUG
		memcpy(b->debug, b->entries,
		       b->mcidx * sizeof(struct multicall_entry));
#endif

		if (HYPERVISOR_multicall(b->entries, b->mcidx) != 0)
			BUG();
		for (i = 0; i < b->mcidx; i++)
			if (b->entries[i].result < 0)
				ret++;

#if MC_DEBUG
		if (ret) {
			printk(KERN_ERR "%d multicall(s) failed: cpu %d\n",
			       ret, smp_processor_id());
			for(i = 0; i < b->mcidx; i++) {
				printk("  call %2d/%d: op=%lu arg=[%lx] result=%ld\n",
				       i+1, b->mcidx,
				       b->debug[i].op,
				       b->debug[i].args[0],
				       b->entries[i].result);
			}
		}
#endif

		b->mcidx = 0;
		b->argidx = 0;
	} else