Skip to content

Commit

Permalink
xen/hvc: make sure console output is always emitted, with explicit po…
Browse files Browse the repository at this point in the history
…lling

We never want to rely on the hvc workqueue to emit output, because the
most interesting output is when the kernel is broken.  This will
improve oops/crash/console message for better debugging.

Instead, we force-poll until all output is emitted.

Signed-off-by: Jeremy Fitzhardinge <[email protected]>
Cc: Stable Kernel <[email protected]>
  • Loading branch information
Jeremy Fitzhardinge committed Nov 3, 2009
1 parent 973df35 commit 7825cf1
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion drivers/char/hvc_xen.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ static inline void notify_daemon(void)
notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
}

static int write_console(uint32_t vtermno, const char *data, int len)
static int __write_console(const char *data, int len)
{
struct xencons_interface *intf = xencons_interface();
XENCONS_RING_IDX cons, prod;
Expand All @@ -76,6 +76,29 @@ static int write_console(uint32_t vtermno, const char *data, int len)
return sent;
}

static int write_console(uint32_t vtermno, const char *data, int len)
{
int ret = len;

/*
* Make sure the whole buffer is emitted, polling if
* necessary. We don't ever want to rely on the hvc daemon
* because the most interesting console output is when the
* kernel is crippled.
*/
while (len) {
int sent = __write_console(data, len);

data += sent;
len -= sent;

if (unlikely(len))
HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
}

return ret;
}

static int read_console(uint32_t vtermno, char *buf, int len)
{
struct xencons_interface *intf = xencons_interface();
Expand Down

0 comments on commit 7825cf1

Please sign in to comment.