return 1;
 }
 
+static inline void
+megasas_sdev_busy_inc(struct megasas_instance *instance,
+                     struct scsi_cmnd *scmd)
+{
+       if (instance->perf_mode == MR_BALANCED_PERF_MODE) {
+               struct MR_PRIV_DEVICE *mr_device_priv_data =
+                       scmd->device->hostdata;
+               atomic_inc(&mr_device_priv_data->sdev_priv_busy);
+       }
+}
+
+static inline void
+megasas_sdev_busy_dec(struct megasas_instance *instance,
+                     struct scsi_cmnd *scmd)
+{
+       if (instance->perf_mode == MR_BALANCED_PERF_MODE) {
+               struct MR_PRIV_DEVICE *mr_device_priv_data =
+                       scmd->device->hostdata;
+               atomic_dec(&mr_device_priv_data->sdev_priv_busy);
+       }
+}
+
+static inline int
+megasas_sdev_busy_read(struct megasas_instance *instance,
+                      struct scsi_cmnd *scmd)
+{
+       if (instance->perf_mode == MR_BALANCED_PERF_MODE) {
+               struct MR_PRIV_DEVICE *mr_device_priv_data =
+                       scmd->device->hostdata;
+               return atomic_read(&mr_device_priv_data->sdev_priv_busy);
+       }
+       return 0;
+}
+
 /**
  * megasas_get_cmd_fusion -    Get a command from the free pool
  * @instance:          Adapter soft state
                       struct megasas_cmd_fusion *cmd,
                       u8 data_arms)
 {
-       int sdev_busy;
-
-       /* TBD - if sml remove device_busy in future, driver
-        * should track counter in internal structure.
-        */
-       sdev_busy = atomic_read(&scmd->device->device_busy);
-
        if (instance->perf_mode == MR_BALANCED_PERF_MODE &&
-           sdev_busy > (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH)) {
+           (megasas_sdev_busy_read(instance, scmd) >
+            (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH))) {
                cmd->request_desc->SCSIIO.MSIxIndex =
                        mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) /
                                        MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start);
         * Issue the command to the FW
         */
 
+       megasas_sdev_busy_inc(instance, scmd);
        megasas_fire_cmd_fusion(instance, req_desc);
 
        if (r1_cmd)
                scmd_local->SCp.ptr = NULL;
                megasas_return_cmd_fusion(instance, cmd);
                scsi_dma_unmap(scmd_local);
+               megasas_sdev_busy_dec(instance, scmd_local);
                scmd_local->scsi_done(scmd_local);
        }
 }
                                scmd_local->SCp.ptr = NULL;
                                megasas_return_cmd_fusion(instance, cmd_fusion);
                                scsi_dma_unmap(scmd_local);
+                               megasas_sdev_busy_dec(instance, scmd_local);
                                scmd_local->scsi_done(scmd_local);
                        } else  /* Optimal VD - R1 FP command completion. */
                                megasas_complete_r1_command(instance, cmd_fusion);