mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
Change KM_PUSHPAGE -> KM_SLEEP
By marking DMU transaction processing contexts with PF_FSTRANS we can revert the KM_PUSHPAGE -> KM_SLEEP changes. This brings us back in line with upstream. In some cases this means simply swapping the flags back. For others fnvlist_alloc() was replaced by nvlist_alloc(..., KM_PUSHPAGE) and must be reverted back to fnvlist_alloc() which assumes KM_SLEEP. The one place KM_PUSHPAGE is kept is when allocating ARC buffers which allows us to dip in to reserved memory. This is again the same as upstream. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
+38
-38
@@ -170,7 +170,7 @@ spa_prop_add_list(nvlist_t *nvl, zpool_prop_t prop, char *strval,
|
||||
const char *propname = zpool_prop_to_name(prop);
|
||||
nvlist_t *propval;
|
||||
|
||||
VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_uint64(propval, ZPROP_SOURCE, src) == 0);
|
||||
|
||||
if (strval != NULL)
|
||||
@@ -285,7 +285,7 @@ spa_prop_get(spa_t *spa, nvlist_t **nvp)
|
||||
zap_attribute_t za;
|
||||
int err;
|
||||
|
||||
err = nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_PUSHPAGE);
|
||||
err = nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP);
|
||||
if (err)
|
||||
return (err);
|
||||
|
||||
@@ -337,7 +337,7 @@ spa_prop_get(spa_t *spa, nvlist_t **nvp)
|
||||
|
||||
strval = kmem_alloc(
|
||||
MAXNAMELEN + strlen(MOS_DIR_NAME) + 1,
|
||||
KM_PUSHPAGE);
|
||||
KM_SLEEP);
|
||||
dsl_dataset_name(ds, strval);
|
||||
dsl_dataset_rele(ds, FTAG);
|
||||
dsl_pool_config_exit(dp, FTAG);
|
||||
@@ -356,7 +356,7 @@ spa_prop_get(spa_t *spa, nvlist_t **nvp)
|
||||
|
||||
case 1:
|
||||
/* string property */
|
||||
strval = kmem_alloc(za.za_num_integers, KM_PUSHPAGE);
|
||||
strval = kmem_alloc(za.za_num_integers, KM_SLEEP);
|
||||
err = zap_lookup(mos, spa->spa_pool_props_object,
|
||||
za.za_name, 1, za.za_num_integers, strval);
|
||||
if (err) {
|
||||
@@ -609,7 +609,7 @@ spa_configfile_set(spa_t *spa, nvlist_t *nvp, boolean_t need_sync)
|
||||
return;
|
||||
|
||||
dp = kmem_alloc(sizeof (spa_config_dirent_t),
|
||||
KM_PUSHPAGE);
|
||||
KM_SLEEP);
|
||||
|
||||
if (cachefile[0] == '\0')
|
||||
dp->scd_path = spa_strdup(spa_config_path);
|
||||
@@ -1380,7 +1380,7 @@ spa_load_spares(spa_t *spa)
|
||||
* active configuration, then we also mark this vdev as an active spare.
|
||||
*/
|
||||
spa->spa_spares.sav_vdevs = kmem_zalloc(nspares * sizeof (void *),
|
||||
KM_PUSHPAGE);
|
||||
KM_SLEEP);
|
||||
for (i = 0; i < spa->spa_spares.sav_count; i++) {
|
||||
VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0,
|
||||
VDEV_ALLOC_SPARE) == 0);
|
||||
@@ -1428,7 +1428,7 @@ spa_load_spares(spa_t *spa)
|
||||
DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
|
||||
spares = kmem_alloc(spa->spa_spares.sav_count * sizeof (void *),
|
||||
KM_PUSHPAGE);
|
||||
KM_SLEEP);
|
||||
for (i = 0; i < spa->spa_spares.sav_count; i++)
|
||||
spares[i] = vdev_config_generate(spa,
|
||||
spa->spa_spares.sav_vdevs[i], B_TRUE, VDEV_CONFIG_SPARE);
|
||||
@@ -1462,7 +1462,7 @@ spa_load_l2cache(spa_t *spa)
|
||||
if (sav->sav_config != NULL) {
|
||||
VERIFY(nvlist_lookup_nvlist_array(sav->sav_config,
|
||||
ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0);
|
||||
newvdevs = kmem_alloc(nl2cache * sizeof (void *), KM_PUSHPAGE);
|
||||
newvdevs = kmem_alloc(nl2cache * sizeof (void *), KM_SLEEP);
|
||||
} else {
|
||||
nl2cache = 0;
|
||||
newvdevs = NULL;
|
||||
@@ -1557,7 +1557,7 @@ spa_load_l2cache(spa_t *spa)
|
||||
VERIFY(nvlist_remove(sav->sav_config, ZPOOL_CONFIG_L2CACHE,
|
||||
DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
|
||||
l2cache = kmem_alloc(sav->sav_count * sizeof (void *), KM_PUSHPAGE);
|
||||
l2cache = kmem_alloc(sav->sav_count * sizeof (void *), KM_SLEEP);
|
||||
for (i = 0; i < sav->sav_count; i++)
|
||||
l2cache[i] = vdev_config_generate(spa,
|
||||
sav->sav_vdevs[i], B_TRUE, VDEV_CONFIG_L2CACHE);
|
||||
@@ -1586,7 +1586,7 @@ load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value)
|
||||
nvsize = *(uint64_t *)db->db_data;
|
||||
dmu_buf_rele(db, FTAG);
|
||||
|
||||
packed = kmem_alloc(nvsize, KM_PUSHPAGE);
|
||||
packed = kmem_alloc(nvsize, KM_SLEEP);
|
||||
error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed,
|
||||
DMU_READ_PREFETCH);
|
||||
if (error == 0)
|
||||
@@ -1643,8 +1643,8 @@ spa_config_valid(spa_t *spa, nvlist_t *config)
|
||||
uint64_t idx = 0;
|
||||
|
||||
child = kmem_alloc(rvd->vdev_children * sizeof (nvlist_t **),
|
||||
KM_PUSHPAGE);
|
||||
VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP);
|
||||
VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
|
||||
for (c = 0; c < rvd->vdev_children; c++) {
|
||||
vdev_t *tvd = rvd->vdev_child[c];
|
||||
@@ -2037,7 +2037,7 @@ spa_try_repair(spa_t *spa, nvlist_t *config)
|
||||
&glist, &gcount) != 0)
|
||||
return;
|
||||
|
||||
vd = kmem_zalloc(gcount * sizeof (vdev_t *), KM_PUSHPAGE);
|
||||
vd = kmem_zalloc(gcount * sizeof (vdev_t *), KM_SLEEP);
|
||||
|
||||
/* attempt to online all the vdevs & validate */
|
||||
attempt_reopen = B_TRUE;
|
||||
@@ -2123,7 +2123,7 @@ spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type,
|
||||
if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_SPLIT,
|
||||
&nvl) == 0) {
|
||||
VERIFY(nvlist_dup(nvl, &spa->spa_config_splitting,
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
}
|
||||
|
||||
nvlist_free(spa->spa_load_info);
|
||||
@@ -3010,7 +3010,7 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy,
|
||||
*/
|
||||
if (config != NULL && spa->spa_config) {
|
||||
VERIFY(nvlist_dup(spa->spa_config, config,
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist(*config,
|
||||
ZPOOL_CONFIG_LOAD_INFO,
|
||||
spa->spa_load_info) == 0);
|
||||
@@ -3434,13 +3434,13 @@ spa_set_aux_vdevs(spa_aux_vdev_t *sav, nvlist_t **devs, int ndevs,
|
||||
&olddevs, &oldndevs) == 0);
|
||||
|
||||
newdevs = kmem_alloc(sizeof (void *) *
|
||||
(ndevs + oldndevs), KM_PUSHPAGE);
|
||||
(ndevs + oldndevs), KM_SLEEP);
|
||||
for (i = 0; i < oldndevs; i++)
|
||||
VERIFY(nvlist_dup(olddevs[i], &newdevs[i],
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
for (i = 0; i < ndevs; i++)
|
||||
VERIFY(nvlist_dup(devs[i], &newdevs[i + oldndevs],
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
|
||||
VERIFY(nvlist_remove(sav->sav_config, config,
|
||||
DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
@@ -3455,7 +3455,7 @@ spa_set_aux_vdevs(spa_aux_vdev_t *sav, nvlist_t **devs, int ndevs,
|
||||
* Generate a new dev list.
|
||||
*/
|
||||
VERIFY(nvlist_alloc(&sav->sav_config, NV_UNIQUE_NAME,
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(sav->sav_config, config,
|
||||
devs, ndevs) == 0);
|
||||
}
|
||||
@@ -3610,7 +3610,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
|
||||
&spares, &nspares) == 0) {
|
||||
VERIFY(nvlist_alloc(&spa->spa_spares.sav_config, NV_UNIQUE_NAME,
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config,
|
||||
ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
|
||||
spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
|
||||
@@ -3625,7 +3625,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_L2CACHE,
|
||||
&l2cache, &nl2cache) == 0) {
|
||||
VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config,
|
||||
NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config,
|
||||
ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0);
|
||||
spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
|
||||
@@ -3766,7 +3766,7 @@ spa_generate_rootconf(char *devpath, char *devid, uint64_t *guid)
|
||||
/*
|
||||
* Put this pool's top-level vdevs into a root vdev.
|
||||
*/
|
||||
VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_string(nvroot, ZPOOL_CONFIG_TYPE,
|
||||
VDEV_TYPE_ROOT) == 0);
|
||||
VERIFY(nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) == 0);
|
||||
@@ -4074,7 +4074,7 @@ spa_import(char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags)
|
||||
ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
else
|
||||
VERIFY(nvlist_alloc(&spa->spa_spares.sav_config,
|
||||
NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(spa->spa_spares.sav_config,
|
||||
ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
|
||||
spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
|
||||
@@ -4089,7 +4089,7 @@ spa_import(char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags)
|
||||
ZPOOL_CONFIG_L2CACHE, DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
else
|
||||
VERIFY(nvlist_alloc(&spa->spa_l2cache.sav_config,
|
||||
NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_nvlist_array(spa->spa_l2cache.sav_config,
|
||||
ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache) == 0);
|
||||
spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
|
||||
@@ -4180,7 +4180,7 @@ spa_tryimport(nvlist_t *tryconfig)
|
||||
* pools are bootable.
|
||||
*/
|
||||
if ((!error || error == EEXIST) && spa->spa_bootfs) {
|
||||
char *tmpname = kmem_alloc(MAXPATHLEN, KM_PUSHPAGE);
|
||||
char *tmpname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
|
||||
|
||||
/*
|
||||
* We have to play games with the name since the
|
||||
@@ -4191,7 +4191,7 @@ spa_tryimport(nvlist_t *tryconfig)
|
||||
char *cp;
|
||||
char *dsname;
|
||||
|
||||
dsname = kmem_alloc(MAXPATHLEN, KM_PUSHPAGE);
|
||||
dsname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
|
||||
|
||||
cp = strchr(tmpname, '/');
|
||||
if (cp == NULL) {
|
||||
@@ -4596,7 +4596,7 @@ spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
|
||||
if (strcmp(oldvd->vdev_path, newvd->vdev_path) == 0) {
|
||||
spa_strfree(oldvd->vdev_path);
|
||||
oldvd->vdev_path = kmem_alloc(strlen(newvd->vdev_path) + 5,
|
||||
KM_PUSHPAGE);
|
||||
KM_SLEEP);
|
||||
(void) sprintf(oldvd->vdev_path, "%s/%s",
|
||||
newvd->vdev_path, "old");
|
||||
if (oldvd->vdev_devid != NULL) {
|
||||
@@ -4992,8 +4992,8 @@ spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
|
||||
nvlist_lookup_nvlist(nvl, ZPOOL_CONFIG_L2CACHE, &tmp) == 0)
|
||||
return (spa_vdev_exit(spa, NULL, txg, EINVAL));
|
||||
|
||||
vml = kmem_zalloc(children * sizeof (vdev_t *), KM_PUSHPAGE);
|
||||
glist = kmem_zalloc(children * sizeof (uint64_t), KM_PUSHPAGE);
|
||||
vml = kmem_zalloc(children * sizeof (vdev_t *), KM_SLEEP);
|
||||
glist = kmem_zalloc(children * sizeof (uint64_t), KM_SLEEP);
|
||||
|
||||
/* then, loop over each vdev and validate it */
|
||||
for (c = 0; c < children; c++) {
|
||||
@@ -5073,7 +5073,7 @@ spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
|
||||
* Temporarily record the splitting vdevs in the spa config. This
|
||||
* will disappear once the config is regenerated.
|
||||
*/
|
||||
VERIFY(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
VERIFY(nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_uint64_array(nvl, ZPOOL_CONFIG_SPLIT_LIST,
|
||||
glist, children) == 0);
|
||||
kmem_free(glist, children * sizeof (uint64_t));
|
||||
@@ -5120,7 +5120,7 @@ spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
|
||||
/* if that worked, generate a real config for the new pool */
|
||||
if (newspa->spa_root_vdev != NULL) {
|
||||
VERIFY(nvlist_alloc(&newspa->spa_config_splitting,
|
||||
NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
VERIFY(nvlist_add_uint64(newspa->spa_config_splitting,
|
||||
ZPOOL_CONFIG_SPLIT_GUID, spa_guid(spa)) == 0);
|
||||
spa_config_set(newspa, spa_config_generate(newspa, NULL, -1ULL,
|
||||
@@ -5231,12 +5231,12 @@ spa_vdev_remove_aux(nvlist_t *config, char *name, nvlist_t **dev, int count,
|
||||
int i, j;
|
||||
|
||||
if (count > 1)
|
||||
newdev = kmem_alloc((count - 1) * sizeof (void *), KM_PUSHPAGE);
|
||||
newdev = kmem_alloc((count - 1) * sizeof (void *), KM_SLEEP);
|
||||
|
||||
for (i = 0, j = 0; i < count; i++) {
|
||||
if (dev[i] == dev_to_remove)
|
||||
continue;
|
||||
VERIFY(nvlist_dup(dev[i], &newdev[j++], KM_PUSHPAGE) == 0);
|
||||
VERIFY(nvlist_dup(dev[i], &newdev[j++], KM_SLEEP) == 0);
|
||||
}
|
||||
|
||||
VERIFY(nvlist_remove(config, name, DATA_TYPE_NVLIST_ARRAY) == 0);
|
||||
@@ -5910,10 +5910,10 @@ spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx)
|
||||
* saves us a pre-read to get data we don't actually care about.
|
||||
*/
|
||||
bufsize = P2ROUNDUP((uint64_t)nvsize, SPA_CONFIG_BLOCKSIZE);
|
||||
packed = vmem_alloc(bufsize, KM_PUSHPAGE);
|
||||
packed = vmem_alloc(bufsize, KM_SLEEP);
|
||||
|
||||
VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR,
|
||||
KM_PUSHPAGE) == 0);
|
||||
KM_SLEEP) == 0);
|
||||
bzero(packed + nvsize, bufsize - nvsize);
|
||||
|
||||
dmu_write(spa->spa_meta_objset, obj, 0, bufsize, packed, tx);
|
||||
@@ -5951,11 +5951,11 @@ spa_sync_aux_dev(spa_t *spa, spa_aux_vdev_t *sav, dmu_tx_t *tx,
|
||||
&sav->sav_object, tx) == 0);
|
||||
}
|
||||
|
||||
VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_PUSHPAGE) == 0);
|
||||
VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
|
||||
if (sav->sav_count == 0) {
|
||||
VERIFY(nvlist_add_nvlist_array(nvroot, config, NULL, 0) == 0);
|
||||
} else {
|
||||
list = kmem_alloc(sav->sav_count*sizeof (void *), KM_PUSHPAGE);
|
||||
list = kmem_alloc(sav->sav_count*sizeof (void *), KM_SLEEP);
|
||||
for (i = 0; i < sav->sav_count; i++)
|
||||
list[i] = vdev_config_generate(spa, sav->sav_vdevs[i],
|
||||
B_FALSE, VDEV_CONFIG_L2CACHE);
|
||||
@@ -6283,7 +6283,7 @@ spa_sync(spa_t *spa, uint64_t txg)
|
||||
spa->spa_sync_starttime = gethrtime();
|
||||
taskq_cancel_id(system_taskq, spa->spa_deadman_tqid);
|
||||
spa->spa_deadman_tqid = taskq_dispatch_delay(system_taskq,
|
||||
spa_deadman, spa, TQ_PUSHPAGE, ddi_get_lbolt() +
|
||||
spa_deadman, spa, TQ_SLEEP, ddi_get_lbolt() +
|
||||
NSEC_TO_TICK(spa->spa_deadman_synctime));
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user