Fix Large kmem_alloc in vdev_metaslab_init
This allocation can go way over 1MB, so we should use vmem_alloc instead of kmem_alloc. Large kmem_alloc(1430784, 0x1000), please file an issue... Call Trace: [<ffffffffa0324aff>] ? spl_kmem_zalloc+0xef/0x160 [spl] [<ffffffffa17d0c8d>] ? vdev_metaslab_init+0x9d/0x1f0 [zfs] [<ffffffffa17d46d0>] ? vdev_load+0xc0/0xd0 [zfs] [<ffffffffa17d4643>] ? vdev_load+0x33/0xd0 [zfs] [<ffffffffa17c0004>] ? spa_load+0xfc4/0x1b60 [zfs] [<ffffffffa17c1838>] ? spa_tryimport+0x98/0x430 [zfs] [<ffffffffa17f28b1>] ? zfs_ioc_pool_tryimport+0x41/0x80 [zfs] [<ffffffffa17f5669>] ? zfsdev_ioctl+0x4a9/0x4e0 [zfs] [<ffffffff811bacdf>] ? do_vfs_ioctl+0x2cf/0x4b0 [<ffffffff811baf41>] ? SyS_ioctl+0x81/0xa0 Signed-off-by: Chunwei Chen <david.chen@osnexus.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #4752
This commit is contained in:
parent
db3f5edcf1
commit
a77cea5f0f
|
@ -877,11 +877,11 @@ vdev_metaslab_init(vdev_t *vd, uint64_t txg)
|
||||||
|
|
||||||
ASSERT(oldc <= newc);
|
ASSERT(oldc <= newc);
|
||||||
|
|
||||||
mspp = kmem_zalloc(newc * sizeof (*mspp), KM_SLEEP);
|
mspp = vmem_zalloc(newc * sizeof (*mspp), KM_SLEEP);
|
||||||
|
|
||||||
if (oldc != 0) {
|
if (oldc != 0) {
|
||||||
bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp));
|
bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp));
|
||||||
kmem_free(vd->vdev_ms, oldc * sizeof (*mspp));
|
vmem_free(vd->vdev_ms, oldc * sizeof (*mspp));
|
||||||
}
|
}
|
||||||
|
|
||||||
vd->vdev_ms = mspp;
|
vd->vdev_ms = mspp;
|
||||||
|
@ -935,7 +935,7 @@ vdev_metaslab_fini(vdev_t *vd)
|
||||||
if (msp != NULL)
|
if (msp != NULL)
|
||||||
metaslab_fini(msp);
|
metaslab_fini(msp);
|
||||||
}
|
}
|
||||||
kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *));
|
vmem_free(vd->vdev_ms, count * sizeof (metaslab_t *));
|
||||||
vd->vdev_ms = NULL;
|
vd->vdev_ms = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue