Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933217AbcLIN6h (ORCPT ); Fri, 9 Dec 2016 08:58:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57436 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933019AbcLIN6f (ORCPT ); Fri, 9 Dec 2016 08:58:35 -0500 Subject: Re: [PATCH V4 08/11] megaraid_sas: Enable or Disable Fast path based on the PCI Threshold Bandwidth To: Sasikumar Chandrasekaran , jejb@kernel.org, hch@infradead.org References: <1481065220-18431-1-git-send-email-sasikumar.pc@broadcom.com> <1481065220-18431-9-git-send-email-sasikumar.pc@broadcom.com> Cc: linux-scsi@vger.kernel.org, Sathya.Prakash@broadcom.com, linux-kernel@vger.kernel.org, christopher.owens@broadcom.com, kiran-kumar.kasturi@broadcom.com From: Tomas Henzl Message-ID: <5e8d0157-51e1-1727-6ebb-2917b0d333c5@redhat.com> Date: Fri, 9 Dec 2016 14:58:32 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: <1481065220-18431-9-git-send-email-sasikumar.pc@broadcom.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 09 Dec 2016 13:58:35 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9792 Lines: 261 On 7.12.2016 00:00, Sasikumar Chandrasekaran wrote: > Large SEQ IO workload should sent as non fast path commands > > This patch is depending on patch 7 > > Signed-off-by: Sasikumar Chandrasekaran > --- > drivers/scsi/megaraid/megaraid_sas.h | 8 +++++ > drivers/scsi/megaraid/megaraid_sas_base.c | 48 +++++++++++++++++++++++++++++ > drivers/scsi/megaraid/megaraid_sas_fp.c | 11 +++++-- > drivers/scsi/megaraid/megaraid_sas_fusion.c | 20 +++++++----- > drivers/scsi/megaraid/megaraid_sas_fusion.h | 2 +- > 5 files changed, 78 insertions(+), 11 deletions(-) > > diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h > index 3e087ab..eb5be2b 100644 > --- a/drivers/scsi/megaraid/megaraid_sas.h > +++ b/drivers/scsi/megaraid/megaraid_sas.h > @@ -1429,6 +1429,8 @@ enum FW_BOOT_CONTEXT { > #define MFI_1068_FW_HANDSHAKE_OFFSET 0x64 > #define MFI_1068_FW_READY 0xDDDD0000 > > +#define MEGASAS_RAID1_FAST_PATH_STATUS_CHECK_INTERVAL HZ > + > #define MR_MAX_REPLY_QUEUES_OFFSET 0X0000001F > #define MR_MAX_REPLY_QUEUES_EXT_OFFSET 0X003FC000 > #define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT 14 > @@ -2101,6 +2103,10 @@ struct megasas_instance { > atomic_t ldio_outstanding; > atomic_t fw_reset_no_pci_access; > > + atomic64_t bytes_wrote; /* used for raid1 fast path enable or disable */ > + atomic_t r1_write_fp_capable; Is a an atomic variable needed for a just boolean variable? > + > + > struct megasas_instance_template *instancet; > struct tasklet_struct isr_tasklet; > struct work_struct work_init; > @@ -2143,6 +2149,7 @@ struct megasas_instance { > long reset_flags; > struct mutex reset_mutex; > struct timer_list sriov_heartbeat_timer; > + struct timer_list r1_fp_hold_timer; > char skip_heartbeat_timer_del; > u8 requestorId; > char PlasmaFW111; > @@ -2159,6 +2166,7 @@ struct megasas_instance { > bool is_ventura; > bool msix_combined; > u16 max_raid_mapsize; > + u64 pci_threshold_bandwidth; /* used to control the fp writes */ > }; > struct MR_LD_VF_MAP { > u32 size; > diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c > index 8aafb59..899d25c 100644 > --- a/drivers/scsi/megaraid/megaraid_sas_base.c > +++ b/drivers/scsi/megaraid/megaraid_sas_base.c > @@ -1940,6 +1940,9 @@ void megaraid_sas_kill_hba(struct megasas_instance *instance) > } > /* Complete outstanding ioctls when adapter is killed */ > megasas_complete_outstanding_ioctls(instance); > + if (instance->is_ventura) > + del_timer_sync(&instance->r1_fp_hold_timer); > + > } > > /** > @@ -2438,6 +2441,24 @@ void megasas_sriov_heartbeat_handler(unsigned long instance_addr) > } > } > > +/*Handler for disabling/enabling raid 1 fast paths*/ > +void megasas_change_r1_fp_status(unsigned long instance_addr) > +{ > + struct megasas_instance *instance = > + (struct megasas_instance *)instance_addr; > + if (atomic64_read(&instance->bytes_wrote) >= > + instance->pci_threshold_bandwidth) { > + > + atomic64_set(&instance->bytes_wrote, 0); > + atomic_set(&instance->r1_write_fp_capable, 0); > + } else { > + atomic64_set(&instance->bytes_wrote, 0); > + atomic_set(&instance->r1_write_fp_capable, 1); > + } > + mod_timer(&instance->r1_fp_hold_timer, > + jiffies + MEGASAS_RAID1_FAST_PATH_STATUS_CHECK_INTERVAL); > +} > + > /** > * megasas_wait_for_outstanding - Wait for all outstanding cmds > * @instance: Adapter soft state > @@ -5371,6 +5392,17 @@ static int megasas_init_fw(struct megasas_instance *instance) > instance->skip_heartbeat_timer_del = 1; > } > > + if (instance->is_ventura) { > + atomic64_set(&instance->bytes_wrote, 0); > + atomic_set(&instance->r1_write_fp_capable, 1); > + megasas_start_timer(instance, > + &instance->r1_fp_hold_timer, > + megasas_change_r1_fp_status, > + MEGASAS_RAID1_FAST_PATH_STATUS_CHECK_INTERVAL); > + dev_info(&instance->pdev->dev, "starting the raid 1 fp timer with interval %d\n", > + MEGASAS_RAID1_FAST_PATH_STATUS_CHECK_INTERVAL); > + } > + > return 0; > > fail_get_ld_pd_list: > @@ -6161,6 +6193,9 @@ static void megasas_shutdown_controller(struct megasas_instance *instance, > if (instance->requestorId && !instance->skip_heartbeat_timer_del) > del_timer_sync(&instance->sriov_heartbeat_timer); > > + if (instance->is_ventura) > + del_timer_sync(&instance->r1_fp_hold_timer); > + > megasas_flush_cache(instance); > megasas_shutdown_controller(instance, MR_DCMD_HIBERNATE_SHUTDOWN); > > @@ -6280,6 +6315,16 @@ static void megasas_shutdown_controller(struct megasas_instance *instance, > megasas_setup_jbod_map(instance); > instance->unload = 0; > > + if (instance->is_ventura) { > + atomic64_set(&instance->bytes_wrote, 0); > + atomic_set(&instance->r1_write_fp_capable, 1); > + megasas_start_timer(instance, > + &instance->r1_fp_hold_timer, > + megasas_change_r1_fp_status, > + MEGASAS_RAID1_FAST_PATH_STATUS_CHECK_INTERVAL); > + } > + > + > /* > * Initiate AEN (Asynchronous Event Notification) > */ > @@ -6368,6 +6413,9 @@ static void megasas_detach_one(struct pci_dev *pdev) > if (instance->requestorId && !instance->skip_heartbeat_timer_del) > del_timer_sync(&instance->sriov_heartbeat_timer); > > + if (instance->is_ventura) > + del_timer_sync(&instance->r1_fp_hold_timer); > + > if (instance->fw_crash_state != UNAVAILABLE) > megasas_free_host_crash_buffer(instance); > scsi_remove_host(instance->host); > diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c b/drivers/scsi/megaraid/megaraid_sas_fp.c > index a6957a3..7da4685 100644 > --- a/drivers/scsi/megaraid/megaraid_sas_fp.c > +++ b/drivers/scsi/megaraid/megaraid_sas_fp.c > @@ -197,14 +197,19 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance) > > if (instance->max_raid_mapsize) { > fw_map_dyn = fusion->ld_map[(instance->map_id & 1)]; > + if (fw_map_dyn->pci_threshold_bandwidth) > + instance->pci_threshold_bandwidth = > + le64_to_cpu(fw_map_dyn->pci_threshold_bandwidth); > #if VD_EXT_DEBUG > dev_dbg(&instance->pdev->dev, > " raidMapSize 0x%x fw_map_dyn->descTableOffset 0x%x, " > - " descTableSize 0x%x descTableNumElements 0x%x\n", > + " descTableSize 0x%x descTableNumElements 0x%x, " > + " PCIThreasholdBandwidth %llu\n", > le32_to_cpu(fw_map_dyn->raid_map_size), > le32_to_cpu(fw_map_dyn->desc_table_offset), > le32_to_cpu(fw_map_dyn->desc_table_size), > - le32_to_cpu(fw_map_dyn->desc_table_num_elements)); > + le32_to_cpu(fw_map_dyn->desc_table_num_elements), > + instance->pci_threshold_bandwidth); > dev_dbg(&instance->pdev->dev, > "drv map %p ldCount %d\n", drv_map, fw_map_dyn->ld_count); > #endif > @@ -434,6 +439,8 @@ void MR_PopulateDrvRaidMap(struct megasas_instance *instance) > sizeof(struct MR_DEV_HANDLE_INFO) * > MAX_RAIDMAP_PHYSICAL_DEVICES); > } > + if (instance->is_ventura && !instance->pci_threshold_bandwidth) > + instance->pci_threshold_bandwidth = ULLONG_MAX; > } > > /* > diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c > index f968a23..5992153 100644 > --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c > +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c > @@ -95,6 +95,7 @@ void megasas_start_timer(struct megasas_instance *instance, > extern unsigned int dual_qdepth_disable; > static void megasas_free_rdpq_fusion(struct megasas_instance *instance); > static void megasas_free_reply_fusion(struct megasas_instance *instance); > +void megasas_change_r1_fp_status(unsigned long instance_addr); > > > > @@ -2633,8 +2634,9 @@ void megasas_prepare_secondRaid1_IO(struct megasas_instance *instance, > * to get new command > */ > if (cmd->is_raid_1_fp_write && > - atomic_inc_return(&instance->fw_outstanding) > > - (instance->host->can_queue)) { > + (atomic_inc_return(&instance->fw_outstanding) > > + (instance->host->can_queue) || > + (!atomic_read(&instance->r1_write_fp_capable)))) { > megasas_fpio_to_ldio(instance, cmd, cmd->scmd); > atomic_dec(&instance->fw_outstanding); > } else if (cmd->is_raid_1_fp_write) { > @@ -2643,17 +2645,19 @@ void megasas_prepare_secondRaid1_IO(struct megasas_instance *instance, > megasas_prepare_secondRaid1_IO(instance, cmd, r1_cmd); > } > > - > /* > - * Issue the command to the FW > - */ > + * Issue the command to the FW > + */ > + if (scmd->sc_data_direction == PCI_DMA_TODEVICE && instance->is_ventura) > + atomic64_add(scsi_bufflen(scmd), &instance->bytes_wrote); You count the bytes written to the ventura card and based on that it is asynchronously decided whether the r1_write_fp_capable bit is set in a timer function. Please explain what should be achieved with this. Thanks, Tomas > > megasas_fire_cmd_fusion(instance, req_desc, instance->is_ventura); > > - if (r1_cmd) > + if (r1_cmd) { > + atomic64_add(scsi_bufflen(scmd), &instance->bytes_wrote); > megasas_fire_cmd_fusion(instance, r1_cmd->request_desc, > - instance->is_ventura); > - > + instance->is_ventura); > + } > > return 0; > } > diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h > index c39c4ed..da05790 100644 > --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h > +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h > @@ -977,7 +977,7 @@ struct MR_FW_RAID_MAP_DYNAMIC { > u32 desc_table_size; /* Total Size of desc table */ > /* Total Number of elements in the desc table */ > u32 desc_table_num_elements; > - u64 reserved1; > + u64 pci_threshold_bandwidth; > u32 reserved2[3]; /*future use */ > /* timeout value used by driver in FP IOs */ > u8 fp_pd_io_timeout_sec;