Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

target: Convert se_device statistics to atomic_long_t

This patch converts the handful of se_device statistics to type
atomic_long_t, instead of using se_device->stats_lock when
incrementing these values.

More importantly, go ahead and drop the spinlock usage within
transport_lookup_cmd_lun() fast-path code.

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

+17 -21
+3 -7
drivers/target/target_core_device.c
··· 130 130 /* Directly associate cmd with se_dev */ 131 131 se_cmd->se_dev = se_lun->lun_se_dev; 132 132 133 - /* TODO: get rid of this and use atomics for stats */ 134 133 dev = se_lun->lun_se_dev; 135 - spin_lock_irqsave(&dev->stats_lock, flags); 136 - dev->num_cmds++; 134 + atomic_long_inc(&dev->num_cmds); 137 135 if (se_cmd->data_direction == DMA_TO_DEVICE) 138 - dev->write_bytes += se_cmd->data_length; 136 + atomic_long_add(se_cmd->data_length, &dev->write_bytes); 139 137 else if (se_cmd->data_direction == DMA_FROM_DEVICE) 140 - dev->read_bytes += se_cmd->data_length; 141 - spin_unlock_irqrestore(&dev->stats_lock, flags); 138 + atomic_long_add(se_cmd->data_length, &dev->read_bytes); 142 139 143 140 return 0; 144 141 } ··· 1423 1426 INIT_LIST_HEAD(&dev->state_list); 1424 1427 INIT_LIST_HEAD(&dev->qf_cmd_list); 1425 1428 INIT_LIST_HEAD(&dev->g_dev_node); 1426 - spin_lock_init(&dev->stats_lock); 1427 1429 spin_lock_init(&dev->execute_task_lock); 1428 1430 spin_lock_init(&dev->delayed_cmd_lock); 1429 1431 spin_lock_init(&dev->dev_reservation_lock);
+9 -6
drivers/target/target_core_stat.c
··· 213 213 struct se_device *dev = 214 214 container_of(sgrps, struct se_device, dev_stat_grps); 215 215 216 - return snprintf(page, PAGE_SIZE, "%u\n", dev->num_resets); 216 + return snprintf(page, PAGE_SIZE, "%lu\n", 217 + atomic_long_read(&dev->num_resets)); 217 218 } 218 219 DEV_STAT_SCSI_TGT_DEV_ATTR_RO(resets); 219 220 ··· 397 396 container_of(sgrps, struct se_device, dev_stat_grps); 398 397 399 398 /* scsiLuNumCommands */ 400 - return snprintf(page, PAGE_SIZE, "%llu\n", 401 - (unsigned long long)dev->num_cmds); 399 + return snprintf(page, PAGE_SIZE, "%lu\n", 400 + atomic_long_read(&dev->num_cmds)); 402 401 } 403 402 DEV_STAT_SCSI_LU_ATTR_RO(num_cmds); 404 403 ··· 409 408 container_of(sgrps, struct se_device, dev_stat_grps); 410 409 411 410 /* scsiLuReadMegaBytes */ 412 - return snprintf(page, PAGE_SIZE, "%u\n", (u32)(dev->read_bytes >> 20)); 411 + return snprintf(page, PAGE_SIZE, "%lu\n", 412 + atomic_long_read(&dev->read_bytes) >> 20); 413 413 } 414 414 DEV_STAT_SCSI_LU_ATTR_RO(read_mbytes); 415 415 ··· 421 419 container_of(sgrps, struct se_device, dev_stat_grps); 422 420 423 421 /* scsiLuWrittenMegaBytes */ 424 - return snprintf(page, PAGE_SIZE, "%u\n", (u32)(dev->write_bytes >> 20)); 422 + return snprintf(page, PAGE_SIZE, "%lu\n", 423 + atomic_long_read(&dev->write_bytes) >> 20); 425 424 } 426 425 DEV_STAT_SCSI_LU_ATTR_RO(write_mbytes); 427 426 ··· 433 430 container_of(sgrps, struct se_device, dev_stat_grps); 434 431 435 432 /* scsiLuInResets */ 436 - return snprintf(page, PAGE_SIZE, "%u\n", dev->num_resets); 433 + return snprintf(page, PAGE_SIZE, "%lu\n", atomic_long_read(&dev->num_resets)); 437 434 } 438 435 DEV_STAT_SCSI_LU_ATTR_RO(resets); 439 436
+1 -3
drivers/target/target_core_tmr.c
··· 386 386 pr_debug("LUN_RESET: SCSI-2 Released reservation\n"); 387 387 } 388 388 389 - spin_lock_irq(&dev->stats_lock); 390 - dev->num_resets++; 391 - spin_unlock_irq(&dev->stats_lock); 389 + atomic_long_inc(&dev->num_resets); 392 390 393 391 pr_debug("LUN_RESET: %s for [%s] Complete\n", 394 392 (preempt_and_abort_list) ? "Preempt" : "TMR",
+4 -5
include/target/target_core_base.h
··· 683 683 /* Pointer to transport specific device structure */ 684 684 u32 dev_index; 685 685 u64 creation_time; 686 - u32 num_resets; 687 - u64 num_cmds; 688 - u64 read_bytes; 689 - u64 write_bytes; 690 - spinlock_t stats_lock; 686 + atomic_long_t num_resets; 687 + atomic_long_t num_cmds; 688 + atomic_long_t read_bytes; 689 + atomic_long_t write_bytes; 691 690 /* Active commands on this virtual SE device */ 692 691 atomic_t simple_cmds; 693 692 atomic_t dev_ordered_id;