On Wed, Mar 20, 2013 at 03:01:24PM +0800, Wanlong Gao wrote: > Add hot cpu notifier to reset the request virtqueue affinity > when doing cpu hotplug. > > Cc: linux-scsi@xxxxxxxxxxxxxxx > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Signed-off-by: Wanlong Gao <gaowanlong@xxxxxxxxxxxxxx> > Reviewed-by: Asias He <asias@xxxxxxxxxx> > --- > drivers/scsi/virtio_scsi.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c > index 13d7672..0ad9017 100644 > --- a/drivers/scsi/virtio_scsi.c > +++ b/drivers/scsi/virtio_scsi.c > @@ -110,6 +110,9 @@ struct virtio_scsi { > /* if the affinity hint is set for virtqueues */ > bool affinity_hint_set; > > + /* CPU hotplug notifier */ > + struct notifier_block nb; > + > struct virtio_scsi_vq ctrl_vq; > struct virtio_scsi_vq event_vq; > struct virtio_scsi_vq req_vqs[]; > @@ -762,6 +765,23 @@ static void virtscsi_set_affinity(struct virtio_scsi *vscsi, bool affinity) > put_online_cpus(); > } > > +static int virtscsi_cpu_callback(struct notifier_block *nfb, > + unsigned long action, void *hcpu) > +{ > + struct virtio_scsi *vscsi = container_of(nfb, struct virtio_scsi, nb); > + switch(action) { > + case CPU_ONLINE: > + case CPU_ONLINE_FROZEN: > + case CPU_DEAD: > + case CPU_DEAD_FROZEN: > + __virtscsi_set_affinity(vscsi, true); > + break; > + default: > + break; > + } > + return NOTIFY_OK; > +} > + > static void virtscsi_init_vq(struct virtio_scsi_vq *virtscsi_vq, > struct virtqueue *vq) > { > @@ -884,6 +904,13 @@ static int virtscsi_probe(struct virtio_device *vdev) > if (err) > goto virtscsi_init_failed; > > + vscsi->nb.notifier_call = &virtscsi_cpu_callback; > + err = register_hotcpu_notifier(&vscsi->nb); > + if (err) { > + pr_err("registering cpu notifier failed\n"); > + goto scsi_add_host_failed; > + } > + > cmd_per_lun = virtscsi_config_get(vdev, cmd_per_lun) ?: 1; > shost->cmd_per_lun = min_t(u32, cmd_per_lun, shost->can_queue); > shost->max_sectors = virtscsi_config_get(vdev, max_sectors) ?: 0xFFFF; > @@ -921,6 +948,8 @@ static void virtscsi_remove(struct virtio_device *vdev) > > scsi_remove_host(shost); > > + unregister_hotcpu_notifier(&vscsi->nb); > + > virtscsi_remove_vqs(vdev); > scsi_host_put(shost); > } > -- > 1.8.2.rc2 > This one does not apply on top of virtio-next + patch 1-4 in this series. -- Asias -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html