-/*
+/* \r
* Ringbuffer Routines for VM\r
- * (c) Lei Xia, 2010
+ * (c) Lei Xia, 2010\r
*/\r
-#include <linux/errno.h>
-#include <linux/percpu.h>
+#include <linux/errno.h>\r
+#include <linux/percpu.h>\r
#include <linux/sched.h>\r
\r
#include "palacios.h"\r
-#include "palacios-ringbuffer.h"\r
-
+#include "util-ringbuffer.h"\r
+\r
void init_ringbuf(struct ringbuf * ring, unsigned int size) {\r
ring->buf = kmalloc(size, GFP_KERNEL);\r
- ring->size = size;
-
- ring->start = 0;
- ring->end = 0;
- ring->current_len = 0;
-}
+ ring->size = size;\r
+ \r
+ ring->start = 0;\r
+ ring->end = 0;\r
+ ring->current_len = 0;\r
+}\r
\r
struct ringbuf * create_ringbuf(unsigned int size) {\r
struct ringbuf * ring = (struct ringbuf *)kmalloc(sizeof(struct ringbuf), GFP_KERNEL);\r
init_ringbuf(ring, size);\r
-
- return ring;
-}
+\r
+ return ring;\r
+}\r
\r
void free_ringbuf(struct ringbuf * ring) {\r
kfree(ring->buf);\r
\r
static inline unsigned char * get_read_ptr(struct ringbuf * ring) {\r
return (unsigned char *)(ring->buf + ring->start);\r
-}
-
+}\r
+\r
\r
static inline unsigned char * get_write_ptr(struct ringbuf * ring) {\r
return (unsigned char *)(ring->buf + ring->end);\r
}\r
\r
static inline int get_read_section_size(struct ringbuf * ring) {\r
- return ring->size - ring->start;
-}
-
+ return ring->size - ring->start;\r
+}\r
+\r
\r
static inline int get_write_section_size(struct ringbuf * ring) {\r
- return ring->size - ring->end;
-}
-
+ return ring->size - ring->end;\r
+}\r
+\r
\r
static inline int is_read_loop(struct ringbuf * ring, unsigned int len) {\r
- if ((ring->start >= ring->end) && (ring->current_len > 0)) {
- // end is past the end of the buffer
- if (get_read_section_size(ring) < len) {
- return 1;
- }
- }
- return 0;
-}
-
+ if ((ring->start >= ring->end) && (ring->current_len > 0)) {\r
+ // end is past the end of the buffer\r
+ if (get_read_section_size(ring) < len) {\r
+ return 1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
\r
static inline int is_write_loop(struct ringbuf * ring, unsigned int len) {\r
- if ((ring->end >= ring->start) && (ring->current_len < ring->size)) {
- // end is past the end of the buffer
- if (get_write_section_size(ring) < len) {
- return 1;
- }
- }
- return 0;
-}
-
+ if ((ring->end >= ring->start) && (ring->current_len < ring->size)) {\r
+ // end is past the end of the buffer\r
+ if (get_write_section_size(ring) < len) {\r
+ return 1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
\r
static inline int ringbuf_avail_space(struct ringbuf * ring) {\r
- return ring->size - ring->current_len;
-}
-
+ return ring->size - ring->current_len;\r
+}\r
+\r
\r
int ringbuf_data_len(struct ringbuf * ring) {\r
- return ring->current_len;
-}
-
+ return ring->current_len;\r
+}\r
+\r
\r
static inline int ringbuf_capacity(struct ringbuf * ring) {\r
- return ring->size;
-}
-
+ return ring->size;\r
+}\r
+\r
\r
int ringbuf_read(struct ringbuf * ring, unsigned char * dst, unsigned int len) {\r
- int read_len = 0;
- int ring_data_len = ring->current_len;
-
- read_len = (len > ring_data_len) ? ring_data_len : len;
-
- if (is_read_loop(ring, read_len)) {
- int section_len = get_read_section_size(ring);
-
- memcpy(dst, get_read_ptr(ring), section_len);
- memcpy(dst + section_len, ring->buf, read_len - section_len);
-
- ring->start = read_len - section_len;
- } else {
- memcpy(dst, get_read_ptr(ring), read_len);
-
- ring->start += read_len;
- }
-
- ring->current_len -= read_len;
-
- return read_len;
-}
-
+ int read_len = 0;\r
+ int ring_data_len = ring->current_len;\r
+\r
+ read_len = (len > ring_data_len) ? ring_data_len : len;\r
+\r
+ if (is_read_loop(ring, read_len)) {\r
+ int section_len = get_read_section_size(ring);\r
+\r
+ memcpy(dst, get_read_ptr(ring), section_len);\r
+ memcpy(dst + section_len, ring->buf, read_len - section_len);\r
+ \r
+ ring->start = read_len - section_len;\r
+ } else {\r
+ memcpy(dst, get_read_ptr(ring), read_len);\r
+ \r
+ ring->start += read_len;\r
+ }\r
+\r
+ ring->current_len -= read_len;\r
+\r
+ return read_len;\r
+}\r
+\r
\r
#if 0\r
\r
static int ringbuf_peek(struct ringbuf * ring, unsigned char * dst, unsigned int len) {\r
- int read_len = 0;
- int ring_data_len = ring->current_len;
-
- read_len = (len > ring_data_len) ? ring_data_len : len;
-
- if (is_read_loop(ring, read_len)) {
- int section_len = get_read_section_size(ring);
-
- memcpy(dst, get_read_ptr(ring), section_len);
- memcpy(dst + section_len, ring->buf, read_len - section_len);
- } else {
- memcpy(dst, get_read_ptr(ring), read_len);
- }
-
- return read_len;
-}
-
+ int read_len = 0;\r
+ int ring_data_len = ring->current_len;\r
+\r
+ read_len = (len > ring_data_len) ? ring_data_len : len;\r
+\r
+ if (is_read_loop(ring, read_len)) {\r
+ int section_len = get_read_section_size(ring);\r
+\r
+ memcpy(dst, get_read_ptr(ring), section_len);\r
+ memcpy(dst + section_len, ring->buf, read_len - section_len);\r
+ } else {\r
+ memcpy(dst, get_read_ptr(ring), read_len);\r
+ }\r
+\r
+ return read_len;\r
+}\r
+\r
\r
static int ringbuf_delete(struct ringbuf * ring, unsigned int len) {\r
- int del_len = 0;
- int ring_data_len = ring->current_len;
-
- del_len = (len > ring_data_len) ? ring_data_len : len;
-
- if (is_read_loop(ring, del_len)) {
- int section_len = get_read_section_size(ring);
- ring->start = del_len - section_len;
- } else {
- ring->start += del_len;
- }
-
- ring->current_len -= del_len;
- return del_len;
-}
+ int del_len = 0;\r
+ int ring_data_len = ring->current_len;\r
+\r
+ del_len = (len > ring_data_len) ? ring_data_len : len;\r
+\r
+ if (is_read_loop(ring, del_len)) {\r
+ int section_len = get_read_section_size(ring);\r
+ ring->start = del_len - section_len;\r
+ } else {\r
+ ring->start += del_len;\r
+ }\r
+\r
+ ring->current_len -= del_len;\r
+ return del_len;\r
+}\r
#endif\r
\r
int ringbuf_write(struct ringbuf * ring, unsigned char * src, unsigned int len) {\r
- int write_len = 0;
- int ring_avail_space = ring->size - ring->current_len;
-
+ int write_len = 0;\r
+ int ring_avail_space = ring->size - ring->current_len;\r
+ \r
write_len = (len > ring_avail_space) ? ring_avail_space : len;\r
-
- if (is_write_loop(ring, write_len)) {
- int section_len = get_write_section_size(ring);
+\r
+ if (is_write_loop(ring, write_len)) {\r
+ int section_len = get_write_section_size(ring);\r
\r
- memcpy(get_write_ptr(ring), src, section_len);
- ring->end = 0;
-
- memcpy(get_write_ptr(ring), src + section_len, write_len - section_len);
-
- ring->end += write_len - section_len;
+ memcpy(get_write_ptr(ring), src, section_len);\r
+ ring->end = 0;\r
+\r
+ memcpy(get_write_ptr(ring), src + section_len, write_len - section_len);\r
+\r
+ ring->end += write_len - section_len;\r
} else {\r
- memcpy(get_write_ptr(ring), src, write_len);
-
- ring->end += write_len;
- }
-
- ring->current_len += write_len;
-
- return write_len;
-}
+ memcpy(get_write_ptr(ring), src, write_len);\r
+\r
+ ring->end += write_len;\r
+ }\r
+\r
+ ring->current_len += write_len;\r
+\r
+ return write_len;\r
+}\r
\r