KVM: introduce id_to_memslot function
Introduce id_to_memslot to get memslot by slot id Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
		
							parent
							
								
									be6ba0f096
								
							
						
					
					
						commit
						28a37544fb
					
				| @ -1818,7 +1818,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||||
| 	if (log->slot >= KVM_MEMORY_SLOTS) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	memslot = &kvm->memslots->memslots[log->slot]; | ||||
| 	memslot = id_to_memslot(kvm->memslots, log->slot); | ||||
| 	r = -ENOENT; | ||||
| 	if (!memslot->dirty_bitmap) | ||||
| 		goto out; | ||||
|  | ||||
| @ -498,7 +498,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||||
| 
 | ||||
| 	/* If nothing is dirty, don't bother messing with page tables. */ | ||||
| 	if (is_dirty) { | ||||
| 		memslot = &kvm->memslots->memslots[log->slot]; | ||||
| 		memslot = id_to_memslot(kvm->memslots, log->slot); | ||||
| 
 | ||||
| 		ga = memslot->base_gfn << PAGE_SHIFT; | ||||
| 		ga_end = ga + (memslot->npages << PAGE_SHIFT); | ||||
|  | ||||
| @ -2711,11 +2711,13 @@ static gva_t rmode_tss_base(struct kvm *kvm) | ||||
| { | ||||
| 	if (!kvm->arch.tss_addr) { | ||||
| 		struct kvm_memslots *slots; | ||||
| 		struct kvm_memory_slot *slot; | ||||
| 		gfn_t base_gfn; | ||||
| 
 | ||||
| 		slots = kvm_memslots(kvm); | ||||
| 		base_gfn = slots->memslots[0].base_gfn + | ||||
| 				 kvm->memslots->memslots[0].npages - 3; | ||||
| 		slot = id_to_memslot(slots, 0); | ||||
| 		base_gfn = slot->base_gfn + slot->npages - 3; | ||||
| 
 | ||||
| 		return base_gfn << PAGE_SHIFT; | ||||
| 	} | ||||
| 	return kvm->arch.tss_addr; | ||||
|  | ||||
| @ -3520,7 +3520,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||||
| 	if (log->slot >= KVM_MEMORY_SLOTS) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	memslot = &kvm->memslots->memslots[log->slot]; | ||||
| 	memslot = id_to_memslot(kvm->memslots, log->slot); | ||||
| 	r = -ENOENT; | ||||
| 	if (!memslot->dirty_bitmap) | ||||
| 		goto out; | ||||
| @ -3531,27 +3531,27 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||||
| 	/* If nothing is dirty, don't bother messing with page tables. */ | ||||
| 	if (nr_dirty_pages) { | ||||
| 		struct kvm_memslots *slots, *old_slots; | ||||
| 		unsigned long *dirty_bitmap; | ||||
| 		unsigned long *dirty_bitmap, *dirty_bitmap_head; | ||||
| 
 | ||||
| 		dirty_bitmap = memslot->dirty_bitmap_head; | ||||
| 		if (memslot->dirty_bitmap == dirty_bitmap) | ||||
| 			dirty_bitmap += n / sizeof(long); | ||||
| 		memset(dirty_bitmap, 0, n); | ||||
| 		dirty_bitmap = memslot->dirty_bitmap; | ||||
| 		dirty_bitmap_head = memslot->dirty_bitmap_head; | ||||
| 		if (dirty_bitmap == dirty_bitmap_head) | ||||
| 			dirty_bitmap_head += n / sizeof(long); | ||||
| 		memset(dirty_bitmap_head, 0, n); | ||||
| 
 | ||||
| 		r = -ENOMEM; | ||||
| 		slots = kzalloc(sizeof(struct kvm_memslots), GFP_KERNEL); | ||||
| 		if (!slots) | ||||
| 			goto out; | ||||
| 		memcpy(slots, kvm->memslots, sizeof(struct kvm_memslots)); | ||||
| 		memslot = &slots->memslots[log->slot]; | ||||
| 		memslot->dirty_bitmap = dirty_bitmap; | ||||
| 		memslot = id_to_memslot(slots, log->slot); | ||||
| 		memslot->nr_dirty_pages = 0; | ||||
| 		memslot->dirty_bitmap = dirty_bitmap_head; | ||||
| 		update_memslots(slots, NULL); | ||||
| 
 | ||||
| 		old_slots = kvm->memslots; | ||||
| 		rcu_assign_pointer(kvm->memslots, slots); | ||||
| 		synchronize_srcu_expedited(&kvm->srcu); | ||||
| 		dirty_bitmap = old_slots->memslots[log->slot].dirty_bitmap; | ||||
| 		kfree(old_slots); | ||||
| 
 | ||||
| 		write_protect_slot(kvm, memslot, dirty_bitmap, nr_dirty_pages); | ||||
|  | ||||
| @ -333,6 +333,12 @@ static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm) | ||||
| 			|| lockdep_is_held(&kvm->slots_lock)); | ||||
| } | ||||
| 
 | ||||
