svn commit: r337672 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Matt Macy
mmacy at FreeBSD.org
Sun Aug 12 01:29:31 UTC 2018
Author: mmacy
Date: Sun Aug 12 01:29:30 2018
New Revision: 337672
URL: https://svnweb.freebsd.org/changeset/base/337672
Log:
MFV/ZoL: Fix stack noinline
commit 60948de1ef976aabaa3630707bcc8b5867508507
Author: Brian Behlendorf <behlendorf1 at llnl.gov>
Date: Thu Aug 26 10:58:36 2010 -0700
Fix stack noinline
Certain function must never be automatically inlined by gcc because
they are stack heavy or called recursively. This patch flags all
such functions I've found as 'noinline' to prevent gcc from making
the optimization.
Signed-off-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Modified:
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c Sun Aug 12 01:17:32 2018 (r337671)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c Sun Aug 12 01:29:30 2018 (r337672)
@@ -3101,7 +3101,12 @@ dbuf_check_blkptr(dnode_t *dn, dmu_buf_impl_t *db)
}
}
-static void
+/*
+ * dbuf_sync_indirect() is called recursively from dbuf_sync_list() so it
+ * is critical the we not allow the compiler to inline this function in to
+ * dbuf_sync_list() thereby drastically bloating the stack usage.
+ */
+noinline static void
dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
{
dmu_buf_impl_t *db = dr->dr_dbuf;
@@ -3148,7 +3153,12 @@ dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *
zio_nowait(zio);
}
-static void
+/*
+ * dbuf_sync_leaf() is called recursively from dbuf_sync_list() so it is
+ * critical the we not allow the compiler to inline this function in to
+ * dbuf_sync_list() thereby drastically bloating the stack usage.
+ */
+noinline static void
dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
{
arc_buf_t **datap = &dr->dt.dl.dr_data;
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c Sun Aug 12 01:17:32 2018 (r337671)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c Sun Aug 12 01:29:30 2018 (r337672)
@@ -2002,7 +2002,7 @@ receive_read(struct receive_arg *ra, int len, void *bu
return (0);
}
-static void
+noinline static void
byteswap_record(dmu_replay_record_t *drr)
{
#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
@@ -2137,7 +2137,7 @@ save_resume_state(struct receive_writer_arg *rwa,
rwa->os->os_dsl_dataset->ds_resume_bytes[txgoff] = rwa->bytes_read;
}
-static int
+noinline static int
receive_object(struct receive_writer_arg *rwa, struct drr_object *drro,
void *data)
{
@@ -2243,7 +2243,7 @@ receive_object(struct receive_writer_arg *rwa, struct
}
/* ARGSUSED */
-static int
+noinline static int
receive_freeobjects(struct receive_writer_arg *rwa,
struct drr_freeobjects *drrfo)
{
@@ -2279,7 +2279,7 @@ receive_freeobjects(struct receive_writer_arg *rwa,
return (0);
}
-static int
+noinline static int
receive_write(struct receive_writer_arg *rwa, struct drr_write *drrw,
arc_buf_t *abuf)
{
@@ -2309,7 +2309,6 @@ receive_write(struct receive_writer_arg *rwa, struct d
return (SET_ERROR(EINVAL));
tx = dmu_tx_create(rwa->os);
-
dmu_tx_hold_write(tx, drrw->drr_object,
drrw->drr_offset, drrw->drr_logical_size);
err = dmu_tx_assign(tx, TXG_WAIT);
@@ -2500,7 +2499,7 @@ receive_spill(struct receive_writer_arg *rwa, struct d
}
/* ARGSUSED */
-static int
+noinline static int
receive_free(struct receive_writer_arg *rwa, struct drr_free *drrf)
{
int err;
More information about the svn-src-head
mailing list