xref: /netbsd-src/sys/ufs/chfs/chfs_pool.c (revision 9fc453562f6ebe8eabdfd51e21ae0a0058906d4f)
1*9fc45356Sriastradh /*	$NetBSD: chfs_pool.c,v 1.5 2020/09/05 16:30:12 riastradh Exp $	*/
2288addd0Sahoka 
3288addd0Sahoka /*-
4288addd0Sahoka  * Copyright (c) 2010 Department of Software Engineering,
5288addd0Sahoka  *		      University of Szeged, Hungary
6288addd0Sahoka  * All rights reserved.
7288addd0Sahoka  *
8288addd0Sahoka  * This code is derived from software contributed to The NetBSD Foundation
9288addd0Sahoka  * by the Department of Software Engineering, University of Szeged, Hungary
10288addd0Sahoka  *
11288addd0Sahoka  * Redistribution and use in source and binary forms, with or without
12288addd0Sahoka  * modification, are permitted provided that the following conditions
13288addd0Sahoka  * are met:
14288addd0Sahoka  * 1. Redistributions of source code must retain the above copyright
15288addd0Sahoka  *    notice, this list of conditions and the following disclaimer.
16288addd0Sahoka  * 2. Redistributions in binary form must reproduce the above copyright
17288addd0Sahoka  *    notice, this list of conditions and the following disclaimer in the
18288addd0Sahoka  *    documentation and/or other materials provided with the distribution.
19288addd0Sahoka  *
20288addd0Sahoka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21288addd0Sahoka  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22288addd0Sahoka  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23288addd0Sahoka  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24288addd0Sahoka  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25288addd0Sahoka  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26288addd0Sahoka  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27288addd0Sahoka  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28288addd0Sahoka  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29288addd0Sahoka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30288addd0Sahoka  * SUCH DAMAGE.
31288addd0Sahoka  */
32288addd0Sahoka 
33288addd0Sahoka /*
34288addd0Sahoka  * Pool allocator and convenience routines for chfs.
35288addd0Sahoka  */
36288addd0Sahoka 
37288addd0Sahoka #include <sys/cdefs.h>
38288addd0Sahoka 
39288addd0Sahoka #include <sys/param.h>
40288addd0Sahoka #include <sys/pool.h>
41288addd0Sahoka #include <sys/atomic.h>
42288addd0Sahoka 
43288addd0Sahoka #include "chfs.h"
44288addd0Sahoka 
45288addd0Sahoka /* --------------------------------------------------------------------- */
46288addd0Sahoka 
47288addd0Sahoka void *	chfs_pool_page_alloc(struct pool *, int);
48288addd0Sahoka void	chfs_pool_page_free(struct pool *, void *);
49288addd0Sahoka 
50288addd0Sahoka /* --------------------------------------------------------------------- */
51288addd0Sahoka 
52288addd0Sahoka struct pool_allocator chfs_pool_allocator = {
53288addd0Sahoka 	.pa_alloc = chfs_pool_page_alloc,
54288addd0Sahoka 	.pa_free = chfs_pool_page_free,
55288addd0Sahoka };
56288addd0Sahoka 
57288addd0Sahoka /* --------------------------------------------------------------------- */
58288addd0Sahoka 
59288addd0Sahoka void
chfs_pool_init(struct chfs_pool * chpp,size_t size,const char * what,struct chfs_mount * chmp)60288addd0Sahoka chfs_pool_init(struct chfs_pool *chpp, size_t size, const char *what,
61288addd0Sahoka     struct chfs_mount *chmp)
62288addd0Sahoka {
63cadfcb39Sryoon 	int cnt __diagused;
64288addd0Sahoka 
65288addd0Sahoka 	cnt = snprintf(chpp->chp_name, sizeof(chpp->chp_name),
66288addd0Sahoka 	    "%s_chfs_%p", what, chmp);
67288addd0Sahoka 	KASSERT(cnt < sizeof(chpp->chp_name));
68288addd0Sahoka 
69288addd0Sahoka 	pool_init(&chpp->chp_pool, size, 0, 0, 0, chpp->chp_name,
70288addd0Sahoka 	    &chfs_pool_allocator, IPL_NONE);
71288addd0Sahoka 	chpp->chp_mount = chmp;
72288addd0Sahoka }
73288addd0Sahoka 
74288addd0Sahoka /* --------------------------------------------------------------------- */
75288addd0Sahoka 
76288addd0Sahoka void
chfs_pool_destroy(struct chfs_pool * chpp)77288addd0Sahoka chfs_pool_destroy(struct chfs_pool *chpp)
78288addd0Sahoka {
79288addd0Sahoka 	pool_destroy((struct pool *)chpp);
80288addd0Sahoka }
81288addd0Sahoka 
82288addd0Sahoka /* --------------------------------------------------------------------- */
83288addd0Sahoka 
84288addd0Sahoka void *
chfs_pool_page_alloc(struct pool * pp,int flags)85288addd0Sahoka chfs_pool_page_alloc(struct pool *pp, int flags)
86288addd0Sahoka {
87288addd0Sahoka 	struct chfs_pool *chpp;
88288addd0Sahoka 	struct chfs_mount *chmp;
89288addd0Sahoka 	unsigned int pages;
90288addd0Sahoka 	void *page;
91288addd0Sahoka 	dbg("CHFS: pool_page_alloc()\n");
92288addd0Sahoka 
93288addd0Sahoka 	chpp = (struct chfs_pool *)pp;
94288addd0Sahoka 	chmp = chpp->chp_mount;
95288addd0Sahoka 
96288addd0Sahoka 	pages = atomic_inc_uint_nv(&chmp->chm_pages_used);
97288addd0Sahoka 	if (pages >= CHFS_PAGES_MAX(chmp)) {
98288addd0Sahoka 		atomic_dec_uint(&chmp->chm_pages_used);
99288addd0Sahoka 		return NULL;
100288addd0Sahoka 	}
1019d4f4a85Schristos 	page = pool_get(pp, flags | PR_WAITOK);
102288addd0Sahoka 	if (page == NULL) {
103288addd0Sahoka 		atomic_dec_uint(&chmp->chm_pages_used);
104288addd0Sahoka 	}
105288addd0Sahoka 
106288addd0Sahoka 	return page;
107288addd0Sahoka }
108288addd0Sahoka 
109288addd0Sahoka /* --------------------------------------------------------------------- */
110288addd0Sahoka 
111288addd0Sahoka void
chfs_pool_page_free(struct pool * pp,void * v)112288addd0Sahoka chfs_pool_page_free(struct pool *pp, void *v)
113288addd0Sahoka {
114288addd0Sahoka 	struct chfs_pool *chpp;
115288addd0Sahoka 	struct chfs_mount *chmp;
116288addd0Sahoka 	dbg("CHFS: pool_page_free()\n");
117288addd0Sahoka 
118288addd0Sahoka 	chpp = (struct chfs_pool *)pp;
119288addd0Sahoka 	chmp = chpp->chp_mount;
120288addd0Sahoka 
121288addd0Sahoka 	atomic_dec_uint(&chmp->chm_pages_used);
1229d4f4a85Schristos 	pool_put(pp,v);
123288addd0Sahoka }
124288addd0Sahoka 
125288addd0Sahoka /* --------------------------------------------------------------------- */
126288addd0Sahoka 
127288addd0Sahoka void
chfs_str_pool_init(struct chfs_str_pool * chsp,struct chfs_mount * chmp)128288addd0Sahoka chfs_str_pool_init(struct chfs_str_pool *chsp, struct chfs_mount *chmp)
129288addd0Sahoka {
130288addd0Sahoka 	dbg("CHFS: str_pool_init()\n");
131288addd0Sahoka 
132288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_16,   16,   "str", chmp);
133288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_32,   32,   "str", chmp);
134288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_64,   64,   "str", chmp);
135288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_128,  128,  "str", chmp);
136288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_256,  256,  "str", chmp);
137288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_512,  512,  "str", chmp);
138288addd0Sahoka 	chfs_pool_init(&chsp->chsp_pool_1024, 1024, "str", chmp);
139288addd0Sahoka }
140288addd0Sahoka 
141288addd0Sahoka /* --------------------------------------------------------------------- */
142288addd0Sahoka 
143288addd0Sahoka void
chfs_str_pool_destroy(struct chfs_str_pool * chsp)144288addd0Sahoka chfs_str_pool_destroy(struct chfs_str_pool *chsp)
145288addd0Sahoka {
146288addd0Sahoka 	dbg("CHFS: str_pool_destroy()\n");
147288addd0Sahoka 
148288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_16);
149288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_32);
150288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_64);
151288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_128);
152288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_256);
153288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_512);
154288addd0Sahoka 	chfs_pool_destroy(&chsp->chsp_pool_1024);
155288addd0Sahoka }
156288addd0Sahoka 
157288addd0Sahoka /* --------------------------------------------------------------------- */
158288addd0Sahoka 
159288addd0Sahoka char *
chfs_str_pool_get(struct chfs_str_pool * chsp,size_t len,int flags)160288addd0Sahoka chfs_str_pool_get(struct chfs_str_pool *chsp, size_t len, int flags)
161288addd0Sahoka {
162288addd0Sahoka 	struct chfs_pool *p;
163288addd0Sahoka 	dbg("CHFS: str_pool_get()\n");
164288addd0Sahoka 
165288addd0Sahoka 	KASSERT(len <= 1024);
166288addd0Sahoka 
167288addd0Sahoka 	if      (len <= 16)   p = &chsp->chsp_pool_16;
168288addd0Sahoka 	else if (len <= 32)   p = &chsp->chsp_pool_32;
169288addd0Sahoka 	else if (len <= 64)   p = &chsp->chsp_pool_64;
170288addd0Sahoka 	else if (len <= 128)  p = &chsp->chsp_pool_128;
171288addd0Sahoka 	else if (len <= 256)  p = &chsp->chsp_pool_256;
172288addd0Sahoka 	else if (len <= 512)  p = &chsp->chsp_pool_512;
173288addd0Sahoka 	else if (len <= 1024) p = &chsp->chsp_pool_1024;
174288addd0Sahoka 	else {
175288addd0Sahoka 		KASSERT(0);
176288addd0Sahoka 		p = NULL; /* Silence compiler warnings */
177288addd0Sahoka 	}
178288addd0Sahoka 
179288addd0Sahoka 	return (char *)CHFS_POOL_GET(p, flags);
180288addd0Sahoka }
181288addd0Sahoka 
182288addd0Sahoka /* --------------------------------------------------------------------- */
183288addd0Sahoka 
184288addd0Sahoka void
chfs_str_pool_put(struct chfs_str_pool * chsp,char * str,size_t len)185288addd0Sahoka chfs_str_pool_put(struct chfs_str_pool *chsp, char *str, size_t len)
186288addd0Sahoka {
187288addd0Sahoka 	struct chfs_pool *p;
188288addd0Sahoka 	dbg("CHFS: str_pool_put()\n");
189288addd0Sahoka 
190288addd0Sahoka 	KASSERT(len <= 1024);
191288addd0Sahoka 
192288addd0Sahoka 	if      (len <= 16)   p = &chsp->chsp_pool_16;
193288addd0Sahoka 	else if (len <= 32)   p = &chsp->chsp_pool_32;
194288addd0Sahoka 	else if (len <= 64)   p = &chsp->chsp_pool_64;
195288addd0Sahoka 	else if (len <= 128)  p = &chsp->chsp_pool_128;
196288addd0Sahoka 	else if (len <= 256)  p = &chsp->chsp_pool_256;
197288addd0Sahoka 	else if (len <= 512)  p = &chsp->chsp_pool_512;
198288addd0Sahoka 	else if (len <= 1024) p = &chsp->chsp_pool_1024;
199288addd0Sahoka 	else {
200288addd0Sahoka 		KASSERT(0);
201288addd0Sahoka 		p = NULL; /* Silence compiler warnings */
202288addd0Sahoka 	}
203288addd0Sahoka 
204288addd0Sahoka 	CHFS_POOL_PUT(p, str);
205288addd0Sahoka }
206