| static inline struct kvm_memory_slot * | ||||
| id_to_memslot(struct kvm_memslots *slots, int id) | ||||
| { | ||||
| 	return &slots->memslots[id]; | ||||
| } | ||||
| 
 | ||||
| #define HPA_MSB ((sizeof(hpa_t) * 8) - 1) | ||||
| #define HPA_ERR_MASK ((hpa_t)1 << HPA_MSB) | ||||
| static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; } | ||||
|  | ||||
| @ -634,8 +634,9 @@ void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new) | ||||
| { | ||||
| 	if (new) { | ||||
| 		int id = new->id; | ||||
| 		struct kvm_memory_slot *old = id_to_memslot(slots, id); | ||||
| 
 | ||||
| 		slots->memslots[id] = *new; | ||||
| 		*old = *new; | ||||
| 		if (id >= slots->nmemslots) | ||||
| 			slots->nmemslots = id + 1; | ||||
| 	} | ||||
| @ -681,7 +682,7 @@ int __kvm_set_memory_region(struct kvm *kvm, | ||||
| 	if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	memslot = &kvm->memslots->memslots[mem->slot]; | ||||
| 	memslot = id_to_memslot(kvm->memslots, mem->slot); | ||||
| 	base_gfn = mem->guest_phys_addr >> PAGE_SHIFT; | ||||
| 	npages = mem->memory_size >> PAGE_SHIFT; | ||||
| 
 | ||||
| @ -788,12 +789,16 @@ skip_lpage: | ||||
| #endif /* not defined CONFIG_S390 */ | ||||
| 
 | ||||
| 	if (!npages) { | ||||
| 		struct kvm_memory_slot *slot; | ||||
| 
 | ||||
| 		r = -ENOMEM; | ||||
| 		slots = kmemdup(kvm->memslots, sizeof(struct kvm_memslots), | ||||
| 				GFP_KERNEL); | ||||
| 		if (!slots) | ||||
| 			goto out_free; | ||||
| 		slots->memslots[mem->slot].flags |= KVM_MEMSLOT_INVALID; | ||||
| 		slot = id_to_memslot(slots, mem->slot); | ||||
| 		slot->flags |= KVM_MEMSLOT_INVALID; | ||||
| 
 | ||||
| 		update_memslots(slots, NULL); | ||||
| 
 | ||||
| 		old_memslots = kvm->memslots; | ||||
| @ -897,7 +902,7 @@ int kvm_get_dirty_log(struct kvm *kvm, | ||||
| 	if (log->slot >= KVM_MEMORY_SLOTS) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	memslot = &kvm->memslots->memslots[log->slot]; | ||||
| 	memslot = id_to_memslot(kvm->memslots, log->slot); | ||||
| 	r = -ENOENT; | ||||
| 	if (!memslot->dirty_bitmap) | ||||
| 		goto out; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user