Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 918134ef authored by nagalakshmi.nandigama@lsi.com's avatar nagalakshmi.nandigama@lsi.com Committed by James Bottomley
Browse files

[SCSI] mpt2sas: Fix for deadlock between hot plug worker threads and host reset context



This is due to driver reporting a device missing to the OS then the OS sending
a SYNC_CACHE request to driver while the IO queues are locked due to host reset.

To fix the issue, the driver will be waking up the port enable context
immediately when the driver receives the reply message, instead of waiting
on the hot plug worker threads.

Signed-off-by: default avatarNagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent f3db032f
Loading
Loading
Loading
Loading
+18 −12
Original line number Original line Diff line number Diff line
@@ -3059,6 +3059,7 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle)
		"handle(0x%04x), sas_addr(0x%016llx)\n", ioc->name, handle,
		"handle(0x%04x), sas_addr(0x%016llx)\n", ioc->name, handle,
			(unsigned long long)sas_address));
			(unsigned long long)sas_address));
		_scsih_ublock_io_device(ioc, handle);
		_scsih_ublock_io_device(ioc, handle);
		sas_target_priv_data->handle = MPT2SAS_INVALID_DEVICE_HANDLE;
	}
	}


	smid = mpt2sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx);
	smid = mpt2sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx);
@@ -5201,6 +5202,9 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc,
	if (sas_device_backup.starget && sas_device_backup.starget->hostdata) {
	if (sas_device_backup.starget && sas_device_backup.starget->hostdata) {
		sas_target_priv_data = sas_device_backup.starget->hostdata;
		sas_target_priv_data = sas_device_backup.starget->hostdata;
		sas_target_priv_data->deleted = 1;
		sas_target_priv_data->deleted = 1;
		_scsih_ublock_io_device(ioc, sas_device_backup.handle);
		sas_target_priv_data->handle =
		     MPT2SAS_INVALID_DEVICE_HANDLE;
	}
	}


	_scsih_ublock_io_device(ioc, sas_device_backup.handle);
	_scsih_ublock_io_device(ioc, sas_device_backup.handle);
@@ -5354,7 +5358,7 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
		_scsih_sas_topology_change_event_debug(ioc, event_data);
		_scsih_sas_topology_change_event_debug(ioc, event_data);
#endif
#endif


	if (ioc->shost_recovery || ioc->remove_host || ioc->pci_error_recovery)
	if (ioc->remove_host || ioc->pci_error_recovery)
		return;
		return;


	if (!ioc->sas_hba.num_phys)
	if (!ioc->sas_hba.num_phys)
@@ -5415,6 +5419,9 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
		switch (reason_code) {
		switch (reason_code) {
		case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
		case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:


			if (ioc->shost_recovery)
				break;

			if (link_rate == prev_link_rate)
			if (link_rate == prev_link_rate)
				break;
				break;


@@ -5428,6 +5435,9 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
			break;
			break;
		case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
		case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:


			if (ioc->shost_recovery)
				break;

			mpt2sas_transport_update_links(ioc, sas_address,
			mpt2sas_transport_update_links(ioc, sas_address,
			    handle, phy_number, link_rate);
			    handle, phy_number, link_rate);


@@ -7087,11 +7097,17 @@ mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
		dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
		dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: "
		    "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
		    "MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
		_scsih_sas_host_refresh(ioc);
		_scsih_sas_host_refresh(ioc);
		_scsih_prep_device_scan(ioc);
		_scsih_search_responding_sas_devices(ioc);
		_scsih_search_responding_raid_devices(ioc);
		_scsih_search_responding_expanders(ioc);
		if (!ioc->is_driver_loading) {
			_scsih_prep_device_scan(ioc);
			_scsih_prep_device_scan(ioc);
			_scsih_search_responding_sas_devices(ioc);
			_scsih_search_responding_sas_devices(ioc);
			_scsih_search_responding_raid_devices(ioc);
			_scsih_search_responding_raid_devices(ioc);
			_scsih_search_responding_expanders(ioc);
			_scsih_search_responding_expanders(ioc);
			_scsih_error_recovery_delete_devices(ioc);
			_scsih_error_recovery_delete_devices(ioc);
		}
		break;
		break;
	}
	}
}
}
@@ -7126,17 +7142,7 @@ _firmware_event_work(struct work_struct *work)
		_scsih_scan_for_devices_after_reset(ioc);
		_scsih_scan_for_devices_after_reset(ioc);
		break;
		break;
	case MPT2SAS_PORT_ENABLE_COMPLETE:
	case MPT2SAS_PORT_ENABLE_COMPLETE:
		if (!ioc->is_driver_loading && ioc->shost_recovery) {
			_scsih_prep_device_scan(ioc);
			_scsih_search_responding_sas_devices(ioc);
			_scsih_search_responding_raid_devices(ioc);
			_scsih_search_responding_expanders(ioc);
		}

		if (ioc->start_scan)
		ioc->start_scan = 0;
		ioc->start_scan = 0;
		else
			complete(&ioc->port_enable_done);