fd-io-styleify for svm
Change-Id: I816de8b1f255dc3bc6d2904566ea0b0f68fac5d8 Signed-off-by: Dave Barach <dave@barachs.net>
This commit is contained in:
@ -1,15 +1,5 @@
|
||||
#!/usr/bin/emacs --script
|
||||
|
||||
(fset 'fix-foreach
|
||||
[?\C-u ?\C-s ?_ ?f ?o ?r ?e ?a ?c ?h ? ?* ?\( ?\C-a ?\C-o tab ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?F ?F ?* ? ?* ?/ ?\C-u ?\C-s ?\C-s ?\C-b escape ?\C-f ?\C-e ?\C-j ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?N ?* ? ?* ?/])
|
||||
(fset 'fix-cli-command
|
||||
[?\C-s ?C ?L ?I ?_ ?C ?O ?M ?M ?A ?N ?D ?\C-a ?\C-o ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?F ?F ?* ? ?* ?/ ?\C-s ?\} ?\C-e ?\C-j ?/ ?* ? ?I ?N ?D ?E ?N backspace backspace backspace backspace backspace ?* ?I ?N ?D ?E ?N ?T ?- ?O ?N ?* ? ?* ?/])
|
||||
(fset 'fix-node
|
||||
[?\C-s ?R ?E ?G ?I ?S ?T ?E ?R ?_ ?N ?O ?D ?E ?\C-a ?\C-o ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?F ?F ?* ? ?* ?/ ?\C-a ?\C-n ?\C-s ?\{ ?\C-b escape ?\C-f ?\C-e ?\C-j ?/ ?* ?\S- ?* ?I ?N ?D ?E ?N ?T ?- ?O ?N ?* ? ?* ?/])
|
||||
|
||||
(fset 'fix-elog-type
|
||||
[?\C-s ?E ?L ?O ?G ?_ ?T ?Y ?P ?E ?_ ?D ?E ?C ?L ?A ?R ?E ?\C-a ?\C-o tab ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?F ?F ?* ? ?* ?/ ?\C-a ?\C-n ?\C-n tab escape ?\C-f ?\C-e ?\C-j tab ?/ ?* ? ?* ?I ?N ?D ?E ?N ?T ?- ?O ?N ?* ? ?* ?/ ?\C-a ?\C-n])
|
||||
|
||||
;; insert style boilerplate
|
||||
(defun insert-style-boilerplate () (interactive)
|
||||
(save-excursion (goto-char (point-max))
|
||||
@ -22,24 +12,64 @@
|
||||
* End:
|
||||
*/")))
|
||||
|
||||
;;
|
||||
(defun fix-foreach () (interactive)
|
||||
(save-excursion (goto-char (point-min))
|
||||
(while (search-forward-regexp
|
||||
"[pool|hash|clib_fifo|clib_bitmap]_foreach"
|
||||
(point-max) t)
|
||||
(move-beginning-of-line nil)
|
||||
(open-line 1)
|
||||
(c-indent-line-or-region)
|
||||
(insert "/* *INDENT-OFF* */")
|
||||
(search-forward "{")
|
||||
(backward-char)
|
||||
(forward-sexp)
|
||||
(move-end-of-line nil)
|
||||
(newline 1)
|
||||
(c-indent-line-or-region)
|
||||
(insert "/* *INDENT-ON* */"))))
|
||||
|
||||
(defun fix-initializer (what) (interactive)
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (search-forward-regexp what (point-max) t)
|
||||
(move-beginning-of-line nil)
|
||||
(open-line 1)
|
||||
(c-indent-line-or-region)
|
||||
(insert "/* *INDENT-OFF* */")
|
||||
(search-forward "{")
|
||||
(backward-char)
|
||||
(forward-sexp)
|
||||
(move-end-of-line nil)
|
||||
(newline 1)
|
||||
(c-indent-line-or-region)
|
||||
(insert "/* *INDENT-ON* */"))))
|
||||
|
||||
(defun fix-vlib-register-thread () (interactive)
|
||||
(fix-initializer "VLIB_REGISTER_THREAD *("))
|
||||
|
||||
(defun fix-vlib-cli-command () (interactive)
|
||||
(fix-initializer "VLIB_CLI_COMMAND *("))
|
||||
|
||||
(defun fix-vlib-register-node () (interactive)
|
||||
(fix-initializer "VLIB_REGISTER_NODE *("))
|
||||
|
||||
|
||||
;; Driver routine which runs the set of keyboard macros
|
||||
;; defined above, as well as the bottom boilerplate lisp fn.
|
||||
|
||||
(defun fd-io-styleify () (interactive)
|
||||
(save-excursion (goto-char (point-min))
|
||||
(ignore-errors (execute-kbd-macro 'fix-foreach 0)))
|
||||
(save-excursion (goto-char (point-min))
|
||||
(ignore-errors (execute-kbd-macro 'fix-cli-command 0)))
|
||||
(save-excursion (goto-char (point-min))
|
||||
(ignore-errors (execute-kbd-macro 'fix-node 0)))
|
||||
(save-excursion (goto-char (point-min))
|
||||
(ignore-errors (execute-kbd-macro 'fix-elog-type 0)))
|
||||
(fix-foreach)
|
||||
(fix-vlib-register-thread)
|
||||
(fix-vlib-cli-command)
|
||||
(fix-vlib-register-node)
|
||||
(insert-style-boilerplate))
|
||||
|
||||
;;(setq index 0)
|
||||
;;(while (elt argv index)
|
||||
;; (message "Processing argv %d is %s" index (elt argv index))
|
||||
;; (find-file (elt argv index))
|
||||
;; (fd-io-styleify)
|
||||
;; (setq index (1+ index)))
|
||||
;; (save-buffers-kill-emacs)
|
||||
(setq index 0)
|
||||
(while (elt argv index)
|
||||
(message "Processing %s..." (elt argv index))
|
||||
(find-file (elt argv index))
|
||||
(fd-io-styleify)
|
||||
(setq index (1+ index)))
|
||||
(save-buffers-kill-emacs t)
|
||||
|
100
svm/persist.c
100
svm/persist.c
@ -42,31 +42,35 @@
|
||||
#include <vppinfra/serialize.h>
|
||||
#include <svmdb.h>
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
svmdb_client_t *c;
|
||||
} persist_main_t;
|
||||
|
||||
persist_main_t persist_main;
|
||||
|
||||
typedef struct {
|
||||
u8 * string1;
|
||||
u8 * string2;
|
||||
typedef struct
|
||||
{
|
||||
u8 *string1;
|
||||
u8 *string2;
|
||||
} demo_struct2_t;
|
||||
|
||||
typedef struct {
|
||||
demo_struct2_t * demo2;
|
||||
u8 * name;
|
||||
typedef struct
|
||||
{
|
||||
demo_struct2_t *demo2;
|
||||
u8 *name;
|
||||
} demo_struct1_t;
|
||||
|
||||
/*
|
||||
* Data structures in persistent shared memory, all the time
|
||||
*/
|
||||
clib_error_t * persist_malloc (persist_main_t * pm)
|
||||
clib_error_t *
|
||||
persist_malloc (persist_main_t * pm)
|
||||
{
|
||||
demo_struct2_t *demo2;
|
||||
demo_struct1_t *demo1;
|
||||
time_t starttime = time(0);
|
||||
char *datestring = ctime(&starttime);
|
||||
time_t starttime = time (0);
|
||||
char *datestring = ctime (&starttime);
|
||||
void *oldheap;
|
||||
|
||||
/* Get back the root pointer */
|
||||
@ -74,9 +78,10 @@ clib_error_t * persist_malloc (persist_main_t * pm)
|
||||
(pm->c, SVMDB_NAMESPACE_VEC, "demo1_location");
|
||||
|
||||
/* It doesnt exist create our data structures */
|
||||
if (demo1 == 0) {
|
||||
if (demo1 == 0)
|
||||
{
|
||||
/* If you want MP / thread safety, lock the region... */
|
||||
pthread_mutex_lock(&pm->c->db_rp->mutex);
|
||||
pthread_mutex_lock (&pm->c->db_rp->mutex);
|
||||
|
||||
/* Switch to the shared memory region heap */
|
||||
oldheap = svm_push_data_heap (pm->c->db_rp);
|
||||
@ -93,8 +98,8 @@ clib_error_t * persist_malloc (persist_main_t * pm)
|
||||
demo2->string2 = format (0, "Born at %s%c", datestring, 0);
|
||||
|
||||
/* Back to the process-private heap */
|
||||
svm_pop_heap(oldheap);
|
||||
pthread_mutex_unlock(&pm->c->db_rp->mutex);
|
||||
svm_pop_heap (oldheap);
|
||||
pthread_mutex_unlock (&pm->c->db_rp->mutex);
|
||||
|
||||
/*
|
||||
* Set the root pointer. Note: this guy switches heaps, locks, etc.
|
||||
@ -104,7 +109,8 @@ clib_error_t * persist_malloc (persist_main_t * pm)
|
||||
demo1, sizeof (demo1));
|
||||
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
/* retrieve and print data from shared memory */
|
||||
demo2 = demo1->demo2;
|
||||
fformat (stdout, "name: %s\n", demo1->name);
|
||||
@ -115,11 +121,12 @@ clib_error_t * persist_malloc (persist_main_t * pm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void unserialize_demo1 (serialize_main_t *sm, va_list * args)
|
||||
void
|
||||
unserialize_demo1 (serialize_main_t * sm, va_list * args)
|
||||
{
|
||||
demo_struct1_t ** result = va_arg (*args, demo_struct1_t **);
|
||||
demo_struct1_t * demo1;
|
||||
demo_struct2_t * demo2;
|
||||
demo_struct1_t **result = va_arg (*args, demo_struct1_t **);
|
||||
demo_struct1_t *demo1;
|
||||
demo_struct2_t *demo2;
|
||||
|
||||
/* Allocate data structures in process private memory */
|
||||
demo1 = clib_mem_alloc (sizeof (*demo1));
|
||||
@ -133,34 +140,36 @@ void unserialize_demo1 (serialize_main_t *sm, va_list * args)
|
||||
*result = demo1;
|
||||
}
|
||||
|
||||
void serialize_demo1 (serialize_main_t *sm, va_list * args)
|
||||
void
|
||||
serialize_demo1 (serialize_main_t * sm, va_list * args)
|
||||
{
|
||||
demo_struct1_t * demo1 = va_arg (*args, demo_struct1_t *);
|
||||
demo_struct2_t * demo2 = demo1->demo2;
|
||||
demo_struct1_t *demo1 = va_arg (*args, demo_struct1_t *);
|
||||
demo_struct2_t *demo2 = demo1->demo2;
|
||||
|
||||
serialize_cstring (sm, (char *)demo1->name);
|
||||
serialize_cstring (sm, (char *)demo2->string1);
|
||||
serialize_cstring (sm, (char *)demo2->string2);
|
||||
serialize_cstring (sm, (char *) demo1->name);
|
||||
serialize_cstring (sm, (char *) demo2->string1);
|
||||
serialize_cstring (sm, (char *) demo2->string2);
|
||||
}
|
||||
|
||||
/* Serialize / unserialize variant */
|
||||
clib_error_t *
|
||||
persist_serialize (persist_main_t * pm)
|
||||
{
|
||||
u8 * checkpoint;
|
||||
u8 *checkpoint;
|
||||
serialize_main_t sm;
|
||||
|
||||
demo_struct2_t *demo2;
|
||||
demo_struct1_t *demo1;
|
||||
time_t starttime = time(0);
|
||||
char *datestring = ctime(&starttime);
|
||||
time_t starttime = time (0);
|
||||
char *datestring = ctime (&starttime);
|
||||
|
||||
/* Get back the root pointer */
|
||||
checkpoint = svmdb_local_get_vec_variable (pm->c, "demo1_checkpoint",
|
||||
sizeof (u8));
|
||||
|
||||
/* It doesnt exist create our data structures */
|
||||
if (checkpoint == 0) {
|
||||
if (checkpoint == 0)
|
||||
{
|
||||
/* Allocate data structures in process-private memory */
|
||||
demo1 = clib_mem_alloc (sizeof (*demo2));
|
||||
vec_validate (demo1, 0);
|
||||
@ -182,7 +191,8 @@ persist_serialize (persist_main_t * pm)
|
||||
/* Toss the process-private-memory original.. */
|
||||
vec_free (checkpoint);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
/* Open the checkpoint */
|
||||
unserialize_open_data (&sm, checkpoint, vec_len (checkpoint));
|
||||
unserialize (&sm, unserialize_demo1, &demo1);
|
||||
@ -201,25 +211,28 @@ persist_serialize (persist_main_t * pm)
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char **argv)
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
unformat_input_t _input, *input=&_input;
|
||||
persist_main_t * pm = &persist_main;
|
||||
clib_error_t * error = 0;
|
||||
unformat_input_t _input, *input = &_input;
|
||||
persist_main_t *pm = &persist_main;
|
||||
clib_error_t *error = 0;
|
||||
|
||||
/* Make a 4mb database arena, chroot so it's truly private */
|
||||
pm->c = svmdb_map_chroot_size ("/ptest", 4<<20);
|
||||
pm->c = svmdb_map_chroot_size ("/ptest", 4 << 20);
|
||||
|
||||
ASSERT(pm->c);
|
||||
ASSERT (pm->c);
|
||||
|
||||
unformat_init_command_line (input, argv);
|
||||
|
||||
while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) {
|
||||
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (input, "malloc"))
|
||||
error = persist_malloc (pm);
|
||||
else if (unformat (input, "serialize"))
|
||||
error = persist_serialize (pm);
|
||||
else {
|
||||
else
|
||||
{
|
||||
error = clib_error_return (0, "Unknown flavor '%U'",
|
||||
format_unformat_error, input);
|
||||
break;
|
||||
@ -228,9 +241,18 @@ int main (int argc, char **argv)
|
||||
|
||||
svmdb_unmap (pm->c);
|
||||
|
||||
if (error) {
|
||||
if (error)
|
||||
{
|
||||
clib_error_report (error);
|
||||
exit (1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
65
svm/ssvm.c
65
svm/ssvm.c
@ -14,16 +14,17 @@
|
||||
*/
|
||||
#include "ssvm.h"
|
||||
|
||||
int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
int
|
||||
ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
{
|
||||
int ssvm_fd;
|
||||
u8 * ssvm_filename;
|
||||
u8 *ssvm_filename;
|
||||
u8 junk = 0;
|
||||
int flags;
|
||||
ssvm_shared_header_t * sh;
|
||||
u64 ticks = clib_cpu_time_now();
|
||||
ssvm_shared_header_t *sh;
|
||||
u64 ticks = clib_cpu_time_now ();
|
||||
u64 randomize_baseva;
|
||||
void * oldheap;
|
||||
void *oldheap;
|
||||
|
||||
if (ssvm->ssvm_size == 0)
|
||||
return SSVM_API_ERROR_NO_SIZE;
|
||||
@ -32,9 +33,9 @@ int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
|
||||
unlink ((char *) ssvm_filename);
|
||||
|
||||
vec_free(ssvm_filename);
|
||||
vec_free (ssvm_filename);
|
||||
|
||||
ssvm_fd = shm_open((char *) ssvm->name, O_RDWR | O_CREAT | O_EXCL, 0777);
|
||||
ssvm_fd = shm_open ((char *) ssvm->name, O_RDWR | O_CREAT | O_EXCL, 0777);
|
||||
|
||||
if (ssvm_fd < 0)
|
||||
{
|
||||
@ -42,11 +43,11 @@ int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
return SSVM_API_ERROR_CREATE_FAILURE;
|
||||
}
|
||||
|
||||
lseek(ssvm_fd, ssvm->ssvm_size, SEEK_SET);
|
||||
if (write(ssvm_fd, &junk, 1) != 1)
|
||||
lseek (ssvm_fd, ssvm->ssvm_size, SEEK_SET);
|
||||
if (write (ssvm_fd, &junk, 1) != 1)
|
||||
{
|
||||
clib_unix_warning ("set ssvm size");
|
||||
close(ssvm_fd);
|
||||
close (ssvm_fd);
|
||||
return SSVM_API_ERROR_SET_SIZE;
|
||||
}
|
||||
|
||||
@ -59,26 +60,28 @@ int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
if (ssvm->requested_va)
|
||||
ssvm->requested_va += randomize_baseva;
|
||||
|
||||
sh = ssvm->sh = (ssvm_shared_header_t *) mmap((void *)ssvm->requested_va, ssvm->ssvm_size,
|
||||
PROT_READ | PROT_WRITE, flags, ssvm_fd, 0);
|
||||
sh = ssvm->sh =
|
||||
(ssvm_shared_header_t *) mmap ((void *) ssvm->requested_va,
|
||||
ssvm->ssvm_size, PROT_READ | PROT_WRITE,
|
||||
flags, ssvm_fd, 0);
|
||||
|
||||
if (ssvm->sh == MAP_FAILED)
|
||||
{
|
||||
clib_unix_warning ("mmap");
|
||||
close(ssvm_fd);
|
||||
close (ssvm_fd);
|
||||
return SSVM_API_ERROR_MMAP;
|
||||
}
|
||||
|
||||
close(ssvm_fd);
|
||||
close (ssvm_fd);
|
||||
|
||||
ssvm->my_pid = getpid();
|
||||
ssvm->my_pid = getpid ();
|
||||
sh->master_pid = ssvm->my_pid;
|
||||
sh->ssvm_size = ssvm->ssvm_size;
|
||||
sh->heap = mheap_alloc_with_flags
|
||||
(((u8 *)sh) + MMAP_PAGESIZE, ssvm->ssvm_size - MMAP_PAGESIZE,
|
||||
(((u8 *) sh) + MMAP_PAGESIZE, ssvm->ssvm_size - MMAP_PAGESIZE,
|
||||
MHEAP_FLAG_DISABLE_VM | MHEAP_FLAG_THREAD_SAFE);
|
||||
|
||||
sh->ssvm_va = pointer_to_uword(sh);
|
||||
sh->ssvm_va = pointer_to_uword (sh);
|
||||
sh->master_index = master_index;
|
||||
|
||||
oldheap = ssvm_push_heap (sh);
|
||||
@ -91,24 +94,25 @@ int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds)
|
||||
int
|
||||
ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds)
|
||||
{
|
||||
struct stat stat;
|
||||
int ssvm_fd = -1;
|
||||
ssvm_shared_header_t * sh;
|
||||
ssvm_shared_header_t *sh;
|
||||
|
||||
ssvm->i_am_master = 0;
|
||||
|
||||
while (timeout_in_seconds-- > 0)
|
||||
{
|
||||
if (ssvm_fd < 0)
|
||||
ssvm_fd = shm_open((char *)ssvm->name, O_RDWR, 0777);
|
||||
ssvm_fd = shm_open ((char *) ssvm->name, O_RDWR, 0777);
|
||||
if (ssvm_fd < 0)
|
||||
{
|
||||
sleep (1);
|
||||
continue;
|
||||
}
|
||||
if (fstat(ssvm_fd, &stat) < 0)
|
||||
if (fstat (ssvm_fd, &stat) < 0)
|
||||
{
|
||||
sleep (1);
|
||||
continue;
|
||||
@ -120,7 +124,7 @@ int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds)
|
||||
clib_warning ("slave timeout");
|
||||
return SSVM_API_ERROR_SLAVE_TIMEOUT;
|
||||
|
||||
map_it:
|
||||
map_it:
|
||||
sh = (void *) mmap (0, MMAP_PAGESIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
ssvm_fd, 0);
|
||||
if (sh == MAP_FAILED)
|
||||
@ -140,15 +144,14 @@ int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds)
|
||||
clib_warning ("slave timeout 2");
|
||||
return SSVM_API_ERROR_SLAVE_TIMEOUT;
|
||||
|
||||
re_map_it:
|
||||
re_map_it:
|
||||
ssvm->requested_va = (u64) sh->ssvm_va;
|
||||
ssvm->ssvm_size = sh->ssvm_size;
|
||||
munmap (sh, MMAP_PAGESIZE);
|
||||
|
||||
sh = ssvm->sh = (void *) mmap((void *)ssvm->requested_va, ssvm->ssvm_size,
|
||||
sh = ssvm->sh = (void *) mmap ((void *) ssvm->requested_va, ssvm->ssvm_size,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED | MAP_FIXED,
|
||||
ssvm_fd, 0);
|
||||
MAP_SHARED | MAP_FIXED, ssvm_fd, 0);
|
||||
|
||||
if (sh == MAP_FAILED)
|
||||
{
|
||||
@ -156,6 +159,14 @@ int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds)
|
||||
close (ssvm_fd);
|
||||
return SSVM_API_ERROR_MMAP;
|
||||
}
|
||||
sh->slave_pid = getpid();
|
||||
sh->slave_pid = getpid ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
47
svm/ssvm.h
47
svm/ssvm.h
@ -41,7 +41,8 @@
|
||||
#define MMAP_PAGESIZE (4<<10)
|
||||
#define SSVM_N_OPAQUE 7
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
/* Spin-lock */
|
||||
volatile u32 lock;
|
||||
volatile u32 owner_pid;
|
||||
@ -49,7 +50,7 @@ typedef struct {
|
||||
u32 tag; /* for debugging */
|
||||
|
||||
/* The allocation arena */
|
||||
void * heap;
|
||||
void *heap;
|
||||
|
||||
/* Segment must be mapped at this address, or no supper */
|
||||
u64 ssvm_va;
|
||||
@ -57,8 +58,8 @@ typedef struct {
|
||||
u64 ssvm_size;
|
||||
u32 master_pid;
|
||||
u32 slave_pid;
|
||||
u8 * name;
|
||||
void * opaque [SSVM_N_OPAQUE];
|
||||
u8 *name;
|
||||
void *opaque[SSVM_N_OPAQUE];
|
||||
|
||||
/* Set when the master application thinks it's time to make the donuts */
|
||||
volatile u32 ready;
|
||||
@ -67,19 +68,21 @@ typedef struct {
|
||||
u32 master_index;
|
||||
} ssvm_shared_header_t;
|
||||
|
||||
typedef struct {
|
||||
ssvm_shared_header_t * sh;
|
||||
typedef struct
|
||||
{
|
||||
ssvm_shared_header_t *sh;
|
||||
u64 ssvm_size;
|
||||
u32 my_pid;
|
||||
u32 vlib_hw_if_index;
|
||||
u8 * name;
|
||||
u8 *name;
|
||||
uword requested_va;
|
||||
int i_am_master;
|
||||
u32 per_interface_next_index;
|
||||
u32 * rx_queue;
|
||||
u32 *rx_queue;
|
||||
} ssvm_private_t;
|
||||
|
||||
always_inline void ssvm_lock (ssvm_shared_header_t * h, u32 my_pid, u32 tag)
|
||||
always_inline void
|
||||
ssvm_lock (ssvm_shared_header_t * h, u32 my_pid, u32 tag)
|
||||
{
|
||||
if (h->owner_pid == my_pid)
|
||||
{
|
||||
@ -95,27 +98,30 @@ always_inline void ssvm_lock (ssvm_shared_header_t * h, u32 my_pid, u32 tag)
|
||||
h->tag = tag;
|
||||
}
|
||||
|
||||
always_inline void ssvm_unlock (ssvm_shared_header_t * h)
|
||||
always_inline void
|
||||
ssvm_unlock (ssvm_shared_header_t * h)
|
||||
{
|
||||
if (--h->recursion_count == 0)
|
||||
{
|
||||
h->owner_pid = 0;
|
||||
h->tag = 0;
|
||||
CLIB_MEMORY_BARRIER();
|
||||
CLIB_MEMORY_BARRIER ();
|
||||
h->lock = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *ssvm_push_heap (ssvm_shared_header_t *sh)
|
||||
static inline void *
|
||||
ssvm_push_heap (ssvm_shared_header_t * sh)
|
||||
{
|
||||
u8 *oldheap;
|
||||
oldheap = clib_mem_set_heap(sh->heap);
|
||||
oldheap = clib_mem_set_heap (sh->heap);
|
||||
return ((void *) oldheap);
|
||||
}
|
||||
|
||||
static inline void ssvm_pop_heap (void *oldheap)
|
||||
static inline void
|
||||
ssvm_pop_heap (void *oldheap)
|
||||
{
|
||||
clib_mem_set_heap(oldheap);
|
||||
clib_mem_set_heap (oldheap);
|
||||
}
|
||||
|
||||
#define foreach_ssvm_api_error \
|
||||
@ -126,7 +132,8 @@ _(SET_SIZE, "Set size failed", -13) \
|
||||
_(MMAP, "mmap failed", -14) \
|
||||
_(SLAVE_TIMEOUT, "Slave map timeout", -15)
|
||||
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
#define _(n,s,c) SSVM_API_ERROR_##n = c,
|
||||
foreach_ssvm_api_error
|
||||
#undef _
|
||||
@ -138,3 +145,11 @@ int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index);
|
||||
int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds);
|
||||
|
||||
#endif /* __included_ssvm_h__ */
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
94
svm/svm.h
94
svm/svm.h
@ -36,7 +36,8 @@
|
||||
|
||||
#define SVM_PVT_MHEAP_SIZE (128<<10) /* region's private mheap (128k) */
|
||||
|
||||
typedef struct svm_region_ {
|
||||
typedef struct svm_region_
|
||||
{
|
||||
volatile uword version;
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t condvar;
|
||||
@ -66,7 +67,8 @@ typedef struct svm_region_ {
|
||||
|
||||
} svm_region_t;
|
||||
|
||||
typedef struct svm_map_region_args_ {
|
||||
typedef struct svm_map_region_args_
|
||||
{
|
||||
char *root_path; /* NULL means use the truly global arena */
|
||||
char *name;
|
||||
uword baseva;
|
||||
@ -97,92 +99,106 @@ typedef struct svm_map_region_args_ {
|
||||
#define SVM_OVERLAY_REGION_SIZE (1<<20)
|
||||
#define SVM_OVERLAY_REGION_BASENAME "/overlay_vm"
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
u8 *subregion_name;
|
||||
} svm_subregion_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
svm_subregion_t *subregions; /* subregion pool */
|
||||
uword *name_hash;
|
||||
u8 *root_path;
|
||||
} svm_main_region_t;
|
||||
|
||||
|
||||
void *svm_region_find_or_create (svm_map_region_args_t *a);
|
||||
void svm_region_init(void);
|
||||
void svm_region_init_chroot(char *root_path);
|
||||
void svm_region_init_chroot_uid_gid(char *root_path, int uid, int gid);
|
||||
void *svm_region_find_or_create (svm_map_region_args_t * a);
|
||||
void svm_region_init (void);
|
||||
void svm_region_init_chroot (char *root_path);
|
||||
void svm_region_init_chroot_uid_gid (char *root_path, int uid, int gid);
|
||||
void svm_region_exit (void);
|
||||
void svm_region_unmap(void *rp_arg);
|
||||
void svm_region_unmap (void *rp_arg);
|
||||
void svm_client_scan (char *root_path);
|
||||
void svm_client_scan_this_region_nolock (svm_region_t *rp);
|
||||
u8 *shm_name_from_svm_map_region_args (svm_map_region_args_t *a);
|
||||
void svm_client_scan_this_region_nolock (svm_region_t * rp);
|
||||
u8 *shm_name_from_svm_map_region_args (svm_map_region_args_t * a);
|
||||
|
||||
static inline void *svm_mem_alloc (svm_region_t *rp, uword size)
|
||||
static inline void *
|
||||
svm_mem_alloc (svm_region_t * rp, uword size)
|
||||
{
|
||||
u8 *oldheap;
|
||||
ASSERT(rp->flags & SVM_FLAGS_MHEAP);
|
||||
ASSERT (rp->flags & SVM_FLAGS_MHEAP);
|
||||
u8 *rv;
|
||||
|
||||
pthread_mutex_lock(&rp->mutex);
|
||||
oldheap = clib_mem_set_heap(rp->data_heap);
|
||||
pthread_mutex_lock (&rp->mutex);
|
||||
oldheap = clib_mem_set_heap (rp->data_heap);
|
||||
rv = clib_mem_alloc (size);
|
||||
clib_mem_set_heap(oldheap);
|
||||
pthread_mutex_unlock(&rp->mutex);
|
||||
clib_mem_set_heap (oldheap);
|
||||
pthread_mutex_unlock (&rp->mutex);
|
||||
return (rv);
|
||||
}
|
||||
|
||||
static inline void *svm_mem_alloc_aligned_at_offset (svm_region_t *rp,
|
||||
uword size,
|
||||
uword align,
|
||||
uword offset)
|
||||
static inline void *
|
||||
svm_mem_alloc_aligned_at_offset (svm_region_t * rp,
|
||||
uword size, uword align, uword offset)
|
||||
{
|
||||
u8 *oldheap;
|
||||
ASSERT(rp->flags & SVM_FLAGS_MHEAP);
|
||||
ASSERT (rp->flags & SVM_FLAGS_MHEAP);
|
||||
u8 *rv;
|
||||
|
||||
pthread_mutex_lock(&rp->mutex);
|
||||
oldheap = clib_mem_set_heap(rp->data_heap);
|
||||
pthread_mutex_lock (&rp->mutex);
|
||||
oldheap = clib_mem_set_heap (rp->data_heap);
|
||||
rv = clib_mem_alloc_aligned_at_offset (size, align, offset);
|
||||
clib_mem_set_heap(oldheap);
|
||||
pthread_mutex_unlock(&rp->mutex);
|
||||
clib_mem_set_heap (oldheap);
|
||||
pthread_mutex_unlock (&rp->mutex);
|
||||
return (rv);
|
||||
}
|
||||
|
||||
static inline void svm_mem_free (svm_region_t *rp, void *ptr)
|
||||
static inline void
|
||||
svm_mem_free (svm_region_t * rp, void *ptr)
|
||||
{
|
||||
u8 *oldheap;
|
||||
ASSERT(rp->flags & SVM_FLAGS_MHEAP);
|
||||
ASSERT (rp->flags & SVM_FLAGS_MHEAP);
|
||||
|
||||
pthread_mutex_lock(&rp->mutex);
|
||||
oldheap = clib_mem_set_heap(rp->data_heap);
|
||||
pthread_mutex_lock (&rp->mutex);
|
||||
oldheap = clib_mem_set_heap (rp->data_heap);
|
||||
clib_mem_free (ptr);
|
||||
clib_mem_set_heap(oldheap);
|
||||
pthread_mutex_unlock(&rp->mutex);
|
||||
clib_mem_set_heap (oldheap);
|
||||
pthread_mutex_unlock (&rp->mutex);
|
||||
|
||||
}
|
||||
|
||||
static inline void *svm_push_pvt_heap (svm_region_t *rp)
|
||||
static inline void *
|
||||
svm_push_pvt_heap (svm_region_t * rp)
|
||||
{
|
||||
u8 *oldheap;
|
||||
oldheap = clib_mem_set_heap(rp->region_heap);
|
||||
oldheap = clib_mem_set_heap (rp->region_heap);
|
||||
return ((void *) oldheap);
|
||||
}
|
||||
|
||||
static inline void *svm_push_data_heap (svm_region_t *rp)
|
||||
static inline void *
|
||||
svm_push_data_heap (svm_region_t * rp)
|
||||
{
|
||||
u8 *oldheap;
|
||||
oldheap = clib_mem_set_heap(rp->data_heap);
|
||||
oldheap = clib_mem_set_heap (rp->data_heap);
|
||||
return ((void *) oldheap);
|
||||
}
|
||||
|
||||
static inline void svm_pop_heap (void *oldheap)
|
||||
static inline void
|
||||
svm_pop_heap (void *oldheap)
|
||||
{
|
||||
clib_mem_set_heap(oldheap);
|
||||
clib_mem_set_heap (oldheap);
|
||||
}
|
||||
|
||||
u8 * format_svm_region (u8 * s, va_list * args);
|
||||
u8 *format_svm_region (u8 * s, va_list * args);
|
||||
|
||||
svm_region_t *svm_get_root_rp (void);
|
||||
|
||||
#endif /* __included_svm_h__ */
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
@ -43,28 +43,37 @@
|
||||
#include "svm.h"
|
||||
|
||||
|
||||
int main (int argc, char **argv)
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
svm_region_t *root_rp, *rp;
|
||||
svm_map_region_args_t *a = 0;
|
||||
|
||||
vec_validate (a, 0);
|
||||
|
||||
root_rp = svm_region_init();
|
||||
root_rp = svm_region_init ();
|
||||
|
||||
ASSERT (root_rp);
|
||||
|
||||
a->name = "/qvnet";
|
||||
a->size = (4<<10);
|
||||
a->size = (4 << 10);
|
||||
|
||||
rp = svm_region_find_or_create (root_rp, a);
|
||||
|
||||
ASSERT (rp);
|
||||
|
||||
*((u32 *)rp->data_base) = 0xdeadbeef;
|
||||
*((u32 *) rp->data_base) = 0xdeadbeef;
|
||||
svm_region_unmap (root_rp, rp);
|
||||
|
||||
fformat(stdout, "exiting...\n");
|
||||
fformat (stdout, "exiting...\n");
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
260
svm/svmdb.c
260
svm/svmdb.c
File diff suppressed because it is too large
Load Diff
64
svm/svmdb.h
64
svm/svmdb.h
@ -22,49 +22,56 @@
|
||||
|
||||
#include "svm.h"
|
||||
|
||||
typedef enum {
|
||||
SVMDB_ACTION_ILLEGAL=0,
|
||||
typedef enum
|
||||
{
|
||||
SVMDB_ACTION_ILLEGAL = 0,
|
||||
SVMDB_ACTION_GET, /* not clear why anyone would care */
|
||||
SVMDB_ACTION_SET,
|
||||
SVMDB_ACTION_UNSET,
|
||||
} svmdb_action_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
int pid;
|
||||
int signum;
|
||||
u32 action:4;
|
||||
u32 opaque:28;
|
||||
} svmdb_notify_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
u8 *value;
|
||||
svmdb_notify_t *notifications;
|
||||
u32 elsize;
|
||||
} svmdb_value_t;
|
||||
|
||||
typedef enum {
|
||||
SVMDB_NAMESPACE_STRING=0,
|
||||
typedef enum
|
||||
{
|
||||
SVMDB_NAMESPACE_STRING = 0,
|
||||
SVMDB_NAMESPACE_VEC,
|
||||
SVMDB_N_NAMESPACES,
|
||||
} svmdb_namespace_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uword version;
|
||||
/* pool of values */
|
||||
svmdb_value_t *values;
|
||||
uword *namespaces [SVMDB_N_NAMESPACES];
|
||||
uword *namespaces[SVMDB_N_NAMESPACES];
|
||||
} svmdb_shm_hdr_t;
|
||||
|
||||
#define SVMDB_SHM_VERSION 2
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
int flags;
|
||||
int pid;
|
||||
svm_region_t *db_rp;
|
||||
svmdb_shm_hdr_t *shm;
|
||||
} svmdb_client_t;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
int add_del;
|
||||
svmdb_namespace_t nspace;
|
||||
char *var;
|
||||
@ -88,28 +95,35 @@ svmdb_client_t *svmdb_map_chroot (char *root_path);
|
||||
|
||||
svmdb_client_t *svmdb_map_chroot_size (char *root_path, uword size);
|
||||
|
||||
void svmdb_unmap (svmdb_client_t *client);
|
||||
void svmdb_local_unset_string_variable (svmdb_client_t *client, char *var);
|
||||
void svmdb_local_set_string_variable (svmdb_client_t *client,
|
||||
void svmdb_unmap (svmdb_client_t * client);
|
||||
void svmdb_local_unset_string_variable (svmdb_client_t * client, char *var);
|
||||
void svmdb_local_set_string_variable (svmdb_client_t * client,
|
||||
char *var, char *val);
|
||||
char *svmdb_local_get_string_variable (svmdb_client_t *client, char *var);
|
||||
void *svmdb_local_get_variable_reference (svmdb_client_t *client,
|
||||
svmdb_namespace_t ns,
|
||||
char *var);
|
||||
char *svmdb_local_get_string_variable (svmdb_client_t * client, char *var);
|
||||
void *svmdb_local_get_variable_reference (svmdb_client_t * client,
|
||||
svmdb_namespace_t ns, char *var);
|
||||
|
||||
void svmdb_local_dump_strings (svmdb_client_t *client);
|
||||
void svmdb_local_dump_strings (svmdb_client_t * client);
|
||||
|
||||
void svmdb_local_unset_vec_variable (svmdb_client_t *client, char *var);
|
||||
void svmdb_local_set_vec_variable (svmdb_client_t *client,
|
||||
void svmdb_local_unset_vec_variable (svmdb_client_t * client, char *var);
|
||||
void svmdb_local_set_vec_variable (svmdb_client_t * client,
|
||||
char *var, void *val, u32 elsize);
|
||||
void *svmdb_local_get_vec_variable (svmdb_client_t *client, char *var,
|
||||
void *svmdb_local_get_vec_variable (svmdb_client_t * client, char *var,
|
||||
u32 elsize);
|
||||
void svmdb_local_dump_vecs (svmdb_client_t *client);
|
||||
void svmdb_local_dump_vecs (svmdb_client_t * client);
|
||||
|
||||
int svmdb_local_add_del_notification (svmdb_client_t *client,
|
||||
svmdb_notification_args_t *args);
|
||||
int svmdb_local_add_del_notification (svmdb_client_t * client,
|
||||
svmdb_notification_args_t * args);
|
||||
|
||||
void *svmdb_local_find_or_add_vec_variable (svmdb_client_t *client,
|
||||
void *svmdb_local_find_or_add_vec_variable (svmdb_client_t * client,
|
||||
char *var, u32 nbytes);
|
||||
|
||||
#endif /* __included_svmdb_h__ */
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
|
224
svm/svmdbtool.c
224
svm/svmdbtool.c
File diff suppressed because it is too large
Load Diff
290
svm/svmtool.c
290
svm/svmtool.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user