Author: kib
Date: Sat Sep 22 12:27:50 2012
New Revision: 240814
URL: http://svn.freebsd.org/changeset/base/240814

Log:
  MFC r237431:
  Enchance the shared page chunk allocator.

Modified:
  stable/9/sys/kern/kern_exec.c
  stable/9/sys/sys/sysent.h
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/kern_exec.c
==============================================================================
--- stable/9/sys/kern/kern_exec.c       Sat Sep 22 12:17:09 2012        
(r240813)
+++ stable/9/sys/kern/kern_exec.c       Sat Sep 22 12:27:50 2012        
(r240814)
@@ -1514,33 +1514,81 @@ exec_unregister(execsw_arg)
        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);
 }
 
@@ -1549,6 +1597,7 @@ 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: stable/9/sys/sys/sysent.h
==============================================================================
--- stable/9/sys/sys/sysent.h   Sat Sep 22 12:17:09 2012        (r240813)
+++ stable/9/sys/sys/sysent.h   Sat Sep 22 12:27:50 2012        (r240814)
@@ -256,8 +256,13 @@ int        lkmressys(struct thread *, struct no
 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,                           \
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to