Skip to content

Commit

Permalink
Fix stack noinline
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
behlendorf committed Aug 31, 2010
1 parent 18a89ba commit 60948de
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
6 changes: 6 additions & 0 deletions lib/libzpool/include/sys/zfs_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ extern "C" {
#include <sys/sysevent/dev.h>
#include <sys/sunddi.h>

/*
* Stack
*/

#define noinline __attribute__((noinline))

/*
* Debugging
*/
Expand Down
12 changes: 10 additions & 2 deletions module/zfs/dbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions module/zfs/dmu_send.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand All @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 60948de

Please sign in to comment.