RESEND mpt2sas : Config request and diag reset deadlock
PATCH 1/1 RESEND mpt2sas : Config request and diag reset deadlock
Moving the setting and clearing of the mutex's to _config_request. There was a mutex deadlock when diag reset is called from inside _config_request, so diag reset was moved to outside the mutexs.
Taken this patch against 2.6.31-rc6.
---
Signed-off-by Kashyap Desai <[email protected]>
Signed-off-by Eric Moore <[email protected]>
---
drivers/scsi/mpt2sas/mpt2sas_config.c +20 -65
@@ -236,12 +236,14 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_tMpi2ConfigRequest_t *config_request;int r;u8 retry_count; -u8 issue_reset; +u8 issue_host_reset =0 ;u16 wait_state_count; +mutex_lock (&ioc->config_cmds.mutex);if (ioc->config_cmds.status !=MPT2_CMD_NOT_USED ) {printk (MPT2SAS_ERR_FMT "%s: config_cmd in use\n" , ioc->name, __func__); +mutex_unlock (&ioc->config_cmds.mutex);return -EAGAIN ; } retry_count =0 ;
@@ -260,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_tprintk (MPT2SAS_ERR_FMT "%s: failed due to ioc not operational\n" , ioc->name, __func__); - ioc->config_cmds.status =MPT2_CMD_NOT_USED ; -return -EFAULT ; + r = -EFAULT ; + goto out; }ssleep (1 ); ioc_state =mpt2sas_base_get_iocstate (ioc,1 );
@@ -277,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_tif (!smid) {printk (MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n" , ioc->name, __func__); - ioc->config_cmds.status =MPT2_CMD_NOT_USED ; -return -EAGAIN ; + r = -EAGAIN ; + goto out; } r =0 ;
@@ -298,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t ioc->name, __func__);_debug_dump_mf (mpi_request,sizeof (Mpi2ConfigRequest_t)/4 ); -if (!(ioc->config_cmds.status &MPT2_CMD_RESET )) - issue_reset =1 ; - goto issue_host_reset; + retry_count++; +if (ioc->config_cmds.smid == smid) +mpt2sas_base_free_smid (ioc, smid); +if ((ioc->shost_recovery) || + (ioc->config_cmds.status &MPT2_CMD_RESET )) + goto retry_config; + issue_host_reset =1 ; + r = -EFAULT ; + goto out; }if (ioc->config_cmds.status &MPT2_CMD_REPLY_VALID ) memcpy(mpi_reply, ioc->config_cmds.reply,
@@ -308,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_tif (retry_count)printk (MPT2SAS_INFO_FMT "%s: retry completed!!\n" , ioc->name, __func__); +out: ioc->config_cmds.status =MPT2_CMD_NOT_USED ; -return r; - - issue_host_reset: -if (issue_reset) +mutex_unlock (&ioc->config_cmds.mutex); +if (issue_host_reset)mpt2sas_base_hard_reset_handler (ioc,CAN_SLEEP ,FORCE_BIG_HAMMER ); - ioc->config_cmds.status =MPT2_CMD_NOT_USED ; -if (!retry_count) { -printk (MPT2SAS_INFO_FMT "%s: attempting retry\n" , - ioc->name, __func__); - retry_count++; - goto retry_config; - } -return -EFAULT ; +return r; }/**
@@ -381,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2ManufacturingPage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -423,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -444,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2BiosPage2_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -486,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -507,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2BiosPage3_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -549,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -570,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2IOUnitPage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -612,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -633,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2IOUnitPage1_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -675,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -696,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ; mpi_request.Action =MPI2_CONFIG_ACTION_PAGE_HEADER ;
@@ -738,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -759,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2IOCPage8_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -801,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -824,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2SasDevicePage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -869,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -892,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2SasDevicePage1_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -937,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -959,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)Mpi2ConfigReply_t mpi_reply;Mpi2SasIOUnitPage0_t config_page; -mutex_lock (&ioc->config_cmds.mutex);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ; mpi_request.Action =MPI2_CONFIG_ACTION_PAGE_HEADER ;
@@ -1008,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1032,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tMpi2ConfigRequest_t mpi_request;int r;struct config_request mem; - -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 , sz);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1076,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1101,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 , sz);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1144,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1167,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2ExpanderPage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1212,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1236,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2ExpanderPage1_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1283,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1306,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2SasEnclosurePage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1351,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1373,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2SasPhyPage0_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1419,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1441,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2SasPhyPage1_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1487,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1511,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (config_page,0 ,sizeof (Mpi2RaidVolPage1_t));memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1554,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1578,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,struct config_request mem;u16 ioc_status; -mutex_lock (&ioc->config_cmds.mutex);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); *num_pds =0 ; mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1626,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1651,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,int r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t));memset (config_page,0 , sz); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1693,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1717,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_tint r;struct config_request mem; -mutex_lock (&ioc->config_cmds.mutex);memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t));memset (config_page,0 ,sizeof (Mpi2RaidPhysDiskPage0_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1760,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }
@@ -1784,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,struct config_request mem;u16 ioc_status; -mutex_lock (&ioc->config_cmds.mutex); *volume_handle =0 ;memset (&mpi_request,0 ,sizeof (Mpi2ConfigRequest_t)); mpi_request.Function =MPI2_FUNCTION_CONFIG ;
@@ -1848,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,_config_free_config_dma_memory (ioc, &mem); out: -mutex_unlock (&ioc->config_cmds.mutex);return r; }