Merge remote-tracking branch 'lsk/v3.10/topic/earlycon' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / virtio_scsi.c
index 74b88efde6ad408123de6a9b96ec37460195fe82..95a5d73e675c37c2cc33fa0b16305c2e325e368d 100644 (file)
@@ -751,8 +751,12 @@ static void __virtscsi_set_affinity(struct virtio_scsi *vscsi, bool affinity)
 
                vscsi->affinity_hint_set = true;
        } else {
-               for (i = 0; i < vscsi->num_queues; i++)
+               for (i = 0; i < vscsi->num_queues; i++) {
+                       if (!vscsi->req_vqs[i].vq)
+                               continue;
+
                        virtqueue_set_affinity(vscsi->req_vqs[i].vq, -1);
+               }
 
                vscsi->affinity_hint_set = false;
        }
@@ -957,6 +961,10 @@ static void virtscsi_remove(struct virtio_device *vdev)
 #ifdef CONFIG_PM
 static int virtscsi_freeze(struct virtio_device *vdev)
 {
+       struct Scsi_Host *sh = virtio_scsi_host(vdev);
+       struct virtio_scsi *vscsi = shost_priv(sh);
+
+       unregister_hotcpu_notifier(&vscsi->nb);
        virtscsi_remove_vqs(vdev);
        return 0;
 }
@@ -965,8 +973,17 @@ static int virtscsi_restore(struct virtio_device *vdev)
 {
        struct Scsi_Host *sh = virtio_scsi_host(vdev);
        struct virtio_scsi *vscsi = shost_priv(sh);
+       int err;
 
-       return virtscsi_init(vdev, vscsi);
+       err = virtscsi_init(vdev, vscsi);
+       if (err)
+               return err;
+
+       err = register_hotcpu_notifier(&vscsi->nb);
+       if (err)
+               vdev->config->del_vqs(vdev);
+
+       return err;
 }
 #endif