Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

virtio-scsi: reset virtqueue affinity when doing cpu hotplug

Add hot cpu notifier to reset the request virtqueue affinity
when doing cpu hotplug.

Cc: linux-scsi@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Wanlong Gao <gaowanlong@cn.fujitsu.com>
Reviewed-by: Asias He <asias@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

authored by

Wanlong Gao and committed by
Rusty Russell
285e71ea 9141a4ca

+29
+29
drivers/scsi/virtio_scsi.c
··· 110 110 /* If the affinity hint is set for virtqueues */ 111 111 bool affinity_hint_set; 112 112 113 + /* CPU hotplug notifier */ 114 + struct notifier_block nb; 115 + 113 116 struct virtio_scsi_vq ctrl_vq; 114 117 struct virtio_scsi_vq event_vq; 115 118 struct virtio_scsi_vq req_vqs[]; ··· 765 762 put_online_cpus(); 766 763 } 767 764 765 + static int virtscsi_cpu_callback(struct notifier_block *nfb, 766 + unsigned long action, void *hcpu) 767 + { 768 + struct virtio_scsi *vscsi = container_of(nfb, struct virtio_scsi, nb); 769 + switch(action) { 770 + case CPU_ONLINE: 771 + case CPU_ONLINE_FROZEN: 772 + case CPU_DEAD: 773 + case CPU_DEAD_FROZEN: 774 + __virtscsi_set_affinity(vscsi, true); 775 + break; 776 + default: 777 + break; 778 + } 779 + return NOTIFY_OK; 780 + } 781 + 768 782 static void virtscsi_init_vq(struct virtio_scsi_vq *virtscsi_vq, 769 783 struct virtqueue *vq) 770 784 { ··· 904 884 if (err) 905 885 goto virtscsi_init_failed; 906 886 887 + vscsi->nb.notifier_call = &virtscsi_cpu_callback; 888 + err = register_hotcpu_notifier(&vscsi->nb); 889 + if (err) { 890 + pr_err("registering cpu notifier failed\n"); 891 + goto scsi_add_host_failed; 892 + } 893 + 907 894 cmd_per_lun = virtscsi_config_get(vdev, cmd_per_lun) ?: 1; 908 895 shost->cmd_per_lun = min_t(u32, cmd_per_lun, shost->can_queue); 909 896 shost->max_sectors = virtscsi_config_get(vdev, max_sectors) ?: 0xFFFF; ··· 947 920 virtscsi_cancel_event_work(vscsi); 948 921 949 922 scsi_remove_host(shost); 923 + 924 + unregister_hotcpu_notifier(&vscsi->nb); 950 925 951 926 virtscsi_remove_vqs(vdev); 952 927 scsi_host_put(shost);