@@ -900,6 +900,21 @@ __public void libnvme_path_reset_stat(libnvme_path_t p)
900900 memset (stat , 0 , 2 * sizeof (struct libnvme_stat ));
901901}
902902
903+ static libnvme_stat_t libnvme_ns_get_stat (libnvme_ns_t n , unsigned int idx )
904+ {
905+ if (idx > 1 )
906+ return NULL ;
907+
908+ return & n -> stat [idx ];
909+ }
910+
911+ __public void libnvme_ns_reset_stat (libnvme_ns_t n )
912+ {
913+ libnvme_stat_t stat = & n -> stat [0 ];
914+
915+ memset (stat , 0 , 2 * sizeof (struct libnvme_stat ));
916+ }
917+
903918static int libnvme_update_stat (const char * sysfs_stat_path , libnvme_stat_t stat )
904919{
905920 int n ;
@@ -974,6 +989,24 @@ __public int libnvme_path_update_stat(libnvme_path_t p, bool diffstat)
974989 return libnvme_update_stat (sysfs_stat_path , stat );
975990}
976991
992+ __public int libnvme_ns_update_stat (libnvme_ns_t n , bool diffstat )
993+ {
994+ __cleanup_free char * sysfs_stat_path = NULL ;
995+ libnvme_stat_t stat ;
996+
997+ n -> diffstat = diffstat ;
998+ n -> curr_idx ^= 1 ;
999+ stat = libnvme_ns_get_stat (n , n -> curr_idx );
1000+ if (!stat )
1001+ return - EINVAL ;
1002+
1003+ sysfs_stat_path = libnvme_get_ns_attr (n , "stat" );
1004+ if (!sysfs_stat_path )
1005+ return - EINVAL ;
1006+
1007+ return libnvme_update_stat (sysfs_stat_path , stat );
1008+ }
1009+
9771010static int libnvme_stat_get_inflights (libnvme_stat_t stat )
9781011{
9791012 return stat -> inflights ;
@@ -990,6 +1023,17 @@ __public unsigned int libnvme_path_get_inflights(libnvme_path_t p)
9901023 return libnvme_stat_get_inflights (curr );
9911024}
9921025
1026+ __public unsigned int libnvme_ns_get_inflights (libnvme_ns_t n )
1027+ {
1028+ libnvme_stat_t curr ;
1029+
1030+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1031+ if (!curr )
1032+ return 0 ;
1033+
1034+ return libnvme_stat_get_inflights (curr );
1035+ }
1036+
9931037static int libnvme_stat_get_io_ticks (libnvme_stat_t curr , libnvme_stat_t prev ,
9941038 bool diffstat )
9951039{
@@ -1017,6 +1061,19 @@ __public unsigned int libnvme_path_get_io_ticks(libnvme_path_t p)
10171061 return libnvme_stat_get_io_ticks (curr , prev , p -> diffstat );
10181062}
10191063
1064+ __public unsigned int libnvme_ns_get_io_ticks (libnvme_ns_t n )
1065+ {
1066+ libnvme_stat_t curr , prev ;
1067+
1068+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1069+ prev = libnvme_ns_get_stat (n , !n -> curr_idx );
1070+
1071+ if (!curr || !prev )
1072+ return 0 ;
1073+
1074+ return libnvme_stat_get_io_ticks (curr , prev , n -> diffstat );
1075+ }
1076+
10201077static unsigned int libnvme_stat_get_ticks (libnvme_stat_t curr ,
10211078 libnvme_stat_t prev , enum libnvme_stat_group grp , bool diffstat )
10221079{
@@ -1055,6 +1112,30 @@ __public unsigned int libnvme_path_get_write_ticks(libnvme_path_t p)
10551112 return __libnvme_path_get_ticks (p , WRITE );
10561113}
10571114
1115+ static unsigned int __libnvme_ns_get_ticks (libnvme_ns_t n ,
1116+ enum libnvme_stat_group grp )
1117+ {
1118+ libnvme_stat_t curr , prev ;
1119+
1120+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1121+ prev = libnvme_ns_get_stat (n , !n -> curr_idx );
1122+
1123+ if (!curr || !prev )
1124+ return 0 ;
1125+
1126+ return libnvme_stat_get_ticks (curr , prev , grp , n -> diffstat );
1127+ }
1128+
1129+ __public unsigned int libnvme_ns_get_read_ticks (libnvme_ns_t n )
1130+ {
1131+ return __libnvme_ns_get_ticks (n , READ );
1132+ }
1133+
1134+ __public unsigned int libnvme_ns_get_write_ticks (libnvme_ns_t n )
1135+ {
1136+ return __libnvme_ns_get_ticks (n , WRITE );
1137+ }
1138+
10581139static double libnvme_stat_get_interval (libnvme_stat_t curr ,
10591140 libnvme_stat_t prev )
10601141{
@@ -1079,6 +1160,19 @@ __public double libnvme_path_get_stat_interval(libnvme_path_t p)
10791160 return libnvme_stat_get_interval (curr , prev );
10801161}
10811162
1163+ __public double libnvme_ns_get_stat_interval (libnvme_ns_t n )
1164+ {
1165+ libnvme_stat_t curr , prev ;
1166+
1167+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1168+ prev = libnvme_ns_get_stat (n , !n -> curr_idx );
1169+
1170+ if (!curr || !prev )
1171+ return 0 ;
1172+
1173+ return libnvme_stat_get_interval (curr , prev );
1174+ }
1175+
10821176static unsigned long libnvme_stat_get_ios (libnvme_stat_t curr ,
10831177 libnvme_stat_t prev , enum libnvme_stat_group grp , bool diffstat )
10841178{
@@ -1117,6 +1211,30 @@ __public unsigned long libnvme_path_get_write_ios(libnvme_path_t p)
11171211 return __libnvme_path_get_ios (p , WRITE );
11181212}
11191213
1214+ static unsigned long __libnvme_ns_get_ios (libnvme_ns_t n ,
1215+ enum libnvme_stat_group grp )
1216+ {
1217+ libnvme_stat_t curr , prev ;
1218+
1219+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1220+ prev = libnvme_ns_get_stat (n , !n -> curr_idx );
1221+
1222+ if (!curr || !prev )
1223+ return 0 ;
1224+
1225+ return libnvme_stat_get_ios (curr , prev , grp , n -> diffstat );
1226+ }
1227+
1228+ __public unsigned long libnvme_ns_get_read_ios (libnvme_ns_t n )
1229+ {
1230+ return __libnvme_ns_get_ios (n , READ );
1231+ }
1232+
1233+ __public unsigned long libnvme_ns_get_write_ios (libnvme_ns_t n )
1234+ {
1235+ return __libnvme_ns_get_ios (n , WRITE );
1236+ }
1237+
11201238static unsigned long long libnvme_stat_get_sectors (libnvme_stat_t curr ,
11211239 libnvme_stat_t prev , enum libnvme_stat_group grp , bool diffstat )
11221240{
@@ -1155,6 +1273,30 @@ __public unsigned long long libnvme_path_get_write_sectors(libnvme_path_t p)
11551273 return __libnvme_path_get_sectors (p , WRITE );
11561274}
11571275
1276+ static unsigned long long __libnvme_ns_get_sectors (libnvme_ns_t n ,
1277+ enum libnvme_stat_group grp )
1278+ {
1279+ libnvme_stat_t curr , prev ;
1280+
1281+ curr = libnvme_ns_get_stat (n , n -> curr_idx );
1282+ prev = libnvme_ns_get_stat (n , !n -> curr_idx );
1283+
1284+ if (!curr || !prev )
1285+ return 0 ;
1286+
1287+ return libnvme_stat_get_sectors (curr , prev , grp , n -> diffstat );
1288+ }
1289+
1290+ __public unsigned long long libnvme_ns_get_read_sectors (libnvme_ns_t n )
1291+ {
1292+ return __libnvme_ns_get_sectors (n , READ );
1293+ }
1294+
1295+ __public unsigned long long libnvme_ns_get_write_sectors (libnvme_ns_t n )
1296+ {
1297+ return __libnvme_ns_get_sectors (n , WRITE );
1298+ }
1299+
11581300void nvme_free_path (struct libnvme_path * p )
11591301{
11601302 if (!p )
0 commit comments