#include <sys/vnode.h>
#include <sys/conf.h>
#include <sys/event.h>
+#include <sys/objcache.h>
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
-#include <vm/vm_zone.h>
#include <sys/aio.h>
#include <sys/file2.h>
* aiol list io job pointer - internal to aio_suspend XXX
* aiolio list io jobs
*/
-static vm_zone_t kaio_zone, aiop_zone, aiocb_zone, aiol_zone, aiolio_zone;
+static struct objcache *kaio_oc, *aiop_oc, *aiocb_oc, *aiol_oc, *aiolio_oc;
+
+static MALLOC_DEFINE(M_AIO, "AIO", "AIO");
+static MALLOC_DEFINE(M_AIOP, "AIO proc", "AIO process");
+static MALLOC_DEFINE(M_AIOCB, "AIO cb", "AIO cb");
+static MALLOC_DEFINE(M_AIOL, "AIO list io", "AIO list io");
+static MALLOC_DEFINE(M_AIOLIO, "AIO list io job", "AIO list io job");
/*
* Startup initialization
TAILQ_INIT(&aio_jobs);
TAILQ_INIT(&aio_bufjobs);
TAILQ_INIT(&aio_freejobs);
- kaio_zone = zinit("AIO", sizeof(struct kaioinfo), 0, 0, 1);
- aiop_zone = zinit("AIOP", sizeof(struct aioproclist), 0, 0, 1);
- aiocb_zone = zinit("AIOCB", sizeof(struct aiocblist), 0, 0, 1);
- aiol_zone = zinit("AIOL", AIO_LISTIO_MAX*sizeof(intptr_t), 0, 0, 1);
- aiolio_zone = zinit("AIOLIO", sizeof(struct aio_liojob), 0, 0, 1);
+ kaio_oc = objcache_create_simple(M_AIO, sizeof(struct kaioinfo));
+ aiop_oc = objcache_create_simple(M_AIOP, sizeof(struct aioproclist));
+ aiocb_oc = objcache_create_simple(M_AIOCB, sizeof(struct aiocblist));
+ aiol_oc = objcache_create_simple(M_AIOL, AIO_LISTIO_MAX*sizeof(intptr_t));
+ aiolio_oc = objcache_create_simple(M_AIOLIO, sizeof(struct aio_liojob));
aiod_timeout = AIOD_TIMEOUT_DEFAULT;
aiod_lifetime = AIOD_LIFETIME_DEFAULT;
jobrefid = 1;
{
struct kaioinfo *ki;
if (p->p_aioinfo == NULL) {
- ki = zalloc(kaio_zone);
+ ki = objcache_get(kaio_oc, M_WAITOK);
p->p_aioinfo = ki;
ki->kaio_flags = 0;
ki->kaio_maxactive_count = max_aio_per_proc;
}
if (lj && (lj->lioj_buffer_count == 0) && (lj->lioj_queue_count == 0)) {
TAILQ_REMOVE(&ki->kaio_liojoblist, lj, lioj_list);
- zfree(aiolio_zone, lj);
+ objcache_put(aiolio_oc, lj);
}
aiocbe->jobstate = JOBST_NULL;
callout_stop(&aiocbe->timeout);
if ((lj->lioj_buffer_count == 0) && (lj->lioj_queue_count ==
0)) {
TAILQ_REMOVE(&ki->kaio_liojoblist, lj, lioj_list);
- zfree(aiolio_zone, lj);
+ objcache_put(aiolio_oc, lj);
} else {
#ifdef DIAGNOSTIC
kprintf("LIO job not cleaned up: B:%d, BF:%d, Q:%d, "
}
}
- zfree(kaio_zone, ki);
+ objcache_put(kaio_oc, ki);
p->p_aioinfo = NULL;
#endif /* VFS_AIO */
}
* Allocate and ready the aio control info. There is one aiop structure
* per daemon.
*/
- aiop = zalloc(aiop_zone);
+ aiop = objcache_get(aiop_oc, M_WAITOK);
aiop->aioproc = mycp;
aiop->aioprocflags |= AIOP_FREE;
(num_aio_procs > target_aio_procs)) {
TAILQ_REMOVE(&aio_freeproc, aiop, list);
crit_exit();
- zfree(aiop_zone, aiop);
+ objcache_put(aiop_oc, aiop);
num_aio_procs--;
#ifdef DIAGNOSTIC
if (mycp->p_vmspace->vm_sysref.refcnt <= 1) {
if ((aiocbe = TAILQ_FIRST(&aio_freejobs)) != NULL)
TAILQ_REMOVE(&aio_freejobs, aiocbe, list);
else
- aiocbe = zalloc (aiocb_zone);
+ aiocbe = objcache_get(aiocb_oc, M_WAITOK);
aiocbe->inputcharge = 0;
aiocbe->outputcharge = 0;
get_mplock();
njoblist = 0;
- ijoblist = zalloc(aiol_zone);
- ujoblist = zalloc(aiol_zone);
+ ijoblist = objcache_get(aiol_oc, M_WAITOK);
+ ujoblist = objcache_get(aiol_oc, M_WAITOK);
cbptr = uap->aiocbp;
for (i = 0; i < uap->nent; i++) {
}
if (njoblist == 0) {
- zfree(aiol_zone, ijoblist);
- zfree(aiol_zone, ujoblist);
+ objcache_put(aiol_oc, ijoblist);
+ objcache_put(aiol_oc, ujoblist);
error = 0;
goto done;
}
ijoblist[i]) {
if (ujoblist[i] != cb->uuaiocb)
error = EINVAL;
- zfree(aiol_zone, ijoblist);
- zfree(aiol_zone, ujoblist);
+ objcache_put(aiol_oc, ijoblist);
+ objcache_put(aiol_oc, ujoblist);
goto done;
}
}
crit_exit();
if (ujoblist[i] != cb->uuaiocb)
error = EINVAL;
- zfree(aiol_zone, ijoblist);
- zfree(aiol_zone, ujoblist);
+ objcache_put(aiol_oc, ijoblist);
+ objcache_put(aiol_oc, ujoblist);
goto done;
}
}
crit_exit();
if (error == ERESTART || error == EINTR) {
- zfree(aiol_zone, ijoblist);
- zfree(aiol_zone, ujoblist);
+ objcache_put(aiol_oc, ijoblist);
+ objcache_put(aiol_oc, ujoblist);
error = EINTR;
goto done;
} else if (error == EWOULDBLOCK) {
- zfree(aiol_zone, ijoblist);
- zfree(aiol_zone, ujoblist);
+ objcache_put(aiol_oc, ijoblist);
+ objcache_put(aiol_oc, ujoblist);
error = EAGAIN;
goto done;
}
goto done;
}
- lj = zalloc(aiolio_zone);
+ lj = objcache_get(aiolio_oc);
if (lj == NULL) {
error = EAGAIN;
goto done;
error = copyin(uap->sig, &lj->lioj_signal,
sizeof(lj->lioj_signal));
if (error) {
- zfree(aiolio_zone, lj);
+ objcache_put(aiolio_oc, lj);
goto done;
}
if (!_SIG_VALID(lj->lioj_signal.sigev_signo)) {
- zfree(aiolio_zone, lj);
+ objcache_put(aiolio_oc, lj);
error = EINVAL;
goto done;
}