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: Yan, Zheng <zyan@redhat.com>
This commit is contained in:
parent
a22bd5ffae
commit
774a6a118c
|
@ -849,12 +849,14 @@ int __ceph_caps_used(struct ceph_inode_info *ci)
|
|||
*/
|
||||
int __ceph_caps_file_wanted(struct ceph_inode_info *ci)
|
||||
{
|
||||
int want = 0;
|
||||
int mode;
|
||||
for (mode = 0; mode < CEPH_FILE_MODE_NUM; mode++)
|
||||
if (ci->i_nr_by_mode[mode])
|
||||
want |= ceph_caps_for_mode(mode);
|
||||
return want;
|
||||
int i, bits = 0;
|
||||
for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
|
||||
if (ci->i_nr_by_mode[i])
|
||||
bits |= 1 << i;
|
||||
}
|
||||
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)
|
|||
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,
|
||||
* 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)
|
|||
*/
|
||||
void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
|
||||
{
|
||||
struct inode *inode = &ci->vfs_inode;
|
||||
int last = 0;
|
||||
|
||||
int i, last = 0;
|
||||
int bits = (fmode << 1) | 1;
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
dout("put_fmode %p fmode %d %d -> %d\n", inode, fmode,
|
||||
ci->i_nr_by_mode[fmode], ci->i_nr_by_mode[fmode]-1);
|
||||
BUG_ON(ci->i_nr_by_mode[fmode] == 0);
|
||||
if (--ci->i_nr_by_mode[fmode] == 0)
|
||||
last++;
|
||||
for (i = 0; i < CEPH_FILE_MODE_BITS; i++) {
|
||||
if (bits & (1 << i)) {
|
||||
BUG_ON(ci->i_nr_by_mode[i] == 0);
|
||||
if (--ci->i_nr_by_mode[i] == 0)
|
||||
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);
|
||||
|
||||
if (last && ci->i_vino.snap == CEPH_NOSNAP)
|
||||
|
|
|
@ -477,7 +477,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
|
|||
ci->i_head_snapc = NULL;
|
||||
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;
|
||||
|
||||
mutex_init(&ci->i_truncate_mutex);
|
||||
|
|
|
@ -250,9 +250,8 @@ static long ceph_ioctl_lazyio(struct file *file)
|
|||
|
||||
if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) {
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
ci->i_nr_by_mode[fi->fmode]--;
|
||||
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);
|
||||
dout("ioctl_layzio: file %p marked lazy\n", file);
|
||||
|
||||
|
|
|
@ -321,7 +321,7 @@ struct ceph_inode_info {
|
|||
dirty|flushing caps */
|
||||
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;
|
||||
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,
|
|||
loff_t endoff, int *got, struct page **pinned_page);
|
||||
|
||||
/* for counting open files by mode */
|
||||
static inline void __ceph_get_fmode(struct ceph_inode_info *ci, int mode)
|
||||
{
|
||||
ci->i_nr_by_mode[mode]++;
|
||||
}
|
||||
extern void __ceph_get_fmode(struct ceph_inode_info *ci, int mode);
|
||||
extern void ceph_put_fmode(struct ceph_inode_info *ci, int mode);
|
||||
|
||||
/* addr.c */
|
||||
|
|
|
@ -525,7 +525,7 @@ struct ceph_filelock {
|
|||
#define CEPH_FILE_MODE_WR 2
|
||||
#define CEPH_FILE_MODE_RDWR 3 /* RD | WR */
|
||||
#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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue