Skip to content

Commit 0845620

Browse files
Use aligned bytes for kmem
we will use aligned 4k bytes for emergency abd and unaligned 4104 bytes for lookaside list.
1 parent 30ab9a2 commit 0845620

3 files changed

Lines changed: 47 additions & 38 deletions

File tree

include/os/windows/spl/sys/lookasidelist.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ typedef struct lookasidelist_cache {
2121
} lookasidelist_cache_t;
2222

2323
typedef enum {
24-
ALLOC_FROM_LOOKASIDE = 1,
25-
ALLOC_FROM_KMEM = 2
24+
ALLOC_FROM_LOOKASIDE = 1
2625
} alloc_source_t;
2726

2827
typedef struct alloc_hdr {
@@ -36,5 +35,6 @@ void lookasidelist_cache_destroy(lookasidelist_cache_t *pLookasidelist_cache);
3635
void* lookasidelist_cache_alloc(lookasidelist_cache_t *pLookasidelist_cache);
3736
void lookasidelist_cache_free(lookasidelist_cache_t *pLookasidelist_cache,
3837
void *buf);
38+
void lookaside_kmem_free(void);
3939

4040
#endif

module/os/windows/spl/spl-lookasidelist.c

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
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

173173
void *
174174
lookasidelist_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

201201
void
202202
lookasidelist_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+

module/os/windows/zfs/abd_os.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,5 +486,5 @@ abd_iter_unmap(struct abd_iter *aiter)
486486
void
487487
abd_cache_reap_now(void)
488488
{
489-
//kmem_cache_reap_now(abd_chunk_cache);
489+
lookaside_kmem_free();
490490
}

0 commit comments

Comments
 (0)