forked from Minki/linux
f2fs: merge two uchar variable in struct node_info to reduce memory cost
This patch moves one member of struct nat_entry: _flag_ to struct node_info, so _version_ in struct node_info and _flag_ which are unsigned char type will merge to one 32-bit space in register/memory. So the size of nat_entry will be reduced from 28 bytes to 24 bytes (for 64-bit machine, reduce its size from 40 bytes to 32 bytes) and then slab memory using by f2fs will be reduced. changes from v2: o update description of memory usage gain for 64-bit machine suggested by Changman Lee. changes from v1: o introduce inline copy_node_info() to copy valid data from node info suggested by Jaegeuk Kim, it can avoid bug. Reviewed-by: Changman Lee <cm224.lee@samsung.com> Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
3fa06d7bc9
commit
5c27f4ee44
@ -269,7 +269,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
|
|||||||
e = __lookup_nat_cache(nm_i, ni->nid);
|
e = __lookup_nat_cache(nm_i, ni->nid);
|
||||||
if (!e) {
|
if (!e) {
|
||||||
e = grab_nat_entry(nm_i, ni->nid);
|
e = grab_nat_entry(nm_i, ni->nid);
|
||||||
e->ni = *ni;
|
copy_node_info(&e->ni, ni);
|
||||||
f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
|
f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
|
||||||
} else if (new_blkaddr == NEW_ADDR) {
|
} else if (new_blkaddr == NEW_ADDR) {
|
||||||
/*
|
/*
|
||||||
@ -277,7 +277,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
|
|||||||
* previous nat entry can be remained in nat cache.
|
* previous nat entry can be remained in nat cache.
|
||||||
* So, reinitialize it with new information.
|
* So, reinitialize it with new information.
|
||||||
*/
|
*/
|
||||||
e->ni = *ni;
|
copy_node_info(&e->ni, ni);
|
||||||
f2fs_bug_on(sbi, ni->blk_addr != NULL_ADDR);
|
f2fs_bug_on(sbi, ni->blk_addr != NULL_ADDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,14 @@
|
|||||||
/* return value for read_node_page */
|
/* return value for read_node_page */
|
||||||
#define LOCKED_PAGE 1
|
#define LOCKED_PAGE 1
|
||||||
|
|
||||||
|
/* For flag in struct node_info */
|
||||||
|
enum {
|
||||||
|
IS_CHECKPOINTED, /* is it checkpointed before? */
|
||||||
|
HAS_FSYNCED_INODE, /* is the inode fsynced before? */
|
||||||
|
HAS_LAST_FSYNC, /* has the latest node fsync mark? */
|
||||||
|
IS_DIRTY, /* this nat entry is dirty? */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For node information
|
* For node information
|
||||||
*/
|
*/
|
||||||
@ -37,18 +45,11 @@ struct node_info {
|
|||||||
nid_t ino; /* inode number of the node's owner */
|
nid_t ino; /* inode number of the node's owner */
|
||||||
block_t blk_addr; /* block address of the node */
|
block_t blk_addr; /* block address of the node */
|
||||||
unsigned char version; /* version of the node */
|
unsigned char version; /* version of the node */
|
||||||
};
|
unsigned char flag; /* for node information bits */
|
||||||
|
|
||||||
enum {
|
|
||||||
IS_CHECKPOINTED, /* is it checkpointed before? */
|
|
||||||
HAS_FSYNCED_INODE, /* is the inode fsynced before? */
|
|
||||||
HAS_LAST_FSYNC, /* has the latest node fsync mark? */
|
|
||||||
IS_DIRTY, /* this nat entry is dirty? */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nat_entry {
|
struct nat_entry {
|
||||||
struct list_head list; /* for clean or dirty nat list */
|
struct list_head list; /* for clean or dirty nat list */
|
||||||
unsigned char flag; /* for node information bits */
|
|
||||||
struct node_info ni; /* in-memory node information */
|
struct node_info ni; /* in-memory node information */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -63,20 +64,30 @@ struct nat_entry {
|
|||||||
|
|
||||||
#define inc_node_version(version) (++version)
|
#define inc_node_version(version) (++version)
|
||||||
|
|
||||||
|
static inline void copy_node_info(struct node_info *dst,
|
||||||
|
struct node_info *src)
|
||||||
|
{
|
||||||
|
dst->nid = src->nid;
|
||||||
|
dst->ino = src->ino;
|
||||||
|
dst->blk_addr = src->blk_addr;
|
||||||
|
dst->version = src->version;
|
||||||
|
/* should not copy flag here */
|
||||||
|
}
|
||||||
|
|
||||||
static inline void set_nat_flag(struct nat_entry *ne,
|
static inline void set_nat_flag(struct nat_entry *ne,
|
||||||
unsigned int type, bool set)
|
unsigned int type, bool set)
|
||||||
{
|
{
|
||||||
unsigned char mask = 0x01 << type;
|
unsigned char mask = 0x01 << type;
|
||||||
if (set)
|
if (set)
|
||||||
ne->flag |= mask;
|
ne->ni.flag |= mask;
|
||||||
else
|
else
|
||||||
ne->flag &= ~mask;
|
ne->ni.flag &= ~mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool get_nat_flag(struct nat_entry *ne, unsigned int type)
|
static inline bool get_nat_flag(struct nat_entry *ne, unsigned int type)
|
||||||
{
|
{
|
||||||
unsigned char mask = 0x01 << type;
|
unsigned char mask = 0x01 << type;
|
||||||
return ne->flag & mask;
|
return ne->ni.flag & mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void nat_reset_flag(struct nat_entry *ne)
|
static inline void nat_reset_flag(struct nat_entry *ne)
|
||||||
|
Loading…
Reference in New Issue
Block a user