[Midnightbsd-cvs] src [8098] trunk/sys: enchance the shared page chuck allocator.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Thu Sep 15 18:56:13 EDT 2016
Revision: 8098
http://svnweb.midnightbsd.org/src/?rev=8098
Author: laffer1
Date: 2016-09-15 18:56:13 -0400 (Thu, 15 Sep 2016)
Log Message:
-----------
enchance the shared page chuck allocator.
Modified Paths:
--------------
trunk/sys/kern/kern_exec.c
trunk/sys/sys/sysent.h
Modified: trunk/sys/kern/kern_exec.c
===================================================================
--- trunk/sys/kern/kern_exec.c 2016-09-15 22:54:11 UTC (rev 8097)
+++ trunk/sys/kern/kern_exec.c 2016-09-15 22:56:13 UTC (rev 8098)
@@ -1514,41 +1514,90 @@
return (0);
}
+static struct sx shared_page_alloc_sx;
static vm_object_t shared_page_obj;
static int shared_page_free;
-int
-shared_page_fill(int size, int align, const char *data)
+struct sf_buf *
+shared_page_write_start(int base)
{
vm_page_t m;
struct sf_buf *s;
+
+ VM_OBJECT_LOCK(shared_page_obj);
+ m = vm_page_grab(shared_page_obj, OFF_TO_IDX(base), VM_ALLOC_RETRY);
+ VM_OBJECT_UNLOCK(shared_page_obj);
+ s = sf_buf_alloc(m, SFB_DEFAULT);
+ return (s);
+}
+
+void
+shared_page_write_end(struct sf_buf *sf)
+{
+ vm_page_t m;
+
+ m = sf_buf_page(sf);
+ sf_buf_free(sf);
+ VM_OBJECT_LOCK(shared_page_obj);
+ vm_page_wakeup(m);
+ VM_OBJECT_UNLOCK(shared_page_obj);
+}
+
+void
+shared_page_write(int base, int size, const void *data)
+{
+ struct sf_buf *sf;
vm_offset_t sk;
+
+ sf = shared_page_write_start(base);
+ sk = sf_buf_kva(sf);
+ bcopy(data, (void *)(sk + (base & PAGE_MASK)), size);
+ shared_page_write_end(sf);
+}
+
+static int
+shared_page_alloc_locked(int size, int align)
+{
int res;
- VM_OBJECT_LOCK(shared_page_obj);
- m = vm_page_grab(shared_page_obj, 0, VM_ALLOC_RETRY);
res = roundup(shared_page_free, align);
if (res + size >= IDX_TO_OFF(shared_page_obj->size))
res = -1;
- else {
- VM_OBJECT_UNLOCK(shared_page_obj);
- s = sf_buf_alloc(m, SFB_DEFAULT);
- sk = sf_buf_kva(s);
- bcopy(data, (void *)(sk + res), size);
+ else
shared_page_free = res + size;
- sf_buf_free(s);
- VM_OBJECT_LOCK(shared_page_obj);
- }
- vm_page_wakeup(m);
- VM_OBJECT_UNLOCK(shared_page_obj);
return (res);
}
+int
+shared_page_alloc(int size, int align)
+{
+ int res;
+
+ sx_xlock(&shared_page_alloc_sx);
+ res = shared_page_alloc_locked(size, align);
+ sx_xunlock(&shared_page_alloc_sx);
+ return (res);
+}
+
+int
+shared_page_fill(int size, int align, const void *data)
+{
+ int res;
+
+ sx_xlock(&shared_page_alloc_sx);
+ res = shared_page_alloc_locked(size, align);
+ if (res != -1)
+ shared_page_write(res, size, data);
+ sx_xunlock(&shared_page_alloc_sx);
+ return (res);
+}
+
static void
shared_page_init(void *dummy __unused)
{
vm_page_t m;
+ sx_init(&shared_page_alloc_sx, "shpsx");
shared_page_obj = vm_pager_allocate(OBJT_PHYS, 0, PAGE_SIZE,
VM_PROT_DEFAULT, 0, NULL);
VM_OBJECT_LOCK(shared_page_obj);
Modified: trunk/sys/sys/sysent.h
===================================================================
--- trunk/sys/sys/sysent.h 2016-09-15 22:54:11 UTC (rev 8097)
+++ trunk/sys/sys/sysent.h 2016-09-15 22:56:13 UTC (rev 8098)
@@ -256,8 +256,13 @@
int syscall_thread_enter(struct thread *td, struct sysent *se);
void syscall_thread_exit(struct thread *td, struct sysent *se);
-int shared_page_fill(int size, int align, const char *data);
+struct sf_buf;
+int shared_page_alloc(int size, int align);
+int shared_page_fill(int size, int align, const void *data);
+void shared_page_write(int base, int size, const void *data);
void exec_sysvec_init(void *param);
+struct sf_buf *shared_page_write_start(int base);
+void shared_page_write_end(struct sf_buf *sf);
#define INIT_SYSENTVEC(name, sv) \
SYSINIT(name, SI_SUB_EXEC, SI_ORDER_ANY, \
More information about the Midnightbsd-cvs
mailing list