virtio-blk: live migrate s->rq with multiqueue
Add a field for the virtqueue index when migrating the s->rq request list. The new field is only needed when num_queues > 1. Existing QEMUs are unaffected by this change and therefore virtio-blk migration stays compatible. Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 1466511196-12612-6-git-send-email-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									edaffd9f0b
								
							
						
					
					
						commit
						30d8bf6d17
					
				| 
						 | 
				
			
			@ -808,6 +808,11 @@ static void virtio_blk_save_device(VirtIODevice *vdev, QEMUFile *f)
 | 
			
		|||
 | 
			
		||||
    while (req) {
 | 
			
		||||
        qemu_put_sbyte(f, 1);
 | 
			
		||||
 | 
			
		||||
        if (s->conf.num_queues > 1) {
 | 
			
		||||
            qemu_put_be32(f, virtio_get_queue_index(req->vq));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        qemu_put_virtqueue_element(f, &req->elem);
 | 
			
		||||
        req = req->next;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -831,9 +836,22 @@ static int virtio_blk_load_device(VirtIODevice *vdev, QEMUFile *f,
 | 
			
		|||
    VirtIOBlock *s = VIRTIO_BLK(vdev);
 | 
			
		||||
 | 
			
		||||
    while (qemu_get_sbyte(f)) {
 | 
			
		||||
        unsigned nvqs = s->conf.num_queues;
 | 
			
		||||
        unsigned vq_idx = 0;
 | 
			
		||||
        VirtIOBlockReq *req;
 | 
			
		||||
 | 
			
		||||
        if (nvqs > 1) {
 | 
			
		||||
            vq_idx = qemu_get_be32(f);
 | 
			
		||||
 | 
			
		||||
            if (vq_idx >= nvqs) {
 | 
			
		||||
                error_report("Invalid virtqueue index in request list: %#x",
 | 
			
		||||
                             vq_idx);
 | 
			
		||||
                return -EINVAL;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        req = qemu_get_virtqueue_element(f, sizeof(VirtIOBlockReq));
 | 
			
		||||
        virtio_blk_init_request(s, s->vq, req);
 | 
			
		||||
        virtio_blk_init_request(s, virtio_get_queue(vdev, vq_idx), req);
 | 
			
		||||
        req->next = s->rq;
 | 
			
		||||
        s->rq = req;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue