[RFC PATCH 5/10] relay - Map the first sub-buffer at the end of the buffer, for temporary convenience.

Previous thread: [RFC PATCH 4/10] relay - Add reserved param to switch-subbuf, in preparation for non-pad write/reserve. by Tom Zanussi on Friday, September 26, 2008 - 11:18 pm. (1 message)

Next thread: [RFC PATCH 6/10] relay - Replace relay_reserve/relay_write with non-padded versions. by Tom Zanussi on Friday, September 26, 2008 - 11:18 pm. (1 message)
From: Tom Zanussi
Date: Friday, September 26, 2008 - 11:18 pm

Map the first sub-buffer at the end of the buffer, for temporary convenience.

Make relay buffers 'circular' for writing by mapping the first subbuf
at end of last subbuf.  This is so we can do writes across last subbuf
boundary without adding special write logic.  This is a temporary
state of affairs and it all goes away in a future patch, but it's here
now so things will still work.
---
 kernel/relay.c |   26 +++++++++++++++-----------
 1 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/kernel/relay.c b/kernel/relay.c
index 6c7698a..e9dd976 100644
--- a/kernel/relay.c
+++ b/kernel/relay.c
@@ -125,20 +125,20 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
 /**
  *	relay_alloc_buf - allocate a channel buffer
  *	@buf: the buffer struct
- *	@size: total size of the buffer
  *
  *	Returns a pointer to the resulting buffer, %NULL if unsuccessful. The
  *	passed in size will get page aligned, if it isn't already.
  */
-static void *relay_alloc_buf(struct rchan_buf *buf, size_t *size)
+static void *relay_alloc_buf(struct rchan_buf *buf)
 {
 	void *mem;
-	unsigned int i, j, n_pages;
+	unsigned int i, j, n_pages, n_subbuf_pages;
 
-	*size = PAGE_ALIGN(*size);
-	n_pages = *size >> PAGE_SHIFT;
+	buf->chan->alloc_size = PAGE_ALIGN(buf->chan->alloc_size);
+	n_pages = buf->chan->alloc_size >> PAGE_SHIFT;
+	n_subbuf_pages = PAGE_ALIGN(buf->chan->subbuf_size) >> PAGE_SHIFT;
 
-	buf->page_array = relay_alloc_page_array(n_pages);
+	buf->page_array = relay_alloc_page_array(n_pages + n_subbuf_pages);
 	if (!buf->page_array)
 		return NULL;
 
@@ -148,11 +148,14 @@ static void *relay_alloc_buf(struct rchan_buf *buf, size_t *size)
 			goto depopulate;
 		set_page_private(buf->page_array[i], (unsigned long)buf);
 	}
-	mem = vmap(buf->page_array, n_pages, VM_MAP, PAGE_KERNEL);
+	for (i = 0; i < n_subbuf_pages; i++)
+		buf->page_array[n_pages + i] = buf->page_array[i];
+	mem = vmap(buf->page_array, n_pages + n_subbuf_pages, VM_MAP,
+		   ...
Previous thread: [RFC PATCH 4/10] relay - Add reserved param to switch-subbuf, in preparation for non-pad write/reserve. by Tom Zanussi on Friday, September 26, 2008 - 11:18 pm. (1 message)

Next thread: [RFC PATCH 6/10] relay - Replace relay_reserve/relay_write with non-padded versions. by Tom Zanussi on Friday, September 26, 2008 - 11:18 pm. (1 message)