Skip to content

Commit

Permalink
s390x/sclpconsole: Avoid hanging SCLP ASCII console
Browse files Browse the repository at this point in the history
Force recalculation of file descriptor sets for main loop's poll(),
in order to be able to readd a possibly removed input file descriptor
after can_read() returned 0 (zero).

Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
  • Loading branch information
Heinz Graalfs authored and cohuck committed Nov 5, 2014
1 parent 87f2eff commit bb3e9e1
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion hw/char/sclpconsole.c
Expand Up @@ -36,6 +36,7 @@ typedef struct SCLPConsole {
uint32_t iov_bs; /* offset in buf for char layer read operation */
uint32_t iov_data_len; /* length of byte stream in buffer */
uint32_t iov_sclp_rest; /* length of byte stream not read via SCLP */
bool notify; /* qemu_notify_event() req'd if true */
} SCLPConsole;

/* character layer call-back functions */
Expand All @@ -44,8 +45,12 @@ typedef struct SCLPConsole {
static int chr_can_read(void *opaque)
{
SCLPConsole *scon = opaque;
int avail = SIZE_BUFFER_VT220 - scon->iov_data_len;

return SIZE_BUFFER_VT220 - scon->iov_data_len;
if (avail == 0) {
scon->notify = true;
}
return avail;
}

/* Send data from a char device over to the guest */
Expand Down Expand Up @@ -113,6 +118,10 @@ static void get_console_data(SCLPEvent *event, uint8_t *buf, size_t *size,
cons->iov_sclp += avail;
/* more data pending */
}
if (cons->notify) {
cons->notify = false;
qemu_notify_event();
}
}

static int read_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr,
Expand Down Expand Up @@ -229,6 +238,7 @@ static void console_reset(DeviceState *dev)
scon->iov_bs = 0;
scon->iov_data_len = 0;
scon->iov_sclp_rest = 0;
scon->notify = false;
}

static int console_exit(SCLPEvent *event)
Expand Down

0 comments on commit bb3e9e1

Please sign in to comment.