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

Commit b15ebe0b authored by Dan Williams's avatar Dan Williams Committed by James Bottomley
Browse files

[SCSI] libsas: replace event locks with atomic bitops



The locks only served to make sure the pending event bitmask was updated
consistently.

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 756f173f
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -295,8 +295,7 @@ static void sas_discover_domain(struct work_struct *work)
		container_of(work, struct sas_discovery_event, work);
	struct asd_sas_port *port = ev->port;

	sas_begin_event(DISCE_DISCOVER_DOMAIN, &port->disc.disc_event_lock,
			&port->disc.pending);
	clear_bit(DISCE_DISCOVER_DOMAIN, &port->disc.pending);

	if (port->port_dev)
		return;
@@ -355,8 +354,7 @@ static void sas_revalidate_domain(struct work_struct *work)
		container_of(work, struct sas_discovery_event, work);
	struct asd_sas_port *port = ev->port;

	sas_begin_event(DISCE_REVALIDATE_DOMAIN, &port->disc.disc_event_lock,
			&port->disc.pending);
	clear_bit(DISCE_REVALIDATE_DOMAIN, &port->disc.pending);

	SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id,
		    task_pid_nr(current));
@@ -379,8 +377,7 @@ int sas_discover_event(struct asd_sas_port *port, enum discover_event ev)

	BUG_ON(ev >= DISC_NUM_EVENTS);

	sas_queue_event(ev, &disc->disc_event_lock, &disc->pending,
			&disc->disc_work[ev].work, port->ha);
	sas_queue_event(ev, &disc->pending, &disc->disc_work[ev].work, port->ha);

	return 0;
}
@@ -400,7 +397,6 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port)
		[DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
	};

	spin_lock_init(&disc->disc_event_lock);
	disc->pending = 0;
	for (i = 0; i < DISC_NUM_EVENTS; i++) {
		INIT_WORK(&disc->disc_work[i].work, sas_event_fns[i]);
+3 −5
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event)
{
	BUG_ON(event >= HA_NUM_EVENTS);

	sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending,
	sas_queue_event(event, &sas_ha->pending,
			&sas_ha->ha_events[event].work, sas_ha);
}

@@ -40,7 +40,7 @@ static void notify_port_event(struct asd_sas_phy *phy, enum port_event event)

	BUG_ON(event >= PORT_NUM_EVENTS);

	sas_queue_event(event, &ha->event_lock, &phy->port_events_pending,
	sas_queue_event(event, &phy->port_events_pending,
			&phy->port_events[event].work, ha);
}

@@ -50,7 +50,7 @@ static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event)

	BUG_ON(event >= PHY_NUM_EVENTS);

	sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending,
	sas_queue_event(event, &phy->phy_events_pending,
			&phy->phy_events[event].work, ha);
}

@@ -62,8 +62,6 @@ int sas_init_events(struct sas_ha_struct *sas_ha)

	int i;

	spin_lock_init(&sas_ha->event_lock);

	for (i = 0; i < HA_NUM_EVENTS; i++) {
		INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]);
		sas_ha->ha_events[i].ha = sas_ha;
+1 −2
Original line number Diff line number Diff line
@@ -97,8 +97,7 @@ void sas_hae_reset(struct work_struct *work)
		container_of(work, struct sas_ha_event, work);
	struct sas_ha_struct *ha = ev->ha;

	sas_begin_event(HAE_RESET, &ha->event_lock,
			&ha->pending);
	clear_bit(HAE_RESET, &ha->pending);
}

int sas_register_ha(struct sas_ha_struct *sas_ha)
+7 −25
Original line number Diff line number Diff line
@@ -92,36 +92,18 @@ static inline int sas_smp_host_handler(struct Scsi_Host *shost,
}
#endif

static inline void sas_queue_event(int event, spinlock_t *lock,
				   unsigned long *pending,
static inline void sas_queue_event(int event, unsigned long *pending,
				   struct work_struct *work,
				   struct sas_ha_struct *sas_ha)
{
	if (!test_and_set_bit(event, pending)) {
		unsigned long flags;

	spin_lock_irqsave(lock, flags);
	if (test_bit(event, pending)) {
		spin_unlock_irqrestore(lock, flags);
		return;
	}
	__set_bit(event, pending);
	spin_unlock_irqrestore(lock, flags);

		spin_lock_irqsave(&sas_ha->state_lock, flags);
	if (sas_ha->state != SAS_HA_UNREGISTERED) {
		if (sas_ha->state != SAS_HA_UNREGISTERED)
			scsi_queue_work(sas_ha->core.shost, work);
	}
		spin_unlock_irqrestore(&sas_ha->state_lock, flags);
	}

static inline void sas_begin_event(int event, spinlock_t *lock,
				   unsigned long *pending)
{
	unsigned long flags;

	spin_lock_irqsave(lock, flags);
	__clear_bit(event, pending);
	spin_unlock_irqrestore(lock, flags);
}

static inline void sas_fill_in_rphy(struct domain_device *dev,
+4 −8
Original line number Diff line number Diff line
@@ -36,8 +36,7 @@ static void sas_phye_loss_of_signal(struct work_struct *work)
		container_of(work, struct asd_sas_event, work);
	struct asd_sas_phy *phy = ev->phy;

	sas_begin_event(PHYE_LOSS_OF_SIGNAL, &phy->ha->event_lock,
			&phy->phy_events_pending);
	clear_bit(PHYE_LOSS_OF_SIGNAL, &phy->phy_events_pending);
	phy->error = 0;
	sas_deform_port(phy, 1);
}
@@ -48,8 +47,7 @@ static void sas_phye_oob_done(struct work_struct *work)
		container_of(work, struct asd_sas_event, work);
	struct asd_sas_phy *phy = ev->phy;

	sas_begin_event(PHYE_OOB_DONE, &phy->ha->event_lock,
			&phy->phy_events_pending);
	clear_bit(PHYE_OOB_DONE, &phy->phy_events_pending);
	phy->error = 0;
}

@@ -63,8 +61,7 @@ static void sas_phye_oob_error(struct work_struct *work)
	struct sas_internal *i =
		to_sas_internal(sas_ha->core.shost->transportt);

	sas_begin_event(PHYE_OOB_ERROR, &phy->ha->event_lock,
			&phy->phy_events_pending);
	clear_bit(PHYE_OOB_ERROR, &phy->phy_events_pending);

	sas_deform_port(phy, 1);

@@ -95,8 +92,7 @@ static void sas_phye_spinup_hold(struct work_struct *work)
	struct sas_internal *i =
		to_sas_internal(sas_ha->core.shost->transportt);

	sas_begin_event(PHYE_SPINUP_HOLD, &phy->ha->event_lock,
			&phy->phy_events_pending);
	clear_bit(PHYE_SPINUP_HOLD, &phy->phy_events_pending);

	phy->error = 0;
	i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD, NULL);
Loading