22#include <sys/lookasidelist.h>
33#include <sys/kmem.h>
44
5- kmem_cache_t * emergency_abd ;
6- #define LOOKASIDE_THRESHOLD 30000ULL
5+ #define PAGESIZING 4096
6+ kmem_cache_t * emergency_abd ;
77
88/*
99* Portions Copyright 2022 Andrew Innes <andrew.c12@gmail.com>
@@ -145,7 +145,7 @@ lookasidelist_cache_create(char *name, /* descriptive name for this cache */
145145 }
146146 }
147147
148- emergency_abd = kmem_cache_create ("abd_chunk" , total_chunk_size ,
148+ emergency_abd = kmem_cache_create ("abd_chunk" , size ,
149149 MIN (PAGE_SIZE , 4096 ),
150150 NULL , NULL , NULL , NULL , abd_arena , KMC_NOTOUCH );
151151
@@ -172,43 +172,52 @@ lookasidelist_cache_destroy(lookasidelist_cache_t *pLookasidelist_cache)
172172
173173void *
174174lookasidelist_cache_alloc (lookasidelist_cache_t * pLookasidelist_cache )
175- {
176- alloc_hdr_t * hdr ;
177-
178- /*
179- * Fast path: try lookaside list first.
180- */
181- hdr = ExAllocateFromLookasideListEx ( & pLookasidelist_cache -> lookasideField );
182- if ( hdr != NULL ) {
183- hdr -> magic = ALLOC_MAGIC ;
184- hdr -> source = ALLOC_FROM_LOOKASIDE ;
185-
186- return (( void * )( hdr + 1 )) ;
187- }
188-
189- /*
190- * Slow path: guaranteed allocation via kmem (sleeping allowed).
191- */
192- hdr = kmem_cache_alloc ( emergency_abd , KM_SLEEP );
193- if ( hdr != NULL ) {
194- hdr -> magic = ALLOC_MAGIC ;
195- hdr -> source = ALLOC_FROM_KMEM ;
196-
197- return (( void * )( hdr + 1 ) );
198- }
175+ {
176+ alloc_hdr_t * hdr ;
177+
178+ /*
179+ * Fast path: try lookaside list first.
180+ * Allocates: [ alloc_hdr | 4096 payload ] => 4104 bytes
181+ */
182+ hdr = ExAllocateFromLookasideListEx (
183+ & pLookasidelist_cache -> lookasideField ) ;
184+
185+ if ( hdr != NULL ) {
186+ hdr -> magic = ALLOC_MAGIC ;
187+ hdr -> source = ALLOC_FROM_LOOKASIDE ;
188+
189+ return ( void * )( hdr + 1 );
190+ }
191+
192+ /*
193+ * Slow path: guaranteed allocation via kmem (sleeping allowed).
194+ * Allocates: exactly 4096 bytes, page-aligned, no header.
195+ */
196+ void * buf = kmem_cache_alloc ( emergency_abd , KM_SLEEP );
197+ ASSERT ( buf != NULL );
198+ return ( buf );
199199}
200200
201201void
202202lookasidelist_cache_free (lookasidelist_cache_t * pLookasidelist_cache , void * buf )
203- {
204- alloc_hdr_t * hdr = (alloc_hdr_t * )buf - 1 ;
205- ASSERT (hdr -> magic == ALLOC_MAGIC );
206-
207- if (hdr -> source == ALLOC_FROM_LOOKASIDE ) {
208- ExFreeToLookasideListEx (& pLookasidelist_cache -> lookasideField ,
209- hdr );
203+ {
204+ /* Check if not page-aligned (lookaside allocation with header) */
205+ if ((uintptr_t )buf & (PAGESIZING - 1 )) {
206+ alloc_hdr_t * hdr = (alloc_hdr_t * )buf - 1 ;
207+ ASSERT (hdr -> magic == ALLOC_MAGIC );
208+ ASSERT (hdr -> source == ALLOC_FROM_LOOKASIDE );
209+
210+ ExFreeToLookasideListEx (& pLookasidelist_cache -> lookasideField , hdr );
210211 }
211212 else {
212- kmem_cache_free (emergency_abd , hdr );
213+ /*page-aligned = kmem allocation (4096 bytes) */
214+ kmem_cache_free (emergency_abd , buf );
213215 }
214216}
217+
218+ void
219+ lookaside_kmem_free (void )
220+ {
221+ kmem_cache_reap_now (emergency_abd );
222+ }
223+
0 commit comments