Utilize sf_buf_alloc() rather than pmap_qenter() (and sometimes

kmem_alloc_wait()) for mapping the image header.  On all machines with a
direct virtual-to-physical mapping and SMP/HTT i386s, this is a clear win.
This commit is contained in:
Alan Cox 2004-04-23 03:01:40 +00:00
parent c72292c9ec
commit 59c8bc40ce
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=128568
3 changed files with 16 additions and 22 deletions

View File

@ -528,16 +528,10 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr,
imgp->userspace_envv = NULL;
imgp->attr = attr;
imgp->firstpage = NULL;
imgp->image_header = (char *)kmem_alloc_wait(exec_map, PAGE_SIZE);
imgp->image_header = NULL;
imgp->object = NULL;
imgp->execlabel = NULL;
if (imgp->image_header == NULL) {
nd->ni_vp = NULL;
error = ENOMEM;
goto fail;
}
/* XXXKSE */
NDINIT(nd, LOOKUP, LOCKLEAF|FOLLOW, UIO_SYSSPACE, file, curthread);
@ -626,9 +620,6 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr,
fail:
if (imgp->firstpage)
exec_unmap_first_page(imgp);
if (imgp->image_header)
kmem_free_wakeup(exec_map, (vm_offset_t)imgp->image_header,
PAGE_SIZE);
if (imgp->object)
vm_object_deallocate(imgp->object);

View File

@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/pioctl.h>
#include <sys/namei.h>
#include <sys/sf_buf.h>
#include <sys/sysent.h>
#include <sys/shm.h>
#include <sys/sysctl.h>
@ -303,8 +304,7 @@ kern_execve(td, fname, argv, envv, mac_p)
* Allocate temporary demand zeroed space for argument and
* environment strings
*/
imgp->stringbase = (char *)kmem_alloc_wait(exec_map, ARG_MAX +
PAGE_SIZE);
imgp->stringbase = (char *)kmem_alloc_wait(exec_map, ARG_MAX);
if (imgp->stringbase == NULL) {
error = ENOMEM;
mtx_lock(&Giant);
@ -312,7 +312,7 @@ kern_execve(td, fname, argv, envv, mac_p)
}
imgp->stringp = imgp->stringbase;
imgp->stringspace = ARG_MAX;
imgp->image_header = imgp->stringbase + ARG_MAX;
imgp->image_header = NULL;
/*
* Translate the file name. namei() returns a vnode pointer
@ -328,7 +328,7 @@ kern_execve(td, fname, argv, envv, mac_p)
error = namei(ndp);
if (error) {
kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase,
ARG_MAX + PAGE_SIZE);
ARG_MAX);
goto exec_fail;
}
@ -699,7 +699,7 @@ kern_execve(td, fname, argv, envv, mac_p)
if (imgp->stringbase != NULL)
kmem_free_wakeup(exec_map, (vm_offset_t)imgp->stringbase,
ARG_MAX + PAGE_SIZE);
ARG_MAX);
if (imgp->object != NULL)
vm_object_deallocate(imgp->object);
@ -800,8 +800,8 @@ exec_map_first_page(imgp)
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
pmap_qenter((vm_offset_t)imgp->image_header, ma, 1);
imgp->firstpage = ma[0];
imgp->firstpage = sf_buf_alloc(ma[0], 0);
imgp->image_header = (char *)sf_buf_kva(imgp->firstpage);
return (0);
}
@ -810,13 +810,15 @@ void
exec_unmap_first_page(imgp)
struct image_params *imgp;
{
vm_page_t m;
if (imgp->firstpage != NULL) {
pmap_qremove((vm_offset_t)imgp->image_header, 1);
vm_page_lock_queues();
vm_page_unhold(imgp->firstpage);
vm_page_unlock_queues();
m = sf_buf_page(imgp->firstpage);
sf_buf_free(imgp->firstpage);
imgp->firstpage = NULL;
vm_page_lock_queues();
vm_page_unhold(m);
vm_page_unlock_queues();
}
}

View File

@ -35,6 +35,7 @@
#define MAXSHELLCMDLEN 128
struct label;
struct sf_buf;
struct sysentvec;
struct thread;
struct vm_object;
@ -59,7 +60,7 @@ struct image_params {
char interpreted; /* flag - this executable is interpreted */
char interpreter_name[MAXSHELLCMDLEN]; /* name of the interpreter */
void *auxargs; /* ELF Auxinfo structure pointer */
struct vm_page *firstpage; /* first page that we mapped */
struct sf_buf *firstpage; /* first page that we mapped */
char *fname; /* pointer to filename of executable (user space) */
unsigned long ps_strings; /* PS_STRINGS for BSD/OS binaries */
size_t auxarg_size;