Merge commit 'refs/top-bases/linux-zfs-branch' into linux-zfs-branch

This commit is contained in:
Brian Behlendorf 2008-12-05 12:45:47 -08:00
commit 81c25393fc
6 changed files with 38 additions and 12 deletions

View File

@ -733,8 +733,15 @@ buf_fini(void)
{ {
int i; int i;
#if defined(_KERNEL) && defined(HAVE_SPL)
/* Large allocations which do not require contiguous pages
* should be using vmem_free() in the linux kernel */
vmem_free(buf_hash_table.ht_table,
(buf_hash_table.ht_mask + 1) * sizeof (void *));
#else
kmem_free(buf_hash_table.ht_table, kmem_free(buf_hash_table.ht_table,
(buf_hash_table.ht_mask + 1) * sizeof (void *)); (buf_hash_table.ht_mask + 1) * sizeof (void *));
#endif
for (i = 0; i < BUF_LOCKS; i++) for (i = 0; i < BUF_LOCKS; i++)
mutex_destroy(&buf_hash_table.ht_locks[i].ht_lock); mutex_destroy(&buf_hash_table.ht_locks[i].ht_lock);
kmem_cache_destroy(hdr_cache); kmem_cache_destroy(hdr_cache);
@ -829,8 +836,15 @@ buf_init(void)
hsize <<= 1; hsize <<= 1;
retry: retry:
buf_hash_table.ht_mask = hsize - 1; buf_hash_table.ht_mask = hsize - 1;
#if defined(_KERNEL) && defined(HAVE_SPL)
/* Large allocations which do not require contiguous pages
* should be using vmem_alloc() in the linux kernel */
buf_hash_table.ht_table =
vmem_zalloc(hsize * sizeof (void*), KM_SLEEP);
#else
buf_hash_table.ht_table = buf_hash_table.ht_table =
kmem_zalloc(hsize * sizeof (void*), KM_NOSLEEP); kmem_zalloc(hsize * sizeof (void*), KM_NOSLEEP);
#endif
if (buf_hash_table.ht_table == NULL) { if (buf_hash_table.ht_table == NULL) {
ASSERT(hsize > (1ULL << 8)); ASSERT(hsize > (1ULL << 8));
hsize >>= 1; hsize >>= 1;

View File

@ -255,7 +255,13 @@ dbuf_init(void)
retry: retry:
h->hash_table_mask = hsize - 1; h->hash_table_mask = hsize - 1;
#if defined(_KERNEL) && defined(HAVE_SPL)
/* Large allocations which do not require contiguous pages
* should be using vmem_alloc() in the linux kernel */
h->hash_table = vmem_zalloc(hsize * sizeof (void *), KM_SLEEP);
#else
h->hash_table = kmem_zalloc(hsize * sizeof (void *), KM_NOSLEEP); h->hash_table = kmem_zalloc(hsize * sizeof (void *), KM_NOSLEEP);
#endif
if (h->hash_table == NULL) { if (h->hash_table == NULL) {
/* XXX - we should really return an error instead of assert */ /* XXX - we should really return an error instead of assert */
ASSERT(hsize > (1ULL << 10)); ASSERT(hsize > (1ULL << 10));
@ -279,7 +285,13 @@ dbuf_fini(void)
for (i = 0; i < DBUF_MUTEXES; i++) for (i = 0; i < DBUF_MUTEXES; i++)
mutex_destroy(&h->hash_mutexes[i]); mutex_destroy(&h->hash_mutexes[i]);
#if defined(_KERNEL) && defined(HAVE_SPL)
/* Large allocations which do not require contiguous pages
* should be using vmem_free() in the linux kernel */
vmem_free(h->hash_table, (h->hash_table_mask + 1) * sizeof (void *));
#else
kmem_free(h->hash_table, (h->hash_table_mask + 1) * sizeof (void *)); kmem_free(h->hash_table, (h->hash_table_mask + 1) * sizeof (void *));
#endif
kmem_cache_destroy(dbuf_cache); kmem_cache_destroy(dbuf_cache);
} }

View File

@ -1043,7 +1043,7 @@ dmu_recv_stream(dmu_recv_cookie_t *drc, int fd, offset_t *voffp)
#endif #endif
ra.voff = *voffp; ra.voff = *voffp;
ra.bufsize = 1<<20; ra.bufsize = 1<<20;
ra.buf = kmem_alloc(ra.bufsize, KM_SLEEP); ra.buf = vmem_alloc(ra.bufsize, KM_SLEEP);
/* these were verified in dmu_recv_begin */ /* these were verified in dmu_recv_begin */
ASSERT(drc->drc_drrb->drr_version == DMU_BACKUP_STREAM_VERSION); ASSERT(drc->drc_drrb->drr_version == DMU_BACKUP_STREAM_VERSION);
@ -1133,7 +1133,7 @@ out:
dmu_recv_abort_cleanup(drc); dmu_recv_abort_cleanup(drc);
} }
kmem_free(ra.buf, ra.bufsize); vmem_free(ra.buf, ra.bufsize);
*voffp = ra.voff; *voffp = ra.voff;
return (ra.err); return (ra.err);
} }

View File

@ -293,7 +293,7 @@ spa_history_log_sync(void *arg1, void *arg2, cred_t *cr, dmu_tx_t *tx)
dmu_buf_rele(dbp, FTAG); dmu_buf_rele(dbp, FTAG);
if (hap->ha_log_type == LOG_INTERNAL) { if (hap->ha_log_type == LOG_INTERNAL) {
kmem_free((void*)hap->ha_history_str, HIS_MAX_RECORD_LEN); vmem_free((void*)hap->ha_history_str, HIS_MAX_RECORD_LEN);
kmem_free(hap, sizeof (history_arg_t)); kmem_free(hap, sizeof (history_arg_t));
} }
} }
@ -419,7 +419,7 @@ spa_history_internal_log(history_internal_events_t event, spa_t *spa,
return; return;
hap = kmem_alloc(sizeof (history_arg_t), KM_SLEEP); hap = kmem_alloc(sizeof (history_arg_t), KM_SLEEP);
str = kmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP); str = vmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP);
va_start(adx, fmt); va_start(adx, fmt);
(void) vsnprintf(str, HIS_MAX_RECORD_LEN, fmt, adx); (void) vsnprintf(str, HIS_MAX_RECORD_LEN, fmt, adx);

View File

@ -49,7 +49,7 @@ txg_init(dsl_pool_t *dp, uint64_t txg)
int c; int c;
bzero(tx, sizeof (tx_state_t)); bzero(tx, sizeof (tx_state_t));
tx->tx_cpu = kmem_zalloc(max_ncpus * sizeof (tx_cpu_t), KM_SLEEP); tx->tx_cpu = vmem_zalloc(max_ncpus * sizeof (tx_cpu_t), KM_SLEEP);
for (c = 0; c < max_ncpus; c++) { for (c = 0; c < max_ncpus; c++) {
int i; int i;
@ -109,7 +109,7 @@ txg_fini(dsl_pool_t *dp)
} }
} }
kmem_free(tx->tx_cpu, max_ncpus * sizeof (tx_cpu_t)); vmem_free(tx->tx_cpu, max_ncpus * sizeof (tx_cpu_t));
bzero(tx, sizeof (tx_state_t)); bzero(tx, sizeof (tx_state_t));
} }

View File

@ -132,7 +132,7 @@ __dprintf(const char *file, const char *func, int line, const char *fmt, ...)
static void static void
history_str_free(char *buf) history_str_free(char *buf)
{ {
kmem_free(buf, HIS_MAX_RECORD_LEN); vmem_free(buf, HIS_MAX_RECORD_LEN);
} }
static char * static char *
@ -143,7 +143,7 @@ history_str_get(zfs_cmd_t *zc)
if (zc->zc_history == 0) if (zc->zc_history == 0)
return (NULL); return (NULL);
buf = kmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP); buf = vmem_alloc(HIS_MAX_RECORD_LEN, KM_SLEEP);
if (copyinstr((void *)(uintptr_t)zc->zc_history, if (copyinstr((void *)(uintptr_t)zc->zc_history,
buf, HIS_MAX_RECORD_LEN, NULL) != 0) { buf, HIS_MAX_RECORD_LEN, NULL) != 0) {
history_str_free(buf); history_str_free(buf);
@ -741,12 +741,12 @@ put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
if (size > zc->zc_nvlist_dst_size) { if (size > zc->zc_nvlist_dst_size) {
error = ENOMEM; error = ENOMEM;
} else { } else {
packed = kmem_alloc(size, KM_SLEEP); packed = vmem_alloc(size, KM_SLEEP);
VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE, VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE,
KM_SLEEP) == 0); KM_SLEEP) == 0);
error = xcopyout(packed, (void *)(uintptr_t)zc->zc_nvlist_dst, error = xcopyout(packed, (void *)(uintptr_t)zc->zc_nvlist_dst,
size); size);
kmem_free(packed, size); vmem_free(packed, size);
} }
zc->zc_nvlist_dst_size = size; zc->zc_nvlist_dst_size = size;
@ -3022,7 +3022,7 @@ zfsdev_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp)
if (vec >= sizeof (zfs_ioc_vec) / sizeof (zfs_ioc_vec[0])) if (vec >= sizeof (zfs_ioc_vec) / sizeof (zfs_ioc_vec[0]))
return (EINVAL); return (EINVAL);
zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP); zc = vmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP);
error = xcopyin((void *)arg, zc, sizeof (zfs_cmd_t)); error = xcopyin((void *)arg, zc, sizeof (zfs_cmd_t));
@ -3061,7 +3061,7 @@ zfsdev_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp)
zfs_log_history(zc); zfs_log_history(zc);
} }
kmem_free(zc, sizeof (zfs_cmd_t)); vmem_free(zc, sizeof (zfs_cmd_t));
return (error); return (error);
} }