Thread (1 message) 1 message, 1 author, 2012-11-01

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help