mpt fusion: [2.6.30-rc6] Rescan SAS topology added
Subsystems (2)
PATCH 17/24 mpt fusion: [2.6.30-rc6] Rescan SAS topology added
1.) SAS topology Rescan is added. If Firmware is doing Reset and we get Device add interrupt from Firmware, we will not receive it as part of Reset is going ON. After Reset we will do special Rescan of SAS topology. 2.) Driver version changed from 3.04.08 to 3.04.09.
---
---
drivers/message/fusion/mptbase.h +4 -2
@@ -76,8 +76,8 @@#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR#endif -#define MPT_LINUX_VERSION_COMMON "3.04.08" -#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.08" +#define MPT_LINUX_VERSION_COMMON "3.04.09" +#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09"#define WHAT_MAGIC_STRING "@" "(" "#" ")"#define show_mptmod_ver (s,ver) \
@@ -711,6 +711,7 @@ typedef struct _MPT_ADAPTERu16 hba_port_num_phy;struct list_head sas_device_info_list;struct mutex sas_device_info_mutex; +u8 old_sas_discovery_protocal;u8 sas_discovery_quiesce_io;int sas_index;/* index refrencing */ MPT_MGMT sas_mgmt;
@@ -741,6 +742,7 @@ typedef struct _MPT_ADAPTERspinlock_t fault_reset_work_lock;u8 sg_addr_size; +u8 in_rescan;u8 SGE_size; }MPT_ADAPTER ;
drivers/message/fusion/mptsas.c +161 -0
215 lines not on this page · raw message
James Bottomley
maintainerQuoted 22 lines · Desai
drivers/message/fusion/mptsas.c +18
-0@@ -3176,6 +3220,116 @@ mptsas_send_link_status_event(struct fw_event_work *fw_event)mptsas_free_fw_event (ioc, fw_event); } +static void +mptsas_not_responding_devices (MPT_ADAPTER *ioc) +{ +struct mptsas_portinfo buffer, *port_info; +struct sas_device_info *sas_info; +struct mptsas_devinfo sas_device; +u32 handle; +VirtTarget *vtarget =NULL ; +struct mptsas_phyinfo *phy_info; +u8 found_expander; +int retval, retry_count; +unsigned long flags; + +mpt_findImVolumes (ioc); + +spin_lock_irqsave (&ioc->taskmgmt_lock, flags); +if (ioc->ioc_reset_in_progress) { + dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT
drivers/message/fusion/mptsas.c mptsas_send_link_status_event(struct fw_event_work *fw_event) · line 3250
Quoted 10 lines
drivers/message/fusion/mptsas.c +10
-0+"%s: exiting due to a parallel reset \n" , ioc->name, + __func__)); +spin_unlock_irqrestore (&ioc->taskmgmt_lock, flags); +return ; + } +spin_unlock_irqrestore (&ioc->taskmgmt_lock, flags); + +/* devices, logical volumes */ + redo_device_scan: +list_for_each_entry (sas_info, &ioc->sas_device_info_list, list) {
This list is supposed to be protected by the sas_device_info_mutex, isn't it ... where is that taken to protect the traversal?
Quoted 45 lines
drivers/message/fusion/mptsas.c +45
-0+ sas_device.handle =0 ; + retry_count =0 ; +retry_page: + retval =mptsas_sas_device_pg0 (ioc, &sas_device, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <<MPI_SAS_DEVICE_PGAD_FORM_SHIFT ), + (sas_info->fw.channel <<8 ) + + sas_info->fw.id); + +if (sas_device.handle) +continue ; +if (retval == -EBUSY ) { +spin_lock_irqsave (&ioc->taskmgmt_lock, flags); +if (ioc->ioc_reset_in_progress) { +dfailprintk (ioc, +printk (MYIOC_s_DEBUG_FMT +"%s: exiting due to reset\n" , + ioc->name, __func__)); +spin_unlock_irqrestore + (&ioc->taskmgmt_lock, flags); +return ; + } +spin_unlock_irqrestore (&ioc->taskmgmt_lock, + flags); + } + +if (retval && (retval != -ENODEV )) { +if (retry_count <10 ) { + retry_count++; + goto retry_page; + }else { +devtprintk (ioc,printk (MYIOC_s_DEBUG_FMT +"%s: Config page retry exceeded retry " +"count deleting device 0x%llx\n" , + ioc->name, __func__, + sas_info->sas_address)); + } + } + +/* delete device */ + vtarget =mptsas_find_vtarget (ioc, + sas_info->fw.channel, sas_info->fw.id); +if (vtarget) + vtarget->deleted =1 ; + phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
drivers/message/fusion/mptsas.c mptsas_send_link_status_event(struct fw_event_work *fw_event) · line 3305
Quoted 10 lines
drivers/message/fusion/mptsas.c +10
-0+ sas_info->sas_address); +if (phy_info) { +mptsas_del_end_device (ioc, phy_info); + goto redo_device_scan; + } + } + +/* expanders */ + redo_expander_scan: +list_for_each_entry (port_info, &ioc->sas_topology, list) {
And this one is supposed to be protected by the sas_topology_mutex, where is that taken?
James
James,
Yes, both the place mutex required. Why we did not consider mutex in those places just because of FW events will be off while doing rescan. But by design your suggestion makes more sense.
I have modified patch and resent along with other comments for different patches.
Thanks,
Kashyap
-----Original Message-----
From: James Bottomley [mailto:[email protected]]
Sent: Wednesday, May 27, 2009 11:10 PM
To: Desai, Kashyap
Cc: [email protected]; Moore, Eric; Prakash, Sathya
Subject: Re: [PATCH 17/24] mpt fusion: [2.6.30-rc6] Rescan SAS topology added
Quoted 22 lines · Desai
drivers/message/fusion/mptsas.c +18
-0@@ -3176,6 +3220,116 @@ mptsas_send_link_status_event(struct fw_event_work *fw_event)mptsas_free_fw_event (ioc, fw_event); } +static void +mptsas_not_responding_devices (MPT_ADAPTER *ioc) +{ +struct mptsas_portinfo buffer, *port_info; +struct sas_device_info *sas_info; +struct mptsas_devinfo sas_device; +u32 handle; +VirtTarget *vtarget =NULL ; +struct mptsas_phyinfo *phy_info; +u8 found_expander; +int retval, retry_count; +unsigned long flags; + +mpt_findImVolumes (ioc); + +spin_lock_irqsave (&ioc->taskmgmt_lock, flags); +if (ioc->ioc_reset_in_progress) { + dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT
drivers/message/fusion/mptsas.c mptsas_send_link_status_event(struct fw_event_work *fw_event) · line 3250
Quoted 10 lines
drivers/message/fusion/mptsas.c +10
-0+"%s: exiting due to a parallel reset \n" , ioc->name, + __func__)); +spin_unlock_irqrestore (&ioc->taskmgmt_lock, flags); +return ; + } +spin_unlock_irqrestore (&ioc->taskmgmt_lock, flags); + +/* devices, logical volumes */ + redo_device_scan: +list_for_each_entry (sas_info, &ioc->sas_device_info_list, list) {
This list is supposed to be protected by the sas_device_info_mutex, isn't it ... where is that taken to protect the traversal?
Quoted 45 lines
drivers/message/fusion/mptsas.c +45
-0+ sas_device.handle =0 ; + retry_count =0 ; +retry_page: + retval =mptsas_sas_device_pg0 (ioc, &sas_device, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <<MPI_SAS_DEVICE_PGAD_FORM_SHIFT ), + (sas_info->fw.channel <<8 ) + + sas_info->fw.id); + +if (sas_device.handle) +continue ; +if (retval == -EBUSY ) { +spin_lock_irqsave (&ioc->taskmgmt_lock, flags); +if (ioc->ioc_reset_in_progress) { +dfailprintk (ioc, +printk (MYIOC_s_DEBUG_FMT +"%s: exiting due to reset\n" , + ioc->name, __func__)); +spin_unlock_irqrestore + (&ioc->taskmgmt_lock, flags); +return ; + } +spin_unlock_irqrestore (&ioc->taskmgmt_lock, + flags); + } + +if (retval && (retval != -ENODEV )) { +if (retry_count <10 ) { + retry_count++; + goto retry_page; + }else { +devtprintk (ioc,printk (MYIOC_s_DEBUG_FMT +"%s: Config page retry exceeded retry " +"count deleting device 0x%llx\n" , + ioc->name, __func__, + sas_info->sas_address)); + } + } + +/* delete device */ + vtarget =mptsas_find_vtarget (ioc, + sas_info->fw.channel, sas_info->fw.id); +if (vtarget) + vtarget->deleted =1 ; + phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
drivers/message/fusion/mptsas.c mptsas_send_link_status_event(struct fw_event_work *fw_event) · line 3305
Quoted 10 lines
drivers/message/fusion/mptsas.c +10
-0+ sas_info->sas_address); +if (phy_info) { +mptsas_del_end_device (ioc, phy_info); + goto redo_device_scan; + } + } + +/* expanders */ + redo_expander_scan: +list_for_each_entry (port_info, &ioc->sas_topology, list) {
And this one is supposed to be protected by the sas_topology_mutex, where is that taken?
James