s390x/sclpconsole-lm: Fix and simplify irq setup
valgrind complains about a memory leak in irq setup of sclpconsole: ==42117== 8 bytes in 1 blocks are definitely lost in loss record 89of 833 ==42117== at 0x4031AFE: malloc (vg_replace_malloc.c:292) ==42117== by 0x8022F855: malloc_and_trace (vl.c:2715) ==42117== by 0x4145569: g_malloc (in /usr/lib64/libglib-2.0.so.0.3400.2) ==42117== by 0x800F696D: qemu_extend_irqs (irq.c:51) ==42117== by 0x800F6AF7: qemu_allocate_irqs (irq.c:68) ==42117== by 0x800F5685: console_init (sclpconsole.c:235) ==42117== by 0x80297C79: event_realize (event-facility.c:386) ==42117== by 0x80105071: device_set_realized (qdev.c:693) ==42117== by 0x801CDC4B: property_set_bool (object.c:1337) ==42117== by 0x801CBD7F: object_property_set (object.c:819) [...] We dont need the indirection of an qemu irq to inject an slcp interrupt. Fixes a valgrind error and makes the code simpler. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Acked-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com>
This commit is contained in:
parent
b074e62205
commit
4f3ed190a6
@ -41,7 +41,6 @@ typedef struct SCLPConsoleLM {
|
|||||||
uint32_t write_errors; /* errors writing to char layer */
|
uint32_t write_errors; /* errors writing to char layer */
|
||||||
uint32_t length; /* length of byte stream in buffer */
|
uint32_t length; /* length of byte stream in buffer */
|
||||||
uint8_t buf[SIZE_CONSOLE_BUFFER];
|
uint8_t buf[SIZE_CONSOLE_BUFFER];
|
||||||
qemu_irq irq_console_read;
|
|
||||||
} SCLPConsoleLM;
|
} SCLPConsoleLM;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -68,13 +67,15 @@ static int chr_can_read(void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void receive_from_chr_layer(SCLPConsoleLM *scon, const uint8_t *buf,
|
static void chr_read(void *opaque, const uint8_t *buf, int size)
|
||||||
int size)
|
|
||||||
{
|
{
|
||||||
|
SCLPConsoleLM *scon = opaque;
|
||||||
|
|
||||||
assert(size == 1);
|
assert(size == 1);
|
||||||
|
|
||||||
if (*buf == '\r' || *buf == '\n') {
|
if (*buf == '\r' || *buf == '\n') {
|
||||||
scon->event.event_pending = true;
|
scon->event.event_pending = true;
|
||||||
|
sclp_service_interrupt(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scon->buf[scon->length] = *buf;
|
scon->buf[scon->length] = *buf;
|
||||||
@ -84,20 +85,6 @@ static void receive_from_chr_layer(SCLPConsoleLM *scon, const uint8_t *buf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Send data from a char device over to the guest
|
|
||||||
*/
|
|
||||||
static void chr_read(void *opaque, const uint8_t *buf, int size)
|
|
||||||
{
|
|
||||||
SCLPConsoleLM *scon = opaque;
|
|
||||||
|
|
||||||
receive_from_chr_layer(scon, buf, size);
|
|
||||||
if (scon->event.event_pending) {
|
|
||||||
/* trigger SCLP read operation */
|
|
||||||
qemu_irq_raise(scon->irq_console_read);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* functions to be called by event facility */
|
/* functions to be called by event facility */
|
||||||
|
|
||||||
static bool can_handle_event(uint8_t type)
|
static bool can_handle_event(uint8_t type)
|
||||||
@ -298,11 +285,6 @@ static int write_event_data(SCLPEvent *event, EventBufferHeader *ebh)
|
|||||||
return SCLP_RC_NORMAL_COMPLETION;
|
return SCLP_RC_NORMAL_COMPLETION;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void trigger_console_data(void *opaque, int n, int level)
|
|
||||||
{
|
|
||||||
sclp_service_interrupt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* functions for live migration */
|
/* functions for live migration */
|
||||||
|
|
||||||
static const VMStateDescription vmstate_sclplmconsole = {
|
static const VMStateDescription vmstate_sclplmconsole = {
|
||||||
@ -338,7 +320,6 @@ static int console_init(SCLPEvent *event)
|
|||||||
if (scon->chr) {
|
if (scon->chr) {
|
||||||
qemu_chr_add_handlers(scon->chr, chr_can_read, chr_read, NULL, scon);
|
qemu_chr_add_handlers(scon->chr, chr_can_read, chr_read, NULL, scon);
|
||||||
}
|
}
|
||||||
scon->irq_console_read = *qemu_allocate_irqs(trigger_console_data, NULL, 1);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user