Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
session: remove session logic from io rx evt sender
[vpp.git]
/
src
/
svm
/
svm.c
diff --git
a/src/svm/svm.c
b/src/svm/svm.c
index
f187fbf
..
4aefd20
100644
(file)
--- a/
src/svm/svm.c
+++ b/
src/svm/svm.c
@@
-76,23
+76,23
@@
svm_get_global_region_base_va ()
unformat_init_clib_file (&input, fd);
while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
{
unformat_init_clib_file (&input, fd);
while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
{
- unformat (&input, "%llx-%llx", &start, &end);
+ if (unformat (&input, "%llx-%llx", &start, &end))
+ end--;
unformat_skip_line (&input);
}
unformat_skip_line (&input);
}
+ unformat_free (&input);
+ close (fd);
-
count_leading_zeros (bits,
end);
+
bits = count_leading_zeros (
end);
bits = 64 - bits;
if (bits >= 36 && bits <= 48)
return ((1ul << bits) / 4) - (2 * SVM_GLOBAL_REGION_SIZE);
else
clib_unix_error ("unexpected va bits '%u'", bits);
bits = 64 - bits;
if (bits >= 36 && bits <= 48)
return ((1ul << bits) / 4) - (2 * SVM_GLOBAL_REGION_SIZE);
else
clib_unix_error ("unexpected va bits '%u'", bits);
-
- unformat_free (&input);
- close (fd);
#endif
/* default value */
#endif
/* default value */
- return 0x
30000000
;
+ return 0x
130000000ULL
;
}
static void
}
static void
@@
-236,6
+236,7
@@
format_svm_region (u8 * s, va_list * args)
}
}
}
}
}
}
+#if USE_DLMALLOC == 0
s = format (s, " rgn heap stats: %U", format_mheap,
rp->region_heap, 0);
if ((rp->flags & SVM_FLAGS_MHEAP) && rp->data_heap)
s = format (s, " rgn heap stats: %U", format_mheap,
rp->region_heap, 0);
if ((rp->flags & SVM_FLAGS_MHEAP) && rp->data_heap)
@@
-244,6
+245,7
@@
format_svm_region (u8 * s, va_list * args)
rp->data_heap, 1);
}
s = format (s, "\n");
rp->data_heap, 1);
}
s = format (s, "\n");
+#endif
}
return (s);
}
return (s);
@@
-339,9
+341,19
@@
svm_data_region_create (svm_map_region_args_t * a, svm_region_t * rp)
if (a->flags & SVM_FLAGS_MHEAP)
{
if (a->flags & SVM_FLAGS_MHEAP)
{
+#if USE_DLMALLOC == 0
+ mheap_t *heap_header;
rp->data_heap =
mheap_alloc_with_flags ((void *) (rp->data_base), map_size,
MHEAP_FLAG_DISABLE_VM);
rp->data_heap =
mheap_alloc_with_flags ((void *) (rp->data_base), map_size,
MHEAP_FLAG_DISABLE_VM);
+ heap_header = mheap_header (rp->data_heap);
+ heap_header->flags |= MHEAP_FLAG_THREAD_SAFE;
+#else
+ rp->data_heap = create_mspace_with_base (rp->data_base,
+ map_size, 1 /* locked */ );
+ mspace_disable_expand (rp->data_heap);
+#endif
+
rp->flags |= SVM_FLAGS_MHEAP;
}
return 0;
rp->flags |= SVM_FLAGS_MHEAP;
}
return 0;
@@
-483,7
+495,7
@@
svm_region_init_mapped_region (svm_map_region_args_t * a, svm_region_t * rp)
ASSERT (rp);
int rv;
ASSERT (rp);
int rv;
- memset (rp, 0, sizeof (*rp));
+
clib_
memset (rp, 0, sizeof (*rp));
if (pthread_mutexattr_init (&attr))
clib_unix_warning ("mutexattr_init");
if (pthread_mutexattr_init (&attr))
clib_unix_warning ("mutexattr_init");
@@
-514,12
+526,22
@@
svm_region_init_mapped_region (svm_map_region_args_t * a, svm_region_t * rp)
rp->virtual_base = a->baseva;
rp->virtual_size = a->size;
rp->virtual_base = a->baseva;
rp->virtual_size = a->size;
+#if USE_DLMALLOC == 0
rp->region_heap =
mheap_alloc_with_flags (uword_to_pointer
(a->baseva + MMAP_PAGESIZE, void *),
(a->pvt_heap_size !=
0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE,
MHEAP_FLAG_DISABLE_VM);
rp->region_heap =
mheap_alloc_with_flags (uword_to_pointer
(a->baseva + MMAP_PAGESIZE, void *),
(a->pvt_heap_size !=
0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE,
MHEAP_FLAG_DISABLE_VM);
+#else
+ rp->region_heap = create_mspace_with_base
+ (uword_to_pointer (a->baseva + MMAP_PAGESIZE, void *),
+ (a->pvt_heap_size !=
+ 0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE, 1 /* locked */ );
+
+ mspace_disable_expand (rp->region_heap);
+#endif
+
oldheap = svm_push_pvt_heap (rp);
rp->region_name = (char *) format (0, "%s%c", a->name, 0);
oldheap = svm_push_pvt_heap (rp);
rp->region_name = (char *) format (0, "%s%c", a->name, 0);
@@
-652,6
+674,10
@@
svm_map_region (svm_map_region_args_t * a)
return (0);
}
return (0);
}
+ /* Reset ownership in case the client started first */
+ if (fchown (svm_fd, a->uid, a->gid) < 0)
+ clib_unix_warning ("segment chown [ok if client starts first]");
+
time_left = 20;
while (1)
{
time_left = 20;
while (1)
{
@@
-721,6
+747,8
@@
svm_map_region (svm_map_region_args_t * a)
return (0);
}
return (0);
}
+ close (svm_fd);
+
if ((uword) rp != rp->virtual_base)
{
clib_warning ("mmap botch");
if ((uword) rp != rp->virtual_base)
{
clib_warning ("mmap botch");
@@
-838,7
+866,7
@@
svm_region_init (void)
{
svm_map_region_args_t _a, *a = &_a;
{
svm_map_region_args_t _a, *a = &_a;
- memset (a, 0, sizeof (*a));
+
clib_
memset (a, 0, sizeof (*a));
a->root_path = 0;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
a->root_path = 0;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
@@
-855,7
+883,7
@@
svm_region_init_chroot (const char *root_path)
{
svm_map_region_args_t _a, *a = &_a;
{
svm_map_region_args_t _a, *a = &_a;
- memset (a, 0, sizeof (*a));
+
clib_
memset (a, 0, sizeof (*a));
a->root_path = root_path;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
a->root_path = root_path;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
@@
-872,7
+900,7
@@
svm_region_init_chroot_uid_gid (const char *root_path, int uid, int gid)
{
svm_map_region_args_t _a, *a = &_a;
{
svm_map_region_args_t _a, *a = &_a;
- memset (a, 0, sizeof (*a));
+
clib_
memset (a, 0, sizeof (*a));
a->root_path = root_path;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
a->root_path = root_path;
a->name = SVM_GLOBAL_REGION_NAME;
a->baseva = svm_get_global_region_base_va ();
@@
-1034,7
+1062,7
@@
svm_region_unlink (svm_region_t * rp)
* a new region client showing up at the wrong moment.
*/
void
* a new region client showing up at the wrong moment.
*/
void
-svm_region_unmap
(void *rp_arg
)
+svm_region_unmap
_internal (void *rp_arg, u8 is_client
)
{
int i, mypid = getpid ();
int nclients_left;
{
int i, mypid = getpid ();
int nclients_left;
@@
-1134,7
+1162,12
@@
found:
vec_free (name);
region_unlock (rp);
vec_free (name);
region_unlock (rp);
- svm_region_unlink (rp);
+
+ /* If a client asks for the cleanup, don't unlink the backing
+ * file since we can't tell if it has been recreated. */
+ if (!is_client)
+ svm_region_unlink (rp);
+
munmap ((void *) virtual_base, virtual_size);
region_unlock (root_rp);
svm_pop_heap (oldheap);
munmap ((void *) virtual_base, virtual_size);
region_unlock (root_rp);
svm_pop_heap (oldheap);
@@
-1147,11
+1180,23
@@
found:
munmap ((void *) virtual_base, virtual_size);
}
munmap ((void *) virtual_base, virtual_size);
}
+void
+svm_region_unmap (void *rp_arg)
+{
+ svm_region_unmap_internal (rp_arg, 0 /* is_client */ );
+}
+
+void
+svm_region_unmap_client (void *rp_arg)
+{
+ svm_region_unmap_internal (rp_arg, 1 /* is_client */ );
+}
+
/*
* svm_region_exit
*/
/*
* svm_region_exit
*/
-void
-svm_region_exit
(
)
+
static
void
+svm_region_exit
_internal (u8 is_client
)
{
void *oldheap;
int i, mypid = getpid ();
{
void *oldheap;
int i, mypid = getpid ();
@@
-1191,7
+1236,7
@@
svm_region_exit ()
found:
found:
- if (vec_len (root_rp->client_pids) == 0)
+ if (
!is_client &&
vec_len (root_rp->client_pids) == 0)
svm_region_unlink (root_rp);
region_unlock (root_rp);
svm_region_unlink (root_rp);
region_unlock (root_rp);
@@
-1201,6
+1246,18
@@
found:
munmap ((void *) virtual_base, virtual_size);
}
munmap ((void *) virtual_base, virtual_size);
}
+void
+svm_region_exit (void)
+{
+ svm_region_exit_internal (0 /* is_client */ );
+}
+
+void
+svm_region_exit_client (void)
+{
+ svm_region_exit_internal (1 /* is_client */ );
+}
+
void
svm_client_scan_this_region_nolock (svm_region_t * rp)
{
void
svm_client_scan_this_region_nolock (svm_region_t * rp)
{