Re: [PATCHv7 4/4] virtio_console: Add support for remoteproc serial
From: Amit Shah <hidden>
Date: 2012-11-01 07:39:51
On (Tue) 23 Oct 2012 [12:17:49], Rusty Russell wrote:
sjur.brandeland@stericsson.com writes:quoted
From: Sjur Brændeland <redacted>
quoted
@@ -1415,7 +1524,16 @@ static void remove_port_data(struct port *port) /* Remove buffers we queued up for the Host to send us data in. */ while ((buf = virtqueue_detach_unused_buf(port->in_vq))) - free_buf(buf); + free_buf(buf, true); + + /* + * Remove buffers from out queue for rproc-serial. We cannot afford + * to leak any DMA mem, so reclaim this memory even if this might be + * racy for the remote processor. + */ + if (is_rproc_serial(port->portdev->vdev)) + while ((buf = virtqueue_detach_unused_buf(port->out_vq))) + free_buf(buf, true); }This seems wrong; either this is needed even if !is_rproc_serial(), or it's not necessary as the out_vq is empty. Every path I can see has the device reset (in which case the queues should not be active), or we got a VIRTIO_CONSOLE_PORT_REMOVE event (in which case, the same). I think we can have non-blocking writes which could leave buffers in out_vq: Amit?
Those get 'reclaimed' just above this hunk:
static void remove_port_data(struct port *port)
{
struct port_buffer *buf;
/* Remove unused data this port might have received. */
discard_port_data(port);
reclaim_consumed_buffers(port);
/* Remove buffers we queued up for the Host to send us data in. */
while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
free_buf(buf, true);
...
quoted
static void __exit fini(void) { + reclaim_dma_bufs();Hmm, you didn't protect it here anyway... Cheers, Rusty.
Amit