mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 19:28:53 +03:00
ZAP: Massively switch to _by_dnode() interfaces
Before this change ZAP called dnode_hold() for almost every block access, that was clearly visible in profiler under heavy load, such as BRT. This patch makes it always hold the dnode reference between zap_lockdir() and zap_unlockdir(). It allows to avoid most of dnode operations between those. It also adds several new _by_dnode() APIs to ZAP and uses them in BRT code. Also adds dmu_prefetch_by_dnode() variant and uses it in the ZAP code. After this there remains only one call to dmu_buf_dnode_enter(), which seems to be unneeded. So remove the call and the functions. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15951
This commit is contained in:
+14
-4
@@ -712,8 +712,6 @@ dmu_prefetch(objset_t *os, uint64_t object, int64_t level, uint64_t offset,
|
||||
uint64_t len, zio_priority_t pri)
|
||||
{
|
||||
dnode_t *dn;
|
||||
int64_t level2 = level;
|
||||
uint64_t start, end, start2, end2;
|
||||
|
||||
if (dmu_prefetch_max == 0 || len == 0) {
|
||||
dmu_prefetch_dnode(os, object, pri);
|
||||
@@ -723,6 +721,18 @@ dmu_prefetch(objset_t *os, uint64_t object, int64_t level, uint64_t offset,
|
||||
if (dnode_hold(os, object, FTAG, &dn) != 0)
|
||||
return;
|
||||
|
||||
dmu_prefetch_by_dnode(dn, level, offset, len, pri);
|
||||
|
||||
dnode_rele(dn, FTAG);
|
||||
}
|
||||
|
||||
void
|
||||
dmu_prefetch_by_dnode(dnode_t *dn, int64_t level, uint64_t offset,
|
||||
uint64_t len, zio_priority_t pri)
|
||||
{
|
||||
int64_t level2 = level;
|
||||
uint64_t start, end, start2, end2;
|
||||
|
||||
/*
|
||||
* Depending on len we may do two prefetches: blocks [start, end) at
|
||||
* level, and following blocks [start2, end2) at higher level2.
|
||||
@@ -762,8 +772,6 @@ dmu_prefetch(objset_t *os, uint64_t object, int64_t level, uint64_t offset,
|
||||
for (uint64_t i = start2; i < end2; i++)
|
||||
dbuf_prefetch(dn, level2, i, pri, 0);
|
||||
rw_exit(&dn->dn_struct_rwlock);
|
||||
|
||||
dnode_rele(dn, FTAG);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2563,6 +2571,8 @@ EXPORT_SYMBOL(dmu_bonus_hold_by_dnode);
|
||||
EXPORT_SYMBOL(dmu_buf_hold_array_by_bonus);
|
||||
EXPORT_SYMBOL(dmu_buf_rele_array);
|
||||
EXPORT_SYMBOL(dmu_prefetch);
|
||||
EXPORT_SYMBOL(dmu_prefetch_by_dnode);
|
||||
EXPORT_SYMBOL(dmu_prefetch_dnode);
|
||||
EXPORT_SYMBOL(dmu_free_range);
|
||||
EXPORT_SYMBOL(dmu_free_long_range);
|
||||
EXPORT_SYMBOL(dmu_free_long_object);
|
||||
|
||||
Reference in New Issue
Block a user