Commit 774a6a11 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov

ceph: reduce i_nr_by_mode array size

Track usage count for individual fmode bit. This can reduce the
array size by half.
Signed-off-by: default avatarYan, Zheng <zyan@redhat.com>
parent a22bd5ff
...@@ -849,12 +849,14 @@ int __ceph_caps_used(struct ceph_inode_info *ci) ...@@ -849,12 +849,14 @@ int __ceph_caps_used(struct ceph_inode_info *ci)
*/ */
int __ceph_caps_file_wanted(struct ceph_inode_info *ci) int __ceph_caps_file_wanted(struct ceph_inode_info *ci)
{ {
int want = 0; int i, bits = 0;
int mode; for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
for (mode = 0; mode < CEPH_FILE_MODE_NUM; mode++) if (ci->i_nr_by_mode[i])
if (ci->i_nr_by_mode[mode]) bits |= 1 << i;
want |= ceph_caps_for_mode(mode); }
return want; if (bits == 0)
return 0;
return ceph_caps_for_mode(bits >> 1);
} }
/* /*
...@@ -3682,6 +3684,16 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc) ...@@ -3682,6 +3684,16 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
dout("flush_dirty_caps done\n"); dout("flush_dirty_caps done\n");
} }
void __ceph_get_fmode(struct ceph_inode_info *ci, int fmode)
{
int i;
int bits = (fmode << 1) | 1;
for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
if (bits & (1 << i))
ci->i_nr_by_mode[i]++;
}
}
/* /*
* Drop open file reference. If we were the last open file, * Drop open file reference. If we were the last open file,
* we may need to release capabilities to the MDS (or schedule * we may need to release capabilities to the MDS (or schedule
...@@ -3689,15 +3701,20 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc) ...@@ -3689,15 +3701,20 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
*/ */
void ceph_put_fmode(struct ceph_inode_info *ci, int fmode) void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
{ {
struct inode *inode = &ci->vfs_inode; int i, last = 0;
int last = 0; int bits = (fmode << 1) | 1;
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
dout("put_fmode %p fmode %d %d -> %d\n", inode, fmode, for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
ci->i_nr_by_mode[fmode], ci->i_nr_by_mode[fmode]-1); if (bits & (1 << i)) {
BUG_ON(ci->i_nr_by_mode[fmode] == 0); BUG_ON(ci->i_nr_by_mode[i] == 0);
if (--ci->i_nr_by_mode[fmode] == 0) if (--ci->i_nr_by_mode[i] == 0)
last++; last++;
}
}
dout("put_fmode %p fmode %d {%d,%d,%d,%d}\n",
&ci->vfs_inode, fmode,
ci->i_nr_by_mode[0], ci->i_nr_by_mode[1],
ci->i_nr_by_mode[2], ci->i_nr_by_mode[3]);
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
if (last && ci->i_vino.snap == CEPH_NOSNAP) if (last && ci->i_vino.snap == CEPH_NOSNAP)
......
...@@ -477,7 +477,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb) ...@@ -477,7 +477,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
ci->i_head_snapc = NULL; ci->i_head_snapc = NULL;
ci->i_snap_caps = 0; ci->i_snap_caps = 0;
for (i = 0; i < CEPH_FILE_MODE_NUM; i++) for (i = 0; i < CEPH_FILE_MODE_BITS; i++)
ci->i_nr_by_mode[i] = 0; ci->i_nr_by_mode[i] = 0;
mutex_init(&ci->i_truncate_mutex); mutex_init(&ci->i_truncate_mutex);
......
...@@ -250,9 +250,8 @@ static long ceph_ioctl_lazyio(struct file *file) ...@@ -250,9 +250,8 @@ static long ceph_ioctl_lazyio(struct file *file)
if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) {
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
ci->i_nr_by_mode[fi->fmode]--;
fi->fmode |= CEPH_FILE_MODE_LAZY; fi->fmode |= CEPH_FILE_MODE_LAZY;
ci->i_nr_by_mode[fi->fmode]++; ci->i_nr_by_mode[ffs(CEPH_FILE_MODE_LAZY)]++;
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
dout("ioctl_layzio: file %p marked lazy\n", file); dout("ioctl_layzio: file %p marked lazy\n", file);
......
...@@ -321,7 +321,7 @@ struct ceph_inode_info { ...@@ -321,7 +321,7 @@ struct ceph_inode_info {
dirty|flushing caps */ dirty|flushing caps */
unsigned i_snap_caps; /* cap bits for snapped files */ unsigned i_snap_caps; /* cap bits for snapped files */
int i_nr_by_mode[CEPH_FILE_MODE_NUM]; /* open file counts */ int i_nr_by_mode[CEPH_FILE_MODE_BITS]; /* open file counts */
struct mutex i_truncate_mutex; struct mutex i_truncate_mutex;
u32 i_truncate_seq; /* last truncate to smaller size */ u32 i_truncate_seq; /* last truncate to smaller size */
...@@ -906,10 +906,7 @@ extern int ceph_get_caps(struct ceph_inode_info *ci, int need, int want, ...@@ -906,10 +906,7 @@ extern int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
loff_t endoff, int *got, struct page **pinned_page); loff_t endoff, int *got, struct page **pinned_page);
/* for counting open files by mode */ /* for counting open files by mode */
static inline void __ceph_get_fmode(struct ceph_inode_info *ci, int mode) extern void __ceph_get_fmode(struct ceph_inode_info *ci, int mode);
{
ci->i_nr_by_mode[mode]++;
}
extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode); extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode);
/* addr.c */ /* addr.c */
......
...@@ -525,7 +525,7 @@ struct ceph_filelock { ...@@ -525,7 +525,7 @@ struct ceph_filelock {
#define CEPH_FILE_MODE_WR 2 #define CEPH_FILE_MODE_WR 2
#define CEPH_FILE_MODE_RDWR 3 /* RD | WR */ #define CEPH_FILE_MODE_RDWR 3 /* RD | WR */
#define CEPH_FILE_MODE_LAZY 4 /* lazy io */ #define CEPH_FILE_MODE_LAZY 4 /* lazy io */
#define CEPH_FILE_MODE_NUM 8 /* bc these are bit fields.. mostly */ #define CEPH_FILE_MODE_BITS 4
int ceph_flags_to_mode(int flags); int ceph_flags_to_mode(int flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment