Commit 52c07423a819091b0fe9abbf26977098b996f85b

Authored by Nicholas Bellinger
1 parent 3eccfdb01d

target/rd: Add ramdisk bit for NULLIO operation

This patch adds a rd_nullio parameter that allows RAMDISK_MCP backends
to function in NULLIO mode, where all se_cmd I/O is immediately completed
in rd_execute_rw() without actually performing the SGL memory copy.

This is useful for performance testing when the ramdisk SGL memory copy
begins to eat lots of cycles during heavy small block workloads, so allow
this bit to be enabled when necessary on a per rd_dev basis.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

Showing 2 changed files with 19 additions and 3 deletions Side-by-side Diff

drivers/target/target_core_rd.c
... ... @@ -291,6 +291,11 @@
291 291 u32 src_len;
292 292 u64 tmp;
293 293  
  294 + if (dev->rd_flags & RDF_NULLIO) {
  295 + target_complete_cmd(cmd, SAM_STAT_GOOD);
  296 + return 0;
  297 + }
  298 +
294 299 tmp = cmd->t_task_lba * se_dev->dev_attrib.block_size;
295 300 rd_offset = do_div(tmp, PAGE_SIZE);
296 301 rd_page = tmp;
297 302  
... ... @@ -373,11 +378,12 @@
373 378 }
374 379  
375 380 enum {
376   - Opt_rd_pages, Opt_err
  381 + Opt_rd_pages, Opt_rd_nullio, Opt_err
377 382 };
378 383  
379 384 static match_table_t tokens = {
380 385 {Opt_rd_pages, "rd_pages=%d"},
  386 + {Opt_rd_nullio, "rd_nullio=%d"},
381 387 {Opt_err, NULL}
382 388 };
383 389  
... ... @@ -408,6 +414,14 @@
408 414 " Count: %u\n", rd_dev->rd_page_count);
409 415 rd_dev->rd_flags |= RDF_HAS_PAGE_COUNT;
410 416 break;
  417 + case Opt_rd_nullio:
  418 + match_int(args, &arg);
  419 + if (arg != 1)
  420 + break;
  421 +
  422 + pr_debug("RAMDISK: Setting NULLIO flag: %d\n", arg);
  423 + rd_dev->rd_flags |= RDF_NULLIO;
  424 + break;
411 425 default:
412 426 break;
413 427 }
... ... @@ -424,8 +438,9 @@
424 438 ssize_t bl = sprintf(b, "TCM RamDisk ID: %u RamDisk Makeup: rd_mcp\n",
425 439 rd_dev->rd_dev_id);
426 440 bl += sprintf(b + bl, " PAGES/PAGE_SIZE: %u*%lu"
427   - " SG_table_count: %u\n", rd_dev->rd_page_count,
428   - PAGE_SIZE, rd_dev->sg_table_count);
  441 + " SG_table_count: %u nullio: %d\n", rd_dev->rd_page_count,
  442 + PAGE_SIZE, rd_dev->sg_table_count,
  443 + !!(rd_dev->rd_flags & RDF_NULLIO));
429 444 return bl;
430 445 }
431 446  
drivers/target/target_core_rd.h
... ... @@ -22,6 +22,7 @@
22 22 } ____cacheline_aligned;
23 23  
24 24 #define RDF_HAS_PAGE_COUNT 0x01
  25 +#define RDF_NULLIO 0x02
25 26  
26 27 struct rd_dev {
27 28 struct se_device dev;