ufs_test.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. /* Copyright (c) 2013, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <linux/module.h>
  14. #include <linux/blkdev.h>
  15. #include <linux/debugfs.h>
  16. #include <linux/test-iosched.h>
  17. #include <scsi/scsi_device.h>
  18. #include <scsi/scsi_cmnd.h>
  19. #include <../sd.h>
  20. #include <linux/delay.h>
  21. #define MODULE_NAME "ufs_test"
  22. #define TEST_MAX_BIOS_PER_REQ 16
  23. #define LARGE_PRIME_1 1103515367
  24. #define LARGE_PRIME_2 35757
  25. #define DEFAULT_NUM_OF_BIOS 2
  26. /* the amount of requests that will be inserted */
  27. #define LONG_SEQ_TEST_NUM_REQS 256
  28. /* request queue limitation is 128 requests, and we leave 10 spare requests */
  29. #define QUEUE_MAX_REQUESTS 118
  30. #define MB_MSEC_RATIO_APPROXIMATION ((1024 * 1024) / 1000)
  31. /* actual number of MiB in test multiplied by 10, for single digit precision*/
  32. #define BYTE_TO_MB_x_10(x) ((x * 10) / (1024 * 1024))
  33. /* extract integer value */
  34. #define LONG_TEST_SIZE_INTEGER(x) (BYTE_TO_MB_x_10(x) / 10)
  35. /* and calculate the MiB value fraction */
  36. #define LONG_TEST_SIZE_FRACTION(x) (BYTE_TO_MB_x_10(x) - \
  37. (LONG_TEST_SIZE_INTEGER(x) * 10))
  38. #define test_pr_debug(fmt, args...) pr_debug("%s: "fmt"\n", MODULE_NAME, args)
  39. #define test_pr_info(fmt, args...) pr_info("%s: "fmt"\n", MODULE_NAME, args)
  40. #define test_pr_err(fmt, args...) pr_err("%s: "fmt"\n", MODULE_NAME, args)
  41. enum ufs_test_testcases {
  42. UFS_TEST_WRITE_READ_TEST,
  43. TEST_LONG_SEQUENTIAL_READ,
  44. TEST_LONG_SEQUENTIAL_WRITE,
  45. };
  46. struct ufs_test_debug {
  47. struct dentry *write_read_test; /* basic test */
  48. struct dentry *random_test_seed; /* parameters in utils */
  49. struct dentry *long_sequential_read_test;
  50. struct dentry *long_sequential_write_test;
  51. };
  52. struct ufs_test_data {
  53. /* Data structure for debugfs dentrys */
  54. struct ufs_test_debug debug;
  55. /*
  56. * Data structure containing individual test information, including
  57. * self-defined specific data
  58. */
  59. struct test_info test_info;
  60. /* device test */
  61. struct blk_dev_test_type bdt;
  62. /* A wait queue for OPs to complete */
  63. wait_queue_head_t wait_q;
  64. /* a flag for read compleation */
  65. bool read_completed;
  66. /* a flag for write compleation */
  67. bool write_completed;
  68. /*
  69. * To determine the number of r/w bios. When seed = 0, random is
  70. * disabled and 2 BIOs are written.
  71. */
  72. unsigned int random_test_seed;
  73. /* A counter for the number of test requests completed */
  74. unsigned int completed_req_count;
  75. };
  76. static struct ufs_test_data *utd;
  77. static bool message_repeat;
  78. static char *ufs_test_get_test_case_str(struct test_data *td)
  79. {
  80. if (!td) {
  81. test_pr_err("%s: NULL td", __func__);
  82. return NULL;
  83. }
  84. switch (td->test_info.testcase) {
  85. case UFS_TEST_WRITE_READ_TEST:
  86. return "UFS write read test";
  87. break;
  88. case TEST_LONG_SEQUENTIAL_READ:
  89. return "UFS long sequential read test";
  90. break;
  91. case TEST_LONG_SEQUENTIAL_WRITE:
  92. return "UFS long sequential write test";
  93. break;
  94. default:
  95. return "Unknown test";
  96. }
  97. }
  98. static unsigned int ufs_test_pseudo_random_seed(unsigned int *seed_number,
  99. unsigned int min_val, unsigned int max_val)
  100. {
  101. int ret = 0;
  102. if (!seed_number)
  103. return 0;
  104. *seed_number = ((unsigned int) (((unsigned long) *seed_number
  105. * (unsigned long) LARGE_PRIME_1) + LARGE_PRIME_2));
  106. ret = (unsigned int) ((*seed_number) % max_val);
  107. return (ret > min_val ? ret : min_val);
  108. }
  109. static void ufs_test_pseudo_rnd_size(unsigned int *seed,
  110. unsigned int *num_of_bios)
  111. {
  112. *num_of_bios = ufs_test_pseudo_random_seed(seed, 1,
  113. TEST_MAX_BIOS_PER_REQ);
  114. if (!(*num_of_bios))
  115. *num_of_bios = DEFAULT_NUM_OF_BIOS;
  116. }
  117. static void ufs_test_write_read_test_end_io_fn(struct request *rq, int err)
  118. {
  119. struct test_request *test_rq = (struct test_request *)rq->elv.priv[0];
  120. BUG_ON(!test_rq);
  121. test_rq->req_completed = 1;
  122. test_rq->req_result = err;
  123. test_pr_info("%s: request %d completed, err=%d",
  124. __func__, test_rq->req_id, err);
  125. utd->write_completed = true;
  126. wake_up(&utd->wait_q);
  127. }
  128. static struct gendisk *ufs_test_get_rq_disk(void)
  129. {
  130. struct request_queue *req_q = test_iosched_get_req_queue();
  131. struct scsi_device *sd;
  132. struct device *dev;
  133. struct scsi_disk *sdkp;
  134. struct gendisk *gd;
  135. if (!req_q) {
  136. test_pr_info("%s: Could not fetch request_queue", __func__);
  137. gd = NULL;
  138. goto exit;
  139. }
  140. sd = (struct scsi_device *)req_q->queuedata;
  141. dev = &sd->sdev_gendev;
  142. sdkp = scsi_disk_get_from_dev(dev);
  143. if (!sdkp) {
  144. test_pr_info("%s: Could not fatch scsi disk", __func__);
  145. gd = NULL;
  146. goto exit;
  147. }
  148. gd = sdkp->disk;
  149. exit:
  150. return gd;
  151. }
  152. static int ufs_test_run_write_read_test(struct test_data *td)
  153. {
  154. int ret = 0;
  155. unsigned int start_sec;
  156. unsigned int num_bios;
  157. struct request_queue *q = td->req_q;
  158. start_sec = td->start_sector + sizeof(int) * BIO_U32_SIZE
  159. * td->num_of_write_bios;
  160. if (utd->random_test_seed != 0)
  161. ufs_test_pseudo_rnd_size(&utd->random_test_seed, &num_bios);
  162. else
  163. num_bios = DEFAULT_NUM_OF_BIOS;
  164. /* Adding a write request */
  165. test_pr_info(
  166. "%s: Adding a write request with %d bios to Q, req_id=%d"
  167. , __func__, num_bios, td->wr_rd_next_req_id);
  168. utd->write_completed = false;
  169. ret = test_iosched_add_wr_rd_test_req(0, WRITE, start_sec,
  170. num_bios, TEST_PATTERN_5A,
  171. ufs_test_write_read_test_end_io_fn);
  172. if (ret) {
  173. test_pr_err("%s: failed to add a write request", __func__);
  174. return ret;
  175. }
  176. /* waiting for the write request to finish */
  177. blk_run_queue(q);
  178. wait_event(utd->wait_q, utd->write_completed);
  179. /* Adding a read request*/
  180. test_pr_info("%s: Adding a read request to Q", __func__);
  181. ret = test_iosched_add_wr_rd_test_req(0, READ, start_sec,
  182. num_bios, TEST_PATTERN_5A, NULL);
  183. if (ret) {
  184. test_pr_err("%s: failed to add a read request", __func__);
  185. return ret;
  186. }
  187. blk_run_queue(q);
  188. return ret;
  189. }
  190. static
  191. int ufs_test_write_read_test_open_cb(struct inode *inode, struct file *file)
  192. {
  193. file->private_data = inode->i_private;
  194. message_repeat = 1;
  195. test_pr_info("%s:UFS test initialized", __func__);
  196. return 0;
  197. }
  198. static ssize_t ufs_test_write_read_test_write_cb(struct file *file,
  199. const char __user *buf,
  200. size_t count, loff_t *ppos)
  201. {
  202. int ret = 0;
  203. int i;
  204. int number;
  205. sscanf(buf, "%d", &number);
  206. if (number <= 0)
  207. number = 1;
  208. test_pr_info("%s:the test will run for %d iterations.",
  209. __func__, number);
  210. memset(&utd->test_info, 0, sizeof(struct test_info));
  211. /* Initializing test */
  212. utd->test_info.data = utd;
  213. utd->test_info.get_test_case_str_fn = ufs_test_get_test_case_str;
  214. utd->test_info.testcase = UFS_TEST_WRITE_READ_TEST;
  215. utd->test_info.get_rq_disk_fn = ufs_test_get_rq_disk;
  216. utd->test_info.run_test_fn = ufs_test_run_write_read_test;
  217. /* Running the test multiple times */
  218. for (i = 0; i < number; ++i) {
  219. ret = test_iosched_start_test(&utd->test_info);
  220. if (ret) {
  221. test_pr_err("%s: Test failed.", __func__);
  222. return ret;
  223. }
  224. }
  225. test_pr_info("%s: Completed all the ufs test iterations.", __func__);
  226. return count;
  227. }
  228. static ssize_t ufs_test_write_read_test_read_cb(struct file *file,
  229. char __user *buffer, size_t count, loff_t *offset)
  230. {
  231. memset((void *) buffer, 0, count);
  232. snprintf(buffer, count, "\nThis is a UFS write-read test for debug.\n");
  233. if (message_repeat == 1) {
  234. message_repeat = 0;
  235. return strnlen(buffer, count);
  236. } else
  237. return 0;
  238. }
  239. const struct file_operations write_read_test_ops = {
  240. .open = ufs_test_write_read_test_open_cb,
  241. .write = ufs_test_write_read_test_write_cb,
  242. .read = ufs_test_write_read_test_read_cb,
  243. };
  244. static void long_seq_test_free_end_io_fn(struct request *rq, int err)
  245. {
  246. struct test_request *test_rq;
  247. struct test_data *ptd = test_get_test_data();
  248. if (rq)
  249. test_rq = (struct test_request *)rq->elv.priv[0];
  250. else {
  251. test_pr_err("%s: error: NULL request", __func__);
  252. return;
  253. }
  254. BUG_ON(!test_rq);
  255. spin_lock_irq(&ptd->lock);
  256. ptd->dispatched_count--;
  257. list_del_init(&test_rq->queuelist);
  258. __blk_put_request(ptd->req_q, test_rq->rq);
  259. spin_unlock_irq(&ptd->lock);
  260. kfree(test_rq->bios_buffer);
  261. kfree(test_rq);
  262. utd->completed_req_count++;
  263. test_pr_err("%s: request %d completed, err=%d",
  264. __func__, test_rq->req_id, err);
  265. check_test_completion();
  266. }
  267. static int run_long_seq_test(struct test_data *td)
  268. {
  269. int ret = 0;
  270. int direction;
  271. static unsigned int inserted_requests;
  272. BUG_ON(!td);
  273. td->test_count = 0;
  274. utd->completed_req_count = 0;
  275. inserted_requests = 0;
  276. if (td->test_info.testcase == TEST_LONG_SEQUENTIAL_READ)
  277. direction = READ;
  278. else
  279. direction = WRITE;
  280. test_pr_info("%s: Adding %d requests, first req_id=%d",
  281. __func__, LONG_SEQ_TEST_NUM_REQS,
  282. td->wr_rd_next_req_id);
  283. do {
  284. /*
  285. * since our requests come from a pool containing 128
  286. * requests, we don't want to exhaust this quantity,
  287. * therefore we add up to QUEUE_MAX_REQUESTS (which
  288. * includes a safety margin) and then call the mmc layer
  289. * to fetch them
  290. */
  291. if (td->test_count >= QUEUE_MAX_REQUESTS) {
  292. blk_run_queue(td->req_q);
  293. continue;
  294. }
  295. ret = test_iosched_add_wr_rd_test_req(0, direction,
  296. td->start_sector, TEST_MAX_BIOS_PER_REQ,
  297. TEST_PATTERN_5A,
  298. long_seq_test_free_end_io_fn);
  299. if (ret) {
  300. test_pr_err("%s: failed to create request" , __func__);
  301. break;
  302. }
  303. inserted_requests++;
  304. td->test_info.test_byte_count +=
  305. (TEST_MAX_BIOS_PER_REQ * sizeof(unsigned int) *
  306. BIO_U32_SIZE);
  307. } while (inserted_requests < LONG_SEQ_TEST_NUM_REQS);
  308. /* in this case the queue will not run in the above loop */
  309. if (LONG_SEQ_TEST_NUM_REQS < QUEUE_MAX_REQUESTS)
  310. blk_run_queue(td->req_q);
  311. return ret;
  312. }
  313. void long_seq_test_calc_throughput(unsigned long mtime,
  314. unsigned long byte_count)
  315. {
  316. unsigned long fraction, integer;
  317. test_pr_info("%s: time is %lu msec, size is %lu.%lu MiB",
  318. __func__, mtime, LONG_TEST_SIZE_INTEGER(byte_count),
  319. LONG_TEST_SIZE_FRACTION(byte_count));
  320. /* we first multiply in order not to lose precision */
  321. mtime *= MB_MSEC_RATIO_APPROXIMATION;
  322. /* divide values to get a MiB/sec integer value with one
  323. digit of precision
  324. */
  325. fraction = integer = (byte_count * 10) / mtime;
  326. integer /= 10;
  327. /* and calculate the MiB value fraction */
  328. fraction -= integer * 10;
  329. test_pr_info("%s: Throughput: %lu.%lu MiB/sec\n",
  330. __func__, integer, fraction);
  331. }
  332. static ssize_t long_sequential_read_test_write(struct file *file,
  333. const char __user *buf,
  334. size_t count,
  335. loff_t *ppos)
  336. {
  337. int ret = 0;
  338. int i = 0;
  339. int number = -1;
  340. unsigned long mtime, byte_count;
  341. test_pr_info("%s: -- UFS Long Sequential Read TEST --", __func__);
  342. sscanf(buf, "%d", &number);
  343. if (number <= 0)
  344. number = 1;
  345. memset(&utd->test_info, 0, sizeof(struct test_info));
  346. utd->test_info.data = utd;
  347. utd->test_info.get_rq_disk_fn = ufs_test_get_rq_disk;
  348. utd->test_info.run_test_fn = run_long_seq_test;
  349. utd->test_info.get_test_case_str_fn = ufs_test_get_test_case_str;
  350. utd->test_info.testcase = TEST_LONG_SEQUENTIAL_READ;
  351. for (i = 0 ; i < number ; ++i) {
  352. test_pr_info("%s: Cycle # %d / %d", __func__, i+1, number);
  353. test_pr_info("%s: ====================", __func__);
  354. ret = test_iosched_start_test(&utd->test_info);
  355. if (ret)
  356. break;
  357. mtime = ktime_to_ms(utd->test_info.test_duration);
  358. byte_count = utd->test_info.test_byte_count;
  359. long_seq_test_calc_throughput(mtime, byte_count);
  360. /* Allow FS requests to be dispatched */
  361. msleep(1000);
  362. }
  363. return count;
  364. }
  365. static ssize_t long_sequential_read_test_read(struct file *file,
  366. char __user *buffer,
  367. size_t count,
  368. loff_t *offset)
  369. {
  370. memset((void *)buffer, 0, count);
  371. snprintf(buffer, count,
  372. "\nufs_long_sequential_read_test\n"
  373. "=========\n"
  374. "Description:\n"
  375. "This test runs the following scenarios\n"
  376. "- Long Sequential Read Test: this test measures read "
  377. "throughput at the driver level by sequentially reading many "
  378. "large requests.\n");
  379. if (message_repeat == 1) {
  380. message_repeat = 0;
  381. return strnlen(buffer, count);
  382. } else
  383. return 0;
  384. }
  385. static bool message_repeat;
  386. static int test_open(struct inode *inode, struct file *file)
  387. {
  388. file->private_data = inode->i_private;
  389. message_repeat = 1;
  390. return 0;
  391. }
  392. const struct file_operations long_sequential_read_test_ops = {
  393. .open = test_open,
  394. .write = long_sequential_read_test_write,
  395. .read = long_sequential_read_test_read,
  396. };
  397. static ssize_t long_sequential_write_test_write(struct file *file,
  398. const char __user *buf,
  399. size_t count,
  400. loff_t *ppos)
  401. {
  402. int ret = 0;
  403. int i = 0;
  404. int number = -1;
  405. unsigned long mtime, byte_count;
  406. test_pr_info("%s: -- UFS Long Sequential Write TEST --", __func__);
  407. sscanf(buf, "%d", &number);
  408. if (number <= 0)
  409. number = 1;
  410. memset(&utd->test_info, 0, sizeof(struct test_info));
  411. utd->test_info.data = utd;
  412. utd->test_info.get_rq_disk_fn = ufs_test_get_rq_disk;
  413. utd->test_info.get_test_case_str_fn = ufs_test_get_test_case_str;
  414. utd->test_info.run_test_fn = run_long_seq_test;
  415. utd->test_info.testcase = TEST_LONG_SEQUENTIAL_WRITE;
  416. for (i = 0 ; i < number ; ++i) {
  417. test_pr_info("%s: Cycle # %d / %d", __func__, i+1, number);
  418. test_pr_info("%s: ====================", __func__);
  419. utd->test_info.test_byte_count = 0;
  420. ret = test_iosched_start_test(&utd->test_info);
  421. if (ret)
  422. break;
  423. mtime = ktime_to_ms(utd->test_info.test_duration);
  424. byte_count = utd->test_info.test_byte_count;
  425. long_seq_test_calc_throughput(mtime, byte_count);
  426. /* Allow FS requests to be dispatched */
  427. msleep(1000);
  428. }
  429. return count;
  430. }
  431. static ssize_t long_sequential_write_test_read(struct file *file,
  432. char __user *buffer,
  433. size_t count,
  434. loff_t *offset)
  435. {
  436. memset((void *)buffer, 0, count);
  437. snprintf(buffer, count,
  438. "\nufs_long_sequential_write_test\n"
  439. "=========\n"
  440. "Description:\n"
  441. "This test runs the following scenarios\n"
  442. "- Long Sequential Write Test: this test measures write "
  443. "throughput at the driver level by sequentially writing many "
  444. "large requests\n");
  445. if (message_repeat == 1) {
  446. message_repeat = 0;
  447. return strnlen(buffer, count);
  448. } else
  449. return 0;
  450. }
  451. const struct file_operations long_sequential_write_test_ops = {
  452. .open = test_open,
  453. .write = long_sequential_write_test_write,
  454. .read = long_sequential_write_test_read,
  455. };
  456. static void ufs_test_debugfs_cleanup(void)
  457. {
  458. debugfs_remove_recursive(test_iosched_get_debugfs_tests_root());
  459. }
  460. static int ufs_test_debugfs_init(void)
  461. {
  462. struct dentry *utils_root, *tests_root;
  463. int ret = 0;
  464. utils_root = test_iosched_get_debugfs_utils_root();
  465. tests_root = test_iosched_get_debugfs_tests_root();
  466. if (!utils_root || !tests_root) {
  467. test_pr_err("%s: Failed to create debugfs root.", __func__);
  468. ret = -EINVAL;
  469. goto exit;
  470. }
  471. utd->debug.random_test_seed = debugfs_create_u32("random_test_seed",
  472. S_IRUGO | S_IWUGO, utils_root, &utd->random_test_seed);
  473. if (!utd->debug.random_test_seed) {
  474. test_pr_err("%s: Could not create debugfs random_test_seed.",
  475. __func__);
  476. ret = -ENOMEM;
  477. goto exit;
  478. }
  479. utd->debug.write_read_test = debugfs_create_file("ufs_write_read_test",
  480. S_IRUGO | S_IWUGO, tests_root,
  481. NULL, &write_read_test_ops);
  482. if (!utd->debug.write_read_test) {
  483. ret = -ENOMEM;
  484. goto exit_err;
  485. }
  486. utd->debug.long_sequential_read_test = debugfs_create_file(
  487. "ufs_long_sequential_read_test",
  488. S_IRUGO | S_IWUGO,
  489. tests_root,
  490. NULL,
  491. &long_sequential_read_test_ops);
  492. if (!utd->debug.long_sequential_read_test) {
  493. ret = -ENOMEM;
  494. goto exit_err;
  495. }
  496. utd->debug.long_sequential_write_test = debugfs_create_file(
  497. "ufs_long_sequential_write_test",
  498. S_IRUGO | S_IWUGO,
  499. tests_root,
  500. NULL,
  501. &long_sequential_write_test_ops);
  502. if (!utd->debug.long_sequential_write_test) {
  503. ret = -ENOMEM;
  504. goto exit_err;
  505. }
  506. goto exit;
  507. exit_err:
  508. debugfs_remove_recursive(tests_root);
  509. exit:
  510. return ret;
  511. }
  512. static void ufs_test_probe(void)
  513. {
  514. ufs_test_debugfs_init();
  515. }
  516. static void ufs_test_remove(void)
  517. {
  518. ufs_test_debugfs_cleanup();
  519. }
  520. int __init ufs_test_init(void)
  521. {
  522. utd = kzalloc(sizeof(struct ufs_test_data), GFP_KERNEL);
  523. if (!utd) {
  524. test_pr_err("%s: failed to allocate ufs_test_data", __func__);
  525. return -ENODEV;
  526. }
  527. init_waitqueue_head(&utd->wait_q);
  528. utd->bdt.init_fn = ufs_test_probe;
  529. utd->bdt.exit_fn = ufs_test_remove;
  530. INIT_LIST_HEAD(&utd->bdt.list);
  531. test_iosched_register(&utd->bdt);
  532. return 0;
  533. }
  534. EXPORT_SYMBOL_GPL(ufs_test_init);
  535. static void __exit ufs_test_exit(void)
  536. {
  537. test_iosched_unregister(&utd->bdt);
  538. kfree(utd);
  539. }
  540. module_init(ufs_test_init)
  541. ;
  542. module_exit(ufs_test_exit)
  543. ;
  544. MODULE_LICENSE("GPL v2");
  545. MODULE_DESCRIPTION("UFC test");