--- /dev/null
+From: Brian Behlendorf <behlendorf1@llnl.gov>
+Subject: [PATCH] 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@llnl.gov>
#include <sys/sysevent/dev.h>
#include <sys/sunddi.h>
+/*
+ * Stack
+ */
+
+#define noinline __attribute__((noinline))
+
/*
* Debugging
*/
}
}
-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;
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;
return (rv);
}
-static void
+noinline static void
backup_byteswap(dmu_replay_record_t *drr)
{
#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
#undef DO32
}
-static int
+noinline static int
restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
{
int err;
}
/* ARGSUSED */
-static int
+noinline static int
restore_freeobjects(struct restorearg *ra, objset_t *os,
struct drr_freeobjects *drrfo)
{
return (0);
}
-static int
+noinline static int
restore_write(struct restorearg *ra, objset_t *os,
struct drr_write *drrw)
{
}
/* ARGSUSED */
-static int
+noinline static int
restore_free(struct restorearg *ra, objset_t *os,
struct drr_free *drrf)
{