Skip to content

Commit 61adc03

Browse files
committed
Also release memory in vmem_seg_arena.
Remove debug printfs.
1 parent d8a73d6 commit 61adc03

File tree

2 files changed

+55
-47
lines changed

2 files changed

+55
-47
lines changed

module/spl/spl-kmem.c

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3787,26 +3787,10 @@ struct free_slab {
37873787
static list_t freelist;
37883788

37893789

3790-
void fudge(kmem_cache_t *cp)
3790+
void kmem_cache_build_slablist(kmem_cache_t *cp)
37913791
{
37923792
int cpu_seqid;
37933793

3794-
printf("Releasing '%s'\n", cp->cache_name ? cp->cache_name : "(null)");
3795-
3796-
// lund
3797-
3798-
// release
3799-
3800-
// cache_magtype points to one of the array of magtype[], which is
3801-
// freed separately.
3802-
// kmem_magtype_t *cache_magtype; /* magazine type */
3803-
//cp->cache_magtype = NULL;
3804-
3805-
// kmem_maglist_t cache_full; /* full magazines */
3806-
// kmem_maglist_t cache_empty;
3807-
// kmem_cpu_cache_t cache_cpu[1]; /* per-cpu data */
3808-
3809-
38103794
vmem_t *vmp = cp->cache_arena;
38113795
kmem_slab_t *sp;
38123796
struct free_slab *fs;
@@ -3820,7 +3804,7 @@ void fudge(kmem_cache_t *cp)
38203804
fs->slab = (void *)P2ALIGN((uintptr_t)sp->slab_base, vmp->vm_quantum);
38213805
list_link_init(&fs->next);
38223806
list_insert_tail(&freelist, fs);
3823-
// leaking "sp"
3807+
38243808
}
38253809

38263810
for (sp = avl_first(&cp->cache_partial_slabs); sp != NULL;
@@ -3833,7 +3817,6 @@ void fudge(kmem_cache_t *cp)
38333817
list_link_init(&fs->next);
38343818
list_insert_tail(&freelist, fs);
38353819

3836-
// leaking "sp"
38373820
}
38383821

38393822

@@ -3870,25 +3853,11 @@ kmem_cache_fini(int pass, int use_large_pages)
38703853
mutex_enter(&kmem_cache_lock);
38713854
// lund
38723855

3873-
#if 0
3874-
for(cp = list_head(&kmem_caches);
3875-
cp != NULL;
3876-
list_next(&kmem_caches, cp)) {
3877-
3878-
printf("Purging magazine '%s'\n",
3879-
cp->cache_name ? cp->cache_name : "(null)");
3880-
3881-
mutex_exit(&kmem_cache_lock);
3882-
kmem_cache_magazine_purge(cp);
3883-
mutex_enter(&kmem_cache_lock);
3884-
3885-
}
3886-
#endif
38873856

38883857
while((cp = list_head(&kmem_caches))) {
38893858
list_remove(&kmem_caches, cp);
38903859
mutex_exit(&kmem_cache_lock);
3891-
fudge(cp);
3860+
kmem_cache_build_slablist(cp);
38923861
mutex_enter(&kmem_cache_lock);
38933862
}
38943863

@@ -4256,32 +4225,20 @@ spl_kmem_fini(void)
42564225

42574226
kmem_cache_fini(2, /*use_large_pages*/ 0);
42584227

4259-
printf("A\n");
4260-
42614228
vmem_destroy(kmem_oversize_arena);
42624229

4263-
printf("B\n");
4264-
42654230
segkmem_zio_fini();
42664231

4267-
printf("C\n");
4268-
42694232
vmem_destroy(kmem_log_arena);
42704233
vmem_destroy(kmem_hash_arena);
42714234
vmem_destroy(kmem_cache_arena);
42724235
vmem_destroy(kmem_msb_arena);
42734236
vmem_destroy(kmem_metadata_arena);
42744237

4275-
printf("D\n");
4276-
42774238
kernelheap_fini();
42784239

4279-
printf("E\n");
4280-
42814240
list_destroy(&kmem_caches);
42824241

4283-
printf("F\n");
4284-
42854242
mutex_destroy(&kmem_cache_kstat_lock);
42864243
mutex_destroy(&kmem_flags_lock);
42874244
mutex_destroy(&kmem_cache_lock);

module/spl/spl-vmem.c

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1861,13 +1861,53 @@ vmem_init(const char *heap_name,
18611861
void vmem_fini(vmem_t *heap)
18621862
{
18631863
uint32_t id;
1864-
1864+
vmem_t *vmp;
1865+
vmem_seg_t *seg;
18651866
/*
18661867
18671868
We also need to release the slabs that vmem_populate() has allocated
18681869
in the vmem_seg_arena here.
18691870
18701871
*/
1872+
vmp = vmem_seg_arena;
1873+
while (vmp->vm_nsegfree > 0)
1874+
vmem_putseg_global(vmem_getseg(vmp));
1875+
1876+
struct free_slab {
1877+
vmem_t *vmp;
1878+
size_t slabsize;
1879+
void *slab;
1880+
list_node_t next;
1881+
};
1882+
1883+
uint64_t i;
1884+
list_t freelist;
1885+
struct free_slab *fs;
1886+
list_create(&freelist, sizeof (struct free_slab),
1887+
offsetof(struct free_slab, next));
1888+
1889+
1890+
ssize_t nseg;
1891+
size_t size;
1892+
nseg = VMEM_MINFREE + vmem_populators * VMEM_POPULATE_RESERVE;
1893+
size = P2ROUNDUP(nseg *vmem_seg_size,vmem_seg_arena->vm_quantum);
1894+
1895+
while((seg = vmem_getseg_global()) ) {
1896+
uint64_t align;
1897+
align = (uint64_t)seg % size;
1898+
//printf("seg %p: align %u: start %p\n",
1899+
// seg, align , seg->vs_start);
1900+
if (!align) {
1901+
1902+
MALLOC(fs, struct free_slab *, sizeof(struct free_slab), M_TEMP, M_WAITOK);
1903+
fs->vmp = vmem_seg_arena;
1904+
fs->slabsize = size;
1905+
fs->slab = seg;
1906+
list_link_init(&fs->next);
1907+
list_insert_tail(&freelist, fs);
1908+
1909+
}
1910+
}
18711911

18721912
for (id = 0; id < 5; id++) {// From vmem_init, 5 vmem_create
18731913
vmem_xfree(vmem_vmem_arena, global_vmem_reap[id], sizeof (vmem_t));
@@ -1879,6 +1919,17 @@ void vmem_fini(vmem_t *heap)
18791919
vmem_destroy_internal(vmem_metadata_arena);
18801920
vmem_destroy_internal(heap);
18811921

1922+
1923+
i = 0;
1924+
while((fs = list_head(&freelist))) {
1925+
i+=fs->slabsize;
1926+
list_remove(&freelist, fs);
1927+
segkmem_free(fs->vmp, fs->slab, fs->slabsize);
1928+
FREE(fs, M_TEMP);
1929+
}
1930+
printf("Released %llu bytes from vmem_seg_arena\n", i);
1931+
list_destroy(&freelist);
1932+
18821933
mutex_destroy(&vmem_panic_lock);
18831934
mutex_destroy(&vmem_pushpage_lock);
18841935
mutex_destroy(&vmem_nosleep_lock);

0 commit comments

Comments
 (0)