]> granicus.if.org Git - zfs/commitdiff
Fixes: #8934 Large kmem_alloc
authorNick Mattis <nmattis@users.noreply.github.com>
Wed, 10 Jul 2019 22:54:49 +0000 (18:54 -0400)
committerTony Hutter <hutter2@llnl.gov>
Wed, 25 Sep 2019 18:27:49 +0000 (11:27 -0700)
Large allocation over the spl_kmem_alloc_warn value was being performed.
Switched to vmem_alloc interface as specified for large allocations.
Changed the subsequent frees to match.

Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: nmattis <nickm970@gmail.com>
Closes #8934
Closes #9011

module/zfs/vdev_indirect_births.c

index 1c44a64287d353d5dc6ccab9ef221f47e6586440..99b83c3922577893a7d107af849a374e3cefbfb6 100644 (file)
@@ -70,7 +70,7 @@ vdev_indirect_births_close(vdev_indirect_births_t *vib)
        if (vib->vib_phys->vib_count > 0) {
                uint64_t births_size = vdev_indirect_births_size_impl(vib);
 
-               kmem_free(vib->vib_entries, births_size);
+               vmem_free(vib->vib_entries, births_size);
                vib->vib_entries = NULL;
        }
 
@@ -108,7 +108,7 @@ vdev_indirect_births_open(objset_t *os, uint64_t births_object)
 
        if (vib->vib_phys->vib_count > 0) {
                uint64_t births_size = vdev_indirect_births_size_impl(vib);
-               vib->vib_entries = kmem_alloc(births_size, KM_SLEEP);
+               vib->vib_entries = vmem_alloc(births_size, KM_SLEEP);
                VERIFY0(dmu_read(vib->vib_objset, vib->vib_object, 0,
                    births_size, vib->vib_entries, DMU_READ_PREFETCH));
        }
@@ -148,10 +148,10 @@ vdev_indirect_births_add_entry(vdev_indirect_births_t *vib,
        vib->vib_phys->vib_count++;
        new_size = vdev_indirect_births_size_impl(vib);
 
-       new_entries = kmem_alloc(new_size, KM_SLEEP);
+       new_entries = vmem_alloc(new_size, KM_SLEEP);
        if (old_size > 0) {
                bcopy(vib->vib_entries, new_entries, old_size);
-               kmem_free(vib->vib_entries, old_size);
+               vmem_free(vib->vib_entries, old_size);
        }
        new_entries[vib->vib_phys->vib_count - 1] = vibe;
        vib->vib_entries = new_entries;