On 01/13/2016 11:04 AM, Christoph Hellwig wrote:
On Wed, Jan 13, 2016 at 08:02:02AM +0100, Hannes Reinecke wrote:
+ /* Check for existing port_group references */
+ spin_lock(&h->pg_lock);
+ if (h->pg) {
+ old_pg = pg;
+ /* port_group has changed. Update to new port group */
+ if (h->pg != pg) {
+ old_pg = h->pg;
+ rcu_assign_pointer(h->pg, pg);
+ pg_updated = true;
+ }
+ } else {
+ rcu_assign_pointer(h->pg, pg);
+ pg_updated = true;
+ }
+ alua_rtpg_queue(h->pg, sdev, NULL);
+ spin_unlock(&h->pg_lock);
+
+ if (pg_updated)
+ synchronize_rcu();
+ if (old_pg) {
+ if (old_pg->rtpg_sdev)
+ flush_delayed_work(&old_pg->rtpg_work);
+ kref_put(&old_pg->kref, release_port_group);
+ }
The synchronize_rcu() needs to be done in release_port_group, or even
better be replaced by doing a kfree_rcu there instead of a kfree.
Point is that we don't necessarily have an old_pg to call
release_port_group() on, but we still need to call synchronize_rcu()
to inform everyong that h->pg now has a new value.
No, you don't. synchronize_rcu() just waits for all previously
started RCU grace periods to finish. If old_pg doesn't get freed
you don't need to wait for the grace period. synchronize_rcu does
not notify anyone about anything, it just waits.
Ah. Right. Good point. Of course we don't need to call it if there's
nothing to be freed.
Will be folding it into the next round of patches, or just resending
this one if the remaining patches meets with approval.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@xxxxxxx +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html