diff --git a/sys/vm/vm_swap.c b/sys/vm/vm_swap.c index 7cf989b879bf..91e7fe88c016 100644 --- a/sys/vm/vm_swap.c +++ b/sys/vm/vm_swap.c @@ -1,4 +1,4 @@ -/* $NetBSD: vm_swap.c,v 1.52 1997/12/02 13:47:37 pk Exp $ */ +/* $NetBSD: vm_swap.c,v 1.53 1997/12/15 11:18:41 pk Exp $ */ /* * Copyright (c) 1995, 1996, 1997 Matthew R. Green @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -141,119 +142,6 @@ struct swappri { -/* - * Pool resource management helpers for vndxfer & vndbuf below. - */ -struct pool_item { - struct pool_item *pi_next; -}; - -struct pool { - struct pool_item *pr_freelist; /* Free items in pool */ - int pr_size; /* Size of item */ - int pr_freecount; /* # of free items */ - int pr_hiwat; /* max # of pooled items */ - char *pr_wchan; /* tsleep(9) identifier */ - int pr_flags; -#define PR_WANTED 1 - struct simplelock pr_lock; -}; - -static void *get_pooled_resource __P((struct pool *)); -static void put_pooled_resource __P((struct pool *, void *)); -static int prime_pooled_resource __P((struct pool *, int)); - - -/* Grab an item from the pool; must be called at splbio */ -static __inline void * -get_pooled_resource(pp) - struct pool *pp; -{ - void *v; - struct pool_item *pi; - -again: - simple_lock(&pp->pr_lock); - if (pp->pr_freelist == NULL) { - /* if (pp->pr_flags & PR_MALLOC) */ - v = (void *)malloc(pp->pr_size, M_DEVBUF, M_NOWAIT); - if (v == NULL) { - pp->pr_flags |= PR_WANTED; - simple_unlock(&pp->pr_lock); - tsleep((caddr_t)pp, PSWP, pp->pr_wchan, 0); - goto again; - } - } else { - v = pi = pp->pr_freelist; - pp->pr_freelist = pi->pi_next; - pp->pr_freecount--; - } - simple_unlock(&pp->pr_lock); - return (v); -} - -/* Return resource to the pool; must be called at splbio */ -static __inline void -put_pooled_resource(pp, v) - struct pool *pp; - void *v; -{ - struct pool_item *pi = v; - - simple_lock(&pp->pr_lock); - if ((pp->pr_flags & PR_WANTED) || pp->pr_freecount < pp->pr_hiwat) { - /* Return to pool */ - pi->pi_next = pp->pr_freelist; - pp->pr_freelist = pi; - pp->pr_freecount++; - if (pp->pr_flags & PR_WANTED) { - pp->pr_flags &= ~PR_WANTED; - wakeup((caddr_t)pp); - } - } else { - /* Return to system */ - free(v, M_DEVBUF); - - /* - * Return any excess items allocated during periods of - * contention. - */ - while (pp->pr_freecount > pp->pr_hiwat) { - pi = pp->pr_freelist; - pp->pr_freelist = pi->pi_next; - pp->pr_freecount--; - free(pi, M_DEVBUF); - } - } - simple_unlock(&pp->pr_lock); -} - -/* Add N items to the pool */ -static int -prime_pooled_resource(pp, n) - struct pool *pp; - int n; -{ - struct pool_item *pi; - - simple_lock(&pp->pr_lock); - pp->pr_hiwat += n; - while (n--) { - pi = malloc(pp->pr_size, M_DEVBUF, M_NOWAIT); - if (pi == NULL) { - simple_unlock(&pp->pr_lock); - return (ENOMEM); - } - - pi->pi_next = pp->pr_freelist; - pp->pr_freelist = pi; - pp->pr_freecount++; - } - simple_unlock(&pp->pr_lock); - return (0); -} - - /* * The following two structures are used to keep track of data transfers * on swap devices associated with regular files. @@ -263,7 +151,9 @@ prime_pooled_resource(pp, n) struct vndxfer { +#if 0 struct pool_item vx_pool; /* MUST be first */ +#endif struct buf *vx_bp; /* Pointer to parent buffer */ struct swapdev *vx_sdp; int vx_error; @@ -275,7 +165,9 @@ struct vndxfer { struct vndbuf { +#if 0 struct pool_item vb_pool; /* MUST be first */ +#endif struct buf vb_buf; struct vndxfer *vb_xfer; }; @@ -287,26 +179,28 @@ struct vndbuf { /* * We keep a pool vndbuf's and vndxfer structures. */ -struct pool vndxfer_head = { NULL, sizeof(struct vndxfer), 0, 0, "sw vnx", 0 }; -struct pool vndbuf_head = { NULL, sizeof(struct vndbuf), 0, 0, "sw vnd", 0 }; +struct pool *vndxfer_pool; +struct pool *vndbuf_pool; #define getvndxfer(vnx) do { \ int s = splbio(); \ - (vnx) = (struct vndxfer *)get_pooled_resource(&vndxfer_head); \ + (vnx) = (struct vndxfer *) \ + pool_get(vndxfer_pool, PR_MALLOCOK|PR_WAITOK); \ splx(s); \ } while (0) #define putvndxfer(vnx) \ - put_pooled_resource(&vndxfer_head, (void *)(vnx)); + pool_put(vndxfer_pool, (void *)(vnx)); #define getvndbuf(vbp) do { \ int s = splbio(); \ - (vbp) = (struct vndbuf *)get_pooled_resource(&vndbuf_head); \ + (vbp) = (struct vndbuf *) \ + pool_get(vndbuf_pool, PR_MALLOCOK|PR_WAITOK); \ splx(s); \ } while (0) #define putvndbuf(vbp) \ - put_pooled_resource(&vndbuf_head, (void *)(vbp)); + pool_put(vndbuf_pool, (void *)(vbp)); @@ -636,6 +530,7 @@ swap_on(p, sdp) dev_t dev = sdp->swd_dev; char *name; + /* If root on swap, then the skip open/close operations. */ if (vp != rootvp) { if ((error = VOP_OPEN(vp, FREAD|FWRITE, p->p_ucred, p))) @@ -746,10 +641,11 @@ swap_on(p, sdp) s = splbio(); n = 8 * sdp->swd_maxactive; - (void)prime_pooled_resource(&vndxfer_head, n); + (void)pool_prime(vndxfer_pool, n); n = 16 * sdp->swd_maxactive; - (void)prime_pooled_resource(&vndbuf_head, n); + (void)pool_prime(vndbuf_pool, n); + splx(s); } @@ -1294,5 +1190,15 @@ swapinit() sp->b_vnbufs.le_next = NOLIST; sp->b_actf = NULL; + vndxfer_pool = + pool_create(sizeof(struct vndxfer), 0, "swp vnx", M_DEVBUF); + if (vndxfer_pool == NULL) + panic("swapinit: pool_create failed"); + + vndbuf_pool = + pool_create(sizeof(struct vndbuf), 0, "swp vnd", M_DEVBUF); + if (vndbuf_pool == NULL) + panic("swapinit: pool_create failed"); + DPRINTF(VMSDB_SWINIT, ("leaving swapinit\n")); }