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>
This commit is contained in:
parent
18a89ba43d
commit
60948de1ef
@ -75,6 +75,12 @@ extern "C" {
|
||||
#include <sys/sysevent/dev.h>
|
||||
#include <sys/sunddi.h>
|
||||
|
||||
/*
|
||||
* Stack
|
||||
*/
|
||||
|
||||
#define noinline __attribute__((noinline))
|
||||
|
||||
/*
|
||||
* Debugging
|
||||
*/
|
||||
|
@ -2291,7 +2291,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)
|
||||
{
|
||||
dmu_buf_impl_t *db = dr->dr_dbuf;
|
||||
@ -2334,7 +2338,11 @@ dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
|
||||
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;
|
||||
|
@ -937,7 +937,7 @@ restore_read(struct restorearg *ra, int len)
|
||||
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))
|
||||
@ -1019,7 +1019,7 @@ backup_byteswap(dmu_replay_record_t *drr)
|
||||
#undef DO32
|
||||
}
|
||||
|
||||
static int
|
||||
noinline static int
|
||||
restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
|
||||
{
|
||||
int err;
|
||||
@ -1103,7 +1103,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
noinline static int
|
||||
restore_freeobjects(struct restorearg *ra, objset_t *os,
|
||||
struct drr_freeobjects *drrfo)
|
||||
{
|
||||
@ -1127,7 +1127,7 @@ restore_freeobjects(struct restorearg *ra, objset_t *os,
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
noinline static int
|
||||
restore_write(struct restorearg *ra, objset_t *os,
|
||||
struct drr_write *drrw)
|
||||
{
|
||||
@ -1273,7 +1273,7 @@ restore_spill(struct restorearg *ra, objset_t *os, struct drr_spill *drrs)
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
noinline static int
|
||||
restore_free(struct restorearg *ra, objset_t *os,
|
||||
struct drr_free *drrf)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user