Print this page
7448 nvme: performance regression when volatile write cache not present
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/nvme/nvme.c
          +++ new/usr/src/uts/common/io/nvme/nvme.c
↓ open down ↓ 2499 lines elided ↑ open up ↑
2500 2500  
2501 2501  static int
2502 2502  nvme_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
2503 2503  {
2504 2504          nvme_t *nvme;
2505 2505          int instance;
2506 2506          int nregs;
2507 2507          off_t regsize;
2508 2508          int i;
2509 2509          char name[32];
     2510 +        bd_ops_t l_bd_ops = nvme_bd_ops;
2510 2511  
2511 2512          if (cmd != DDI_ATTACH)
2512 2513                  return (DDI_FAILURE);
2513 2514  
2514 2515          instance = ddi_get_instance(dip);
2515 2516  
2516 2517          if (ddi_soft_state_zalloc(nvme_state, instance) != DDI_SUCCESS)
2517 2518                  return (DDI_FAILURE);
2518 2519  
2519 2520          nvme = ddi_get_soft_state(nvme_state, instance);
↓ open down ↓ 116 lines elided ↑ open up ↑
2636 2637          if (nvme_init(nvme) != DDI_SUCCESS)
2637 2638                  goto fail;
2638 2639  
2639 2640          /*
2640 2641           * Attach the blkdev driver for each namespace.
2641 2642           */
2642 2643          for (i = 0; i != nvme->n_namespace_count; i++) {
2643 2644                  if (nvme->n_ns[i].ns_ignore)
2644 2645                          continue;
2645 2646  
     2647 +                if (!nvme->n_write_cache_present) {
     2648 +                        l_bd_ops.o_sync_cache = NULL;
     2649 +                }
     2650 +
2646 2651                  nvme->n_ns[i].ns_bd_hdl = bd_alloc_handle(&nvme->n_ns[i],
2647      -                    &nvme_bd_ops, &nvme->n_prp_dma_attr, KM_SLEEP);
     2652 +                    &l_bd_ops, &nvme->n_prp_dma_attr, KM_SLEEP);
2648 2653  
2649 2654                  if (nvme->n_ns[i].ns_bd_hdl == NULL) {
2650 2655                          dev_err(dip, CE_WARN,
2651 2656                              "!failed to get blkdev handle for namespace %d", i);
2652 2657                          goto fail;
2653 2658                  }
2654 2659  
2655 2660                  if (bd_attach_handle(dip, nvme->n_ns[i].ns_bd_hdl)
2656 2661                      != DDI_SUCCESS) {
2657 2662                          dev_err(dip, CE_WARN,
↓ open down ↓ 387 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX