@@ -117,6 +117,7 @@ int dm_io_async_bvec(unsigned int num_regions,
117
117
}
118
118
#endif
119
119
120
+ #ifdef FLASHCACHE_WT_CHECKSUMS
120
121
static u_int64_t
121
122
flashcache_wt_compute_checksum (struct bio * bio )
122
123
{
@@ -175,6 +176,18 @@ flashcache_wt_validate_checksum(struct kcached_job *job)
175
176
spin_unlock_irqrestore (& job -> dmc -> cache_spin_lock , flags );
176
177
return retval ;
177
178
}
179
+ #else /* FLASHCACHE_WT_CHECKSUMS */
180
+ static void
181
+ flashcache_wt_store_checksum (struct kcached_job * job )
182
+ {
183
+ }
184
+
185
+ static int
186
+ flashcache_wt_validate_checksum (struct kcached_job * job )
187
+ {
188
+ return 0 ;
189
+ }
190
+ #endif /* FLASHCACHE_WT_CHECKSUMS */
178
191
179
192
static int
180
193
jobs_init (void )
@@ -345,7 +358,9 @@ do_io(struct kcached_job *job)
345
358
VERIFY (job -> rw == WRITECACHE );
346
359
/* Write to cache device */
347
360
flashcache_wt_store_checksum (job );
361
+ #ifdef FLASHCACHE_WT_CHECKSUMS
348
362
dmc -> checksum_store ++ ;
363
+ #endif /* FLASHCACHE_WT_CHECKSUMS */
349
364
dmc -> cache_writes ++ ;
350
365
r = dm_io_async_bvec (1 , & job -> cache , WRITE , bio -> bi_io_vec + bio -> bi_idx ,
351
366
flashcache_wt_io_callback , job );
@@ -636,7 +651,6 @@ cache_read(struct cache_c *dmc, struct bio *bio)
636
651
(bio_rw (bio ) == READ ? "READ" :"READA" ),
637
652
bio -> bi_sector , bio -> bi_size );
638
653
639
- dmc -> reads ++ ;
640
654
spin_lock_irqsave (& dmc -> cache_spin_lock , flags );
641
655
res = cache_lookup (dmc , bio , & index );
642
656
/* Cache Hit */
@@ -784,7 +798,6 @@ cache_write(struct cache_c *dmc, struct bio* bio)
784
798
unsigned long flags ;
785
799
struct kcached_job * job ;
786
800
787
- dmc -> writes ++ ;
788
801
spin_lock_irqsave (& dmc -> cache_spin_lock , flags );
789
802
if (cache_invalidate_blocks (dmc , bio ) > 0 ) {
790
803
/* A non zero return indicates an inprog invalidation */
@@ -863,7 +876,13 @@ flashcache_wt_map(struct dm_target *ti, struct bio *bio,
863
876
864
877
VERIFY (to_sector (bio -> bi_size ) <= dmc -> block_size );
865
878
866
- if (to_sector (bio -> bi_size ) != dmc -> block_size ) {
879
+ if (bio_data_dir (bio ) == READ )
880
+ dmc -> reads ++ ;
881
+ else
882
+ dmc -> writes ++ ;
883
+
884
+ if (to_sector (bio -> bi_size ) != dmc -> block_size ||
885
+ (dmc -> write_around_mode && (bio_data_dir (bio ) == WRITE ))) {
867
886
spin_lock_irqsave (& dmc -> cache_spin_lock , flags );
868
887
(void )cache_invalidate_blocks (dmc , bio );
869
888
spin_unlock_irqrestore (& dmc -> cache_spin_lock , flags );
@@ -1002,7 +1021,18 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1002
1021
}
1003
1022
1004
1023
if (argc >= 3 ) {
1005
- if (sscanf (argv [2 ], "%u" , & dmc -> block_size ) != 1 ) {
1024
+ if (sscanf (argv [2 ], "%d" , & dmc -> write_around_mode ) != 1 ) {
1025
+ ti -> error = "flashcache-wt: Invalid mode" ;
1026
+ r = - EINVAL ;
1027
+ goto bad4 ;
1028
+ }
1029
+ } else
1030
+ dmc -> assoc = DEFAULT_CACHE_ASSOC ;
1031
+
1032
+
1033
+
1034
+ if (argc >= 4 ) {
1035
+ if (sscanf (argv [3 ], "%u" , & dmc -> block_size ) != 1 ) {
1006
1036
ti -> error = "flashcache-wt: Invalid block size" ;
1007
1037
r = - EINVAL ;
1008
1038
goto bad4 ;
@@ -1018,8 +1048,8 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1018
1048
dmc -> block_mask = dmc -> block_size - 1 ;
1019
1049
1020
1050
/* dmc->size is specified in sectors here, and converted to blocks below */
1021
- if (argc >= 4 ) {
1022
- if (sscanf (argv [3 ], "%lu" , & dmc -> size ) != 1 ) {
1051
+ if (argc >= 5 ) {
1052
+ if (sscanf (argv [4 ], "%lu" , & dmc -> size ) != 1 ) {
1023
1053
ti -> error = "flashcache-wt: Invalid cache size" ;
1024
1054
r = - EINVAL ;
1025
1055
goto bad4 ;
@@ -1028,8 +1058,8 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1028
1058
dmc -> size = to_sector (dmc -> cache_dev -> bdev -> bd_inode -> i_size );
1029
1059
}
1030
1060
1031
- if (argc >= 5 ) {
1032
- if (sscanf (argv [4 ], "%u" , & dmc -> assoc ) != 1 ) {
1061
+ if (argc >= 6 ) {
1062
+ if (sscanf (argv [5 ], "%u" , & dmc -> assoc ) != 1 ) {
1033
1063
ti -> error = "flashcache-wt: Invalid cache associativity" ;
1034
1064
r = - EINVAL ;
1035
1065
goto bad4 ;
@@ -1042,7 +1072,7 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1042
1072
}
1043
1073
} else
1044
1074
dmc -> assoc = DEFAULT_CACHE_ASSOC ;
1045
-
1075
+
1046
1076
/*
1047
1077
* Convert size (in sectors) to blocks.
1048
1078
* Then round size (in blocks now) down to a multiple of associativity
@@ -1098,7 +1128,9 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1098
1128
/* Initialize the cache structs */
1099
1129
for (i = 0 ; i < dmc -> size ; i ++ ) {
1100
1130
dmc -> cache [i ].dbn = 0 ;
1131
+ #ifdef FLASHCACHE_WT_CHECKSUMS
1101
1132
dmc -> cache [i ].checksum = 0 ;
1133
+ #endif /* FLASHCACHE_WT_CHECKSUMS */
1102
1134
dmc -> cache_state [i ] = INVALID ;
1103
1135
}
1104
1136
@@ -1117,9 +1149,11 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1117
1149
dmc -> cached_blocks = 0 ;
1118
1150
dmc -> cache_wr_replace = 0 ;
1119
1151
1152
+ #ifdef FLASHCACHE_WT_CHECKSUMS
1120
1153
dmc -> checksum_store = 0 ;
1121
1154
dmc -> checksum_valid = 0 ;
1122
1155
dmc -> checksum_invalid = 0 ;
1156
+ #endif /* FLASHCACHE_WT_CHECKSUMS */
1123
1157
1124
1158
ti -> split_io = dmc -> block_size ;
1125
1159
ti -> private = dmc ;
@@ -1160,13 +1194,21 @@ cache_dtr(struct dm_target *ti)
1160
1194
else
1161
1195
read_hit_pct = 0 ;
1162
1196
DMINFO ("stats: \n\treads(%lu), writes(%lu)\n" , dmc -> reads , dmc -> writes );
1197
+ #ifdef FLASHCACHE_WT_CHECKSUMS
1163
1198
DMINFO ("\tcache hits(%lu), cache hit percent (%d)\n" \
1164
1199
"\treplacement(%lu), write replacement(%lu)\n" \
1165
1200
"\tread invalidates(%lu), write invalidates(%lu)\n" \
1166
1201
"\tchecksum store (%lu), checksum valid (%lu), checksum invalid(%lu)\n" ,
1167
1202
dmc -> cache_hits , read_hit_pct , dmc -> replace , dmc -> cache_wr_replace ,
1168
- dmc -> rd_invalidates , dmc -> wr_invalidates , dmc -> checksum_store ,
1169
- dmc -> checksum_valid , dmc -> checksum_invalid );
1203
+ dmc -> rd_invalidates , dmc -> wr_invalidates ,
1204
+ dmc -> checksum_store , dmc -> checksum_valid , dmc -> checksum_invalid );
1205
+ #else
1206
+ DMINFO ("\tcache hits(%lu), cache hit percent (%d)\n" \
1207
+ "\treplacement(%lu), write replacement(%lu)\n" \
1208
+ "\tread invalidates(%lu), write invalidates(%lu)\n" ,
1209
+ dmc -> cache_hits , read_hit_pct , dmc -> replace , dmc -> cache_wr_replace ,
1210
+ dmc -> rd_invalidates , dmc -> wr_invalidates );
1211
+ #endif
1170
1212
if (dmc -> size > 0 )
1171
1213
cache_pct = (dmc -> cached_blocks * 100 ) / dmc -> size ;
1172
1214
else
@@ -1203,19 +1245,62 @@ flashcache_wt_status_info(struct cache_c *dmc, status_type_t type,
1203
1245
else
1204
1246
read_hit_pct = 0 ;
1205
1247
DMEMIT ("stats: \n\treads(%lu), writes(%lu)\n" , dmc -> reads , dmc -> writes );
1206
- DMEMIT ("\tcache hits(%lu), cache hit percent (%d)\n" \
1207
- "\treplacement(%lu), write replacement(%lu)\n" \
1208
- "\tread invalidates(%lu), write invalidates(%lu)\n" \
1209
- "\tuncached reads(%lu), uncached writes(%lu)\n" \
1210
- "\tdisk reads(%lu), disk writes(%lu)\n" \
1211
- "\tcache reads(%lu), cache writes(%lu)\n" \
1212
- "\tchecksum store (%lu), checksum valid (%lu), checksum invalid(%lu)\n" ,
1213
- dmc -> cache_hits , read_hit_pct , dmc -> replace , dmc -> cache_wr_replace ,
1214
- dmc -> rd_invalidates , dmc -> wr_invalidates ,
1215
- dmc -> uncached_reads , dmc -> uncached_writes ,
1216
- dmc -> disk_reads , dmc -> disk_writes ,
1217
- dmc -> cache_reads , dmc -> cache_writes ,
1218
- dmc -> checksum_store , dmc -> checksum_valid , dmc -> checksum_invalid );
1248
+
1249
+ #ifdef FLASHCACHE_WT_CHECKSUMS
1250
+ if (dmc -> write_around_mode == 0 ) {
1251
+ DMEMIT ("\tcache hits(%lu), cache hit percent (%d)\n" \
1252
+ "\treplacement(%lu), write replacement(%lu)\n" \
1253
+ "\tread invalidates(%lu), write invalidates(%lu)\n" \
1254
+ "\tuncached reads(%lu), uncached writes(%lu)\n" \
1255
+ "\tdisk reads(%lu), disk writes(%lu)\n" \
1256
+ "\tcache reads(%lu), cache writes(%lu)\n" \
1257
+ "\tchecksum store (%lu), checksum valid (%lu), checksum invalid(%lu)\n" ,
1258
+ dmc -> cache_hits , read_hit_pct , dmc -> replace , dmc -> cache_wr_replace ,
1259
+ dmc -> rd_invalidates , dmc -> wr_invalidates ,
1260
+ dmc -> uncached_reads , dmc -> uncached_writes ,
1261
+ dmc -> disk_reads , dmc -> disk_writes ,
1262
+ dmc -> cache_reads , dmc -> cache_writes ,
1263
+ dmc -> checksum_store , dmc -> checksum_valid , dmc -> checksum_invalid );
1264
+ } else {
1265
+ DMEMIT ("\tcache hits(%lu), cache hit percent (%d)\n" \
1266
+ "\treplacement(%lu), read invalidates(%lu) write invalidates(%lu)\n" \
1267
+ "\tuncached reads(%lu), uncached writes(%lu)\n" \
1268
+ "\tdisk reads(%lu), disk writes(%lu)\n" \
1269
+ "\tcache reads(%lu), cache writes(%lu)\n" \
1270
+ "\tchecksum store (%lu), checksum valid (%lu), checksum invalid(%lu)\n" ,
1271
+ dmc -> cache_hits , read_hit_pct , dmc -> replace ,
1272
+ dmc -> rd_invalidates , dmc -> wr_invalidates ,
1273
+ dmc -> uncached_reads , dmc -> uncached_writes ,
1274
+ dmc -> disk_reads , dmc -> disk_writes ,
1275
+ dmc -> cache_reads , dmc -> cache_writes ,
1276
+ dmc -> checksum_store , dmc -> checksum_valid , dmc -> checksum_invalid );
1277
+ }
1278
+ #else /* FLASHCACHE_WT_CHECKSUMS */
1279
+ if (dmc -> write_around_mode == 0 ) {
1280
+ DMEMIT ("\tcache hits(%lu), cache hit percent (%d)\n" \
1281
+ "\treplacement(%lu), write replacement(%lu)\n" \
1282
+ "\tread invalidates(%lu), write invalidates(%lu)\n" \
1283
+ "\tuncached reads(%lu), uncached writes(%lu)\n" \
1284
+ "\tdisk reads(%lu), disk writes(%lu)\n" \
1285
+ "\tcache reads(%lu), cache writes(%lu)\n" ,
1286
+ dmc -> cache_hits , read_hit_pct , dmc -> replace , dmc -> cache_wr_replace ,
1287
+ dmc -> rd_invalidates , dmc -> wr_invalidates ,
1288
+ dmc -> uncached_reads , dmc -> uncached_writes ,
1289
+ dmc -> disk_reads , dmc -> disk_writes ,
1290
+ dmc -> cache_reads , dmc -> cache_writes );
1291
+ } else {
1292
+ DMEMIT ("\tcache hits(%lu), cache hit percent (%d)\n" \
1293
+ "\treplacement(%lu), read invalidates(%lu) write invalidates(%lu)\n" \
1294
+ "\tuncached reads(%lu), uncached writes(%lu)\n" \
1295
+ "\tdisk reads(%lu), disk writes(%lu)\n" \
1296
+ "\tcache reads(%lu), cache writes(%lu)\n" ,
1297
+ dmc -> cache_hits , read_hit_pct , dmc -> replace ,
1298
+ dmc -> rd_invalidates , dmc -> wr_invalidates ,
1299
+ dmc -> uncached_reads , dmc -> uncached_writes ,
1300
+ dmc -> disk_reads , dmc -> disk_writes ,
1301
+ dmc -> cache_reads , dmc -> cache_writes );
1302
+ }
1303
+ #endif /* FLASHCACHE_WT_CHECKSUMS */
1219
1304
}
1220
1305
1221
1306
static void
@@ -1231,10 +1316,11 @@ flashcache_wt_status_table(struct cache_c *dmc, status_type_t type,
1231
1316
else
1232
1317
cache_pct = 0 ;
1233
1318
DMEMIT ("conf:\n" \
1234
- "\tssd dev (%s), disk dev (%s)\n" \
1319
+ "\tssd dev (%s), disk dev (%s) mode (%s) \n" \
1235
1320
"\tcapacity(%luM), associativity(%u), block size(%uK)\n" \
1236
1321
"\ttotal blocks(%lu), cached blocks(%lu), cache percent(%d)\n" ,
1237
1322
dmc -> cache_devname , dmc -> disk_devname ,
1323
+ ((dmc -> write_around_mode ) ? "WRITE_AROUND" : "WRITETHROUGH" ),
1238
1324
dmc -> size * dmc -> block_size >>11 , dmc -> assoc ,
1239
1325
dmc -> block_size >>(10 - SECTOR_SHIFT ),
1240
1326
dmc -> size , dmc -> cached_blocks , cache_pct );
0 commit comments