xref: /freebsd/contrib/jemalloc/src/sz.c (revision c5ad81420c495d1d5de04209b0ec4fcb435c322c)
1b7eaed25SJason Evans #include "jemalloc/internal/jemalloc_preamble.h"
2b7eaed25SJason Evans #include "jemalloc/internal/sz.h"
3b7eaed25SJason Evans 
JEMALLOC_ALIGNED(CACHELINE)4b7eaed25SJason Evans JEMALLOC_ALIGNED(CACHELINE)
5*c5ad8142SEric van Gyzen size_t sz_pind2sz_tab[SC_NPSIZES+1];
6*c5ad8142SEric van Gyzen 
7*c5ad8142SEric van Gyzen static void
8*c5ad8142SEric van Gyzen sz_boot_pind2sz_tab(const sc_data_t *sc_data) {
9*c5ad8142SEric van Gyzen 	int pind = 0;
10*c5ad8142SEric van Gyzen 	for (unsigned i = 0; i < SC_NSIZES; i++) {
11*c5ad8142SEric van Gyzen 		const sc_t *sc = &sc_data->sc[i];
12*c5ad8142SEric van Gyzen 		if (sc->psz) {
13*c5ad8142SEric van Gyzen 			sz_pind2sz_tab[pind] = (ZU(1) << sc->lg_base)
14*c5ad8142SEric van Gyzen 			    + (ZU(sc->ndelta) << sc->lg_delta);
15*c5ad8142SEric van Gyzen 			pind++;
16*c5ad8142SEric van Gyzen 		}
17*c5ad8142SEric van Gyzen 	}
18*c5ad8142SEric van Gyzen 	for (int i = pind; i <= (int)SC_NPSIZES; i++) {
19*c5ad8142SEric van Gyzen 		sz_pind2sz_tab[pind] = sc_data->large_maxclass + PAGE;
20*c5ad8142SEric van Gyzen 	}
21*c5ad8142SEric van Gyzen }
22b7eaed25SJason Evans 
JEMALLOC_ALIGNED(CACHELINE)23b7eaed25SJason Evans JEMALLOC_ALIGNED(CACHELINE)
24*c5ad8142SEric van Gyzen size_t sz_index2size_tab[SC_NSIZES];
25b7eaed25SJason Evans 
26*c5ad8142SEric van Gyzen static void
27*c5ad8142SEric van Gyzen sz_boot_index2size_tab(const sc_data_t *sc_data) {
28*c5ad8142SEric van Gyzen 	for (unsigned i = 0; i < SC_NSIZES; i++) {
29*c5ad8142SEric van Gyzen 		const sc_t *sc = &sc_data->sc[i];
30*c5ad8142SEric van Gyzen 		sz_index2size_tab[i] = (ZU(1) << sc->lg_base)
31*c5ad8142SEric van Gyzen 		    + (ZU(sc->ndelta) << (sc->lg_delta));
32*c5ad8142SEric van Gyzen 	}
33*c5ad8142SEric van Gyzen }
34*c5ad8142SEric van Gyzen 
35*c5ad8142SEric van Gyzen /*
36*c5ad8142SEric van Gyzen  * To keep this table small, we divide sizes by the tiny min size, which gives
37*c5ad8142SEric van Gyzen  * the smallest interval for which the result can change.
38*c5ad8142SEric van Gyzen  */
JEMALLOC_ALIGNED(CACHELINE)39b7eaed25SJason Evans JEMALLOC_ALIGNED(CACHELINE)
40*c5ad8142SEric van Gyzen uint8_t sz_size2index_tab[(SC_LOOKUP_MAXCLASS >> SC_LG_TINY_MIN) + 1];
41*c5ad8142SEric van Gyzen 
42*c5ad8142SEric van Gyzen static void
43*c5ad8142SEric van Gyzen sz_boot_size2index_tab(const sc_data_t *sc_data) {
44*c5ad8142SEric van Gyzen 	size_t dst_max = (SC_LOOKUP_MAXCLASS >> SC_LG_TINY_MIN) + 1;
45*c5ad8142SEric van Gyzen 	size_t dst_ind = 0;
46*c5ad8142SEric van Gyzen 	for (unsigned sc_ind = 0; sc_ind < SC_NSIZES && dst_ind < dst_max;
47*c5ad8142SEric van Gyzen 	    sc_ind++) {
48*c5ad8142SEric van Gyzen 		const sc_t *sc = &sc_data->sc[sc_ind];
49*c5ad8142SEric van Gyzen 		size_t sz = (ZU(1) << sc->lg_base)
50*c5ad8142SEric van Gyzen 		    + (ZU(sc->ndelta) << sc->lg_delta);
51*c5ad8142SEric van Gyzen 		size_t max_ind = ((sz + (ZU(1) << SC_LG_TINY_MIN) - 1)
52*c5ad8142SEric van Gyzen 				   >> SC_LG_TINY_MIN);
53*c5ad8142SEric van Gyzen 		for (; dst_ind <= max_ind && dst_ind < dst_max; dst_ind++) {
54*c5ad8142SEric van Gyzen 			sz_size2index_tab[dst_ind] = sc_ind;
55*c5ad8142SEric van Gyzen 		}
56*c5ad8142SEric van Gyzen 	}
57*c5ad8142SEric van Gyzen }
58*c5ad8142SEric van Gyzen 
59*c5ad8142SEric van Gyzen void
sz_boot(const sc_data_t * sc_data)60*c5ad8142SEric van Gyzen sz_boot(const sc_data_t *sc_data) {
61*c5ad8142SEric van Gyzen 	sz_boot_pind2sz_tab(sc_data);
62*c5ad8142SEric van Gyzen 	sz_boot_index2size_tab(sc_data);
63*c5ad8142SEric van Gyzen 	sz_boot_size2index_tab(sc_data);
64*c5ad8142SEric van Gyzen }
65