#ifdef IOCB_DIRECT
struct inode *inode = file_inode(file);
struct ll_sb_info *sbi = ll_i2sbi(inode);
+ int op = LPROC_LL_HYBRID_NOSWITCH;
+ int dio_switch = false;
ENTRY;
if (!test_bit(LL_SBI_HYBRID_IO, sbi->ll_flags))
RETURN(false);
+ /* we only log hybrid IO stats if we hit the actual switching logic -
+ * not if hybrid IO is disabled or the IO was never a candidate to
+ * switch
+ */
if (iot == CIT_WRITE &&
- count >= sbi->ll_hybrid_io_write_threshold_bytes)
- RETURN(true);
+ count >= sbi->ll_hybrid_io_write_threshold_bytes) {
+ op = LPROC_LL_HYBRID_WRITESIZE_SWITCH;
+ GOTO(out, dio_switch = true);
+ }
if (iot == CIT_READ &&
- count >= sbi->ll_hybrid_io_read_threshold_bytes)
- RETURN(true);
-#endif
+ count >= sbi->ll_hybrid_io_read_threshold_bytes) {
+ op = LPROC_LL_HYBRID_READSIZE_SWITCH;
+ GOTO(out, dio_switch = true);
+ }
+
+out:
+ ll_stats_ops_tally(sbi, op, 1);
+ RETURN(dio_switch);
+#else
RETURN(false);
+#endif
}
static ssize_t
LPROC_LL_FALLOCATE,
LPROC_LL_INODE_OCOUNT,
LPROC_LL_INODE_OPCLTM,
+ LPROC_LL_HYBRID_NOSWITCH,
+ LPROC_LL_HYBRID_WRITESIZE_SWITCH,
+ LPROC_LL_HYBRID_READSIZE_SWITCH,
LPROC_LL_FILE_OPCODES
};
{ LPROC_LL_LISTXATTR, LPROCFS_TYPE_LATENCY, "listxattr" },
{ LPROC_LL_REMOVEXATTR, LPROCFS_TYPE_LATENCY, "removexattr" },
{ LPROC_LL_INODE_PERM, LPROCFS_TYPE_LATENCY, "inode_permission" },
+ /* hybrid IO switch from buffered I/O (BIO) to direct I/O (DIO) */
+ { LPROC_LL_HYBRID_NOSWITCH, LPROCFS_TYPE_REQS, "hybrid_noswitch" },
+ { LPROC_LL_HYBRID_WRITESIZE_SWITCH, LPROCFS_TYPE_REQS,
+ "hybrid_writesize_switch" },
+ { LPROC_LL_HYBRID_READSIZE_SWITCH, LPROCFS_TYPE_REQS,
+ "hybrid_readsize_switch" },
};
void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, long count)