mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Remove UIO_ZEROCOPY functions structures
The original xuio zero copy functionality has always been unused on Linux and FreeBSD. Remove this disabled code to avoid any confusion and improve readability. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Signed-off-by: Matt Macy <mmacy@FreeBSD.org> Closes #11124
This commit is contained in:
committed by
Tony Hutter
parent
3fcf17e69d
commit
6f59f6402d
@@ -2617,11 +2617,9 @@ dbuf_assign_arcbuf(dmu_buf_impl_t *db, arc_buf_t *buf, dmu_tx_t *tx)
|
||||
(void) dbuf_dirty(db, tx);
|
||||
bcopy(buf->b_data, db->db.db_data, db->db.db_size);
|
||||
arc_buf_destroy(buf, db);
|
||||
xuio_stat_wbuf_copied();
|
||||
return;
|
||||
}
|
||||
|
||||
xuio_stat_wbuf_nocopy();
|
||||
if (db->db_state == DB_CACHED) {
|
||||
dbuf_dirty_record_t *dr = list_head(&db->db_dirty_records);
|
||||
|
||||
|
||||
@@ -1169,165 +1169,12 @@ dmu_redact(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
|
||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||
}
|
||||
|
||||
/*
|
||||
* DMU support for xuio
|
||||
*/
|
||||
kstat_t *xuio_ksp = NULL;
|
||||
|
||||
typedef struct xuio_stats {
|
||||
/* loaned yet not returned arc_buf */
|
||||
kstat_named_t xuiostat_onloan_rbuf;
|
||||
kstat_named_t xuiostat_onloan_wbuf;
|
||||
/* whether a copy is made when loaning out a read buffer */
|
||||
kstat_named_t xuiostat_rbuf_copied;
|
||||
kstat_named_t xuiostat_rbuf_nocopy;
|
||||
/* whether a copy is made when assigning a write buffer */
|
||||
kstat_named_t xuiostat_wbuf_copied;
|
||||
kstat_named_t xuiostat_wbuf_nocopy;
|
||||
} xuio_stats_t;
|
||||
|
||||
static xuio_stats_t xuio_stats = {
|
||||
{ "onloan_read_buf", KSTAT_DATA_UINT64 },
|
||||
{ "onloan_write_buf", KSTAT_DATA_UINT64 },
|
||||
{ "read_buf_copied", KSTAT_DATA_UINT64 },
|
||||
{ "read_buf_nocopy", KSTAT_DATA_UINT64 },
|
||||
{ "write_buf_copied", KSTAT_DATA_UINT64 },
|
||||
{ "write_buf_nocopy", KSTAT_DATA_UINT64 }
|
||||
};
|
||||
|
||||
#define XUIOSTAT_INCR(stat, val) \
|
||||
atomic_add_64(&xuio_stats.stat.value.ui64, (val))
|
||||
#define XUIOSTAT_BUMP(stat) XUIOSTAT_INCR(stat, 1)
|
||||
|
||||
#ifdef HAVE_UIO_ZEROCOPY
|
||||
int
|
||||
dmu_xuio_init(xuio_t *xuio, int nblk)
|
||||
{
|
||||
dmu_xuio_t *priv;
|
||||
uio_t *uio = &xuio->xu_uio;
|
||||
|
||||
uio->uio_iovcnt = nblk;
|
||||
uio->uio_iov = kmem_zalloc(nblk * sizeof (iovec_t), KM_SLEEP);
|
||||
|
||||
priv = kmem_zalloc(sizeof (dmu_xuio_t), KM_SLEEP);
|
||||
priv->cnt = nblk;
|
||||
priv->bufs = kmem_zalloc(nblk * sizeof (arc_buf_t *), KM_SLEEP);
|
||||
priv->iovp = (iovec_t *)uio->uio_iov;
|
||||
XUIO_XUZC_PRIV(xuio) = priv;
|
||||
|
||||
if (XUIO_XUZC_RW(xuio) == UIO_READ)
|
||||
XUIOSTAT_INCR(xuiostat_onloan_rbuf, nblk);
|
||||
else
|
||||
XUIOSTAT_INCR(xuiostat_onloan_wbuf, nblk);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
dmu_xuio_fini(xuio_t *xuio)
|
||||
{
|
||||
dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
|
||||
int nblk = priv->cnt;
|
||||
|
||||
kmem_free(priv->iovp, nblk * sizeof (iovec_t));
|
||||
kmem_free(priv->bufs, nblk * sizeof (arc_buf_t *));
|
||||
kmem_free(priv, sizeof (dmu_xuio_t));
|
||||
|
||||
if (XUIO_XUZC_RW(xuio) == UIO_READ)
|
||||
XUIOSTAT_INCR(xuiostat_onloan_rbuf, -nblk);
|
||||
else
|
||||
XUIOSTAT_INCR(xuiostat_onloan_wbuf, -nblk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize iov[priv->next] and priv->bufs[priv->next] with { off, n, abuf }
|
||||
* and increase priv->next by 1.
|
||||
*/
|
||||
int
|
||||
dmu_xuio_add(xuio_t *xuio, arc_buf_t *abuf, offset_t off, size_t n)
|
||||
{
|
||||
struct iovec *iov;
|
||||
uio_t *uio = &xuio->xu_uio;
|
||||
dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
|
||||
int i = priv->next++;
|
||||
|
||||
ASSERT(i < priv->cnt);
|
||||
ASSERT(off + n <= arc_buf_lsize(abuf));
|
||||
iov = (iovec_t *)uio->uio_iov + i;
|
||||
iov->iov_base = (char *)abuf->b_data + off;
|
||||
iov->iov_len = n;
|
||||
priv->bufs[i] = abuf;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
dmu_xuio_cnt(xuio_t *xuio)
|
||||
{
|
||||
dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
|
||||
return (priv->cnt);
|
||||
}
|
||||
|
||||
arc_buf_t *
|
||||
dmu_xuio_arcbuf(xuio_t *xuio, int i)
|
||||
{
|
||||
dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
|
||||
|
||||
ASSERT(i < priv->cnt);
|
||||
return (priv->bufs[i]);
|
||||
}
|
||||
|
||||
void
|
||||
dmu_xuio_clear(xuio_t *xuio, int i)
|
||||
{
|
||||
dmu_xuio_t *priv = XUIO_XUZC_PRIV(xuio);
|
||||
|
||||
ASSERT(i < priv->cnt);
|
||||
priv->bufs[i] = NULL;
|
||||
}
|
||||
#endif /* HAVE_UIO_ZEROCOPY */
|
||||
|
||||
static void
|
||||
xuio_stat_init(void)
|
||||
{
|
||||
xuio_ksp = kstat_create("zfs", 0, "xuio_stats", "misc",
|
||||
KSTAT_TYPE_NAMED, sizeof (xuio_stats) / sizeof (kstat_named_t),
|
||||
KSTAT_FLAG_VIRTUAL);
|
||||
if (xuio_ksp != NULL) {
|
||||
xuio_ksp->ks_data = &xuio_stats;
|
||||
kstat_install(xuio_ksp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
xuio_stat_fini(void)
|
||||
{
|
||||
if (xuio_ksp != NULL) {
|
||||
kstat_delete(xuio_ksp);
|
||||
xuio_ksp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
xuio_stat_wbuf_copied(void)
|
||||
{
|
||||
XUIOSTAT_BUMP(xuiostat_wbuf_copied);
|
||||
}
|
||||
|
||||
void
|
||||
xuio_stat_wbuf_nocopy(void)
|
||||
{
|
||||
XUIOSTAT_BUMP(xuiostat_wbuf_nocopy);
|
||||
}
|
||||
|
||||
#ifdef _KERNEL
|
||||
int
|
||||
dmu_read_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size)
|
||||
{
|
||||
dmu_buf_t **dbp;
|
||||
int numbufs, i, err;
|
||||
#ifdef HAVE_UIO_ZEROCOPY
|
||||
xuio_t *xuio = NULL;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NB: we could do this block-at-a-time, but it's nice
|
||||
@@ -1348,21 +1195,6 @@ dmu_read_uio_dnode(dnode_t *dn, uio_t *uio, uint64_t size)
|
||||
bufoff = uio_offset(uio) - db->db_offset;
|
||||
tocpy = MIN(db->db_size - bufoff, size);
|
||||
|
||||
#ifdef HAVE_UIO_ZEROCOPY
|
||||
if (xuio) {
|
||||
dmu_buf_impl_t *dbi = (dmu_buf_impl_t *)db;
|
||||
arc_buf_t *dbuf_abuf = dbi->db_buf;
|
||||
arc_buf_t *abuf = dbuf_loan_arcbuf(dbi);
|
||||
err = dmu_xuio_add(xuio, abuf, bufoff, tocpy);
|
||||
if (!err)
|
||||
uio_advance(uio, tocpy);
|
||||
|
||||
if (abuf == dbuf_abuf)
|
||||
XUIOSTAT_BUMP(xuiostat_rbuf_nocopy);
|
||||
else
|
||||
XUIOSTAT_BUMP(xuiostat_rbuf_copied);
|
||||
} else
|
||||
#endif
|
||||
#ifdef __FreeBSD__
|
||||
err = vn_io_fault_uiomove((char *)db->db_data + bufoff,
|
||||
tocpy, uio);
|
||||
@@ -1602,7 +1434,6 @@ dmu_assign_arcbuf_by_dnode(dnode_t *dn, uint64_t offset, arc_buf_t *buf,
|
||||
dbuf_rele(db, FTAG);
|
||||
dmu_write(os, object, offset, blksz, buf->b_data, tx);
|
||||
dmu_return_arcbuf(buf);
|
||||
XUIOSTAT_BUMP(xuiostat_wbuf_copied);
|
||||
}
|
||||
|
||||
return (0);
|
||||
@@ -2414,7 +2245,6 @@ dmu_init(void)
|
||||
abd_init();
|
||||
zfs_dbgmsg_init();
|
||||
sa_cache_init();
|
||||
xuio_stat_init();
|
||||
dmu_objset_init();
|
||||
dnode_init();
|
||||
zfetch_init();
|
||||
@@ -2434,7 +2264,6 @@ dmu_fini(void)
|
||||
dbuf_fini();
|
||||
dnode_fini();
|
||||
dmu_objset_fini();
|
||||
xuio_stat_fini();
|
||||
sa_cache_fini();
|
||||
zfs_dbgmsg_fini();
|
||||
abd_fini();
|
||||
|
||||
Reference in New Issue
Block a user