Add fix-stack-noinline topic branch
Certain function must never be automatically inlined by gcc because they are stack heavy or called recursively. This patch flags all such functions I have found as 'noinline' to prevent gcc from making the optimization.
This commit is contained in:
parent
428870ff73
commit
bbdb8184ec
|
@ -0,0 +1,9 @@
|
||||||
|
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>
|
|
@ -77,6 +77,12 @@ extern "C" {
|
||||||
#include <sys/sysevent/dev.h>
|
#include <sys/sysevent/dev.h>
|
||||||
#include <sys/sunddi.h>
|
#include <sys/sunddi.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stack
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define noinline __attribute__((noinline))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging
|
* Debugging
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2085,7 +2085,11 @@ 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)
|
dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
dmu_buf_impl_t *db = dr->dr_dbuf;
|
dmu_buf_impl_t *db = dr->dr_dbuf;
|
||||||
|
@ -2125,7 +2129,11 @@ dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
|
||||||
zio_nowait(zio);
|
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)
|
dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
arc_buf_t **datap = &dr->dt.dl.dr_data;
|
arc_buf_t **datap = &dr->dt.dl.dr_data;
|
||||||
|
|
|
@ -921,7 +921,7 @@ restore_read(struct restorearg *ra, int len)
|
||||||
return (rv);
|
return (rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
noinline static void
|
||||||
backup_byteswap(dmu_replay_record_t *drr)
|
backup_byteswap(dmu_replay_record_t *drr)
|
||||||
{
|
{
|
||||||
#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
|
#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
|
||||||
|
@ -1001,7 +1001,7 @@ backup_byteswap(dmu_replay_record_t *drr)
|
||||||
#undef DO32
|
#undef DO32
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
noinline static int
|
||||||
restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
|
restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -1085,7 +1085,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static int
|
noinline static int
|
||||||
restore_freeobjects(struct restorearg *ra, objset_t *os,
|
restore_freeobjects(struct restorearg *ra, objset_t *os,
|
||||||
struct drr_freeobjects *drrfo)
|
struct drr_freeobjects *drrfo)
|
||||||
{
|
{
|
||||||
|
@ -1109,7 +1109,7 @@ restore_freeobjects(struct restorearg *ra, objset_t *os,
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
noinline static int
|
||||||
restore_write(struct restorearg *ra, objset_t *os,
|
restore_write(struct restorearg *ra, objset_t *os,
|
||||||
struct drr_write *drrw)
|
struct drr_write *drrw)
|
||||||
{
|
{
|
||||||
|
@ -1254,7 +1254,7 @@ restore_spill(struct restorearg *ra, objset_t *os, struct drr_spill *drrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static int
|
noinline static int
|
||||||
restore_free(struct restorearg *ra, objset_t *os,
|
restore_free(struct restorearg *ra, objset_t *os,
|
||||||
struct drr_free *drrf)
|
struct drr_free *drrf)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue