2 * s390 storage attributes device -- KVM object
4 * Copyright 2016 IBM Corp.
5 * Author(s): Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
7 * This work is licensed under the terms of the GNU GPL, version 2 or (at
8 * your option) any later version. See the COPYING file in the top-level
12 #include "qemu/osdep.h"
13 #include "hw/boards.h"
14 #include "migration/qemu-file.h"
15 #include "hw/s390x/storage-attributes.h"
16 #include "qemu/error-report.h"
17 #include "sysemu/kvm.h"
18 #include "exec/ram_addr.h"
21 Object
*kvm_s390_stattrib_create(void)
24 kvm_check_extension(kvm_state
, KVM_CAP_S390_CMMA_MIGRATION
)) {
25 return object_new(TYPE_KVM_S390_STATTRIB
);
30 static void kvm_s390_stattrib_instance_init(Object
*obj
)
32 KVMS390StAttribState
*sas
= KVM_S390_STATTRIB(obj
);
37 static int kvm_s390_stattrib_read_helper(S390StAttribState
*sa
,
43 KVMS390StAttribState
*sas
= KVM_S390_STATTRIB(sa
);
45 struct kvm_s390_cmma_log clog
= {
46 .values
= (uint64_t)values
,
47 .start_gfn
= *start_gfn
,
52 r
= kvm_vm_ioctl(kvm_state
, KVM_S390_GET_CMMA_BITS
, &clog
);
54 error_report("KVM_S390_GET_CMMA_BITS failed: %s", strerror(-r
));
58 *start_gfn
= clog
.start_gfn
;
59 sas
->still_dirty
= clog
.remaining
;
63 static int kvm_s390_stattrib_get_stattr(S390StAttribState
*sa
,
68 return kvm_s390_stattrib_read_helper(sa
, start_gfn
, count
, values
, 0);
71 static int kvm_s390_stattrib_peek_stattr(S390StAttribState
*sa
,
76 return kvm_s390_stattrib_read_helper(sa
, &start_gfn
, count
, values
,
80 static int kvm_s390_stattrib_set_stattr(S390StAttribState
*sa
,
85 KVMS390StAttribState
*sas
= KVM_S390_STATTRIB(sa
);
86 MachineState
*machine
= MACHINE(qdev_get_machine());
87 unsigned long max
= machine
->maxram_size
/ TARGET_PAGE_SIZE
;
89 if (start_gfn
+ count
> max
) {
90 error_report("Out of memory bounds when setting storage attributes");
93 if (!sas
->incoming_buffer
) {
94 sas
->incoming_buffer
= g_malloc0(max
);
97 memcpy(sas
->incoming_buffer
+ start_gfn
, values
, count
);
102 static void kvm_s390_stattrib_synchronize(S390StAttribState
*sa
)
104 KVMS390StAttribState
*sas
= KVM_S390_STATTRIB(sa
);
105 MachineState
*machine
= MACHINE(qdev_get_machine());
106 unsigned long max
= machine
->maxram_size
/ TARGET_PAGE_SIZE
;
107 unsigned long cx
, len
= 1 << 19;
109 struct kvm_s390_cmma_log clog
= {
114 if (sas
->incoming_buffer
) {
115 for (cx
= 0; cx
+ len
<= max
; cx
+= len
) {
118 clog
.values
= (uint64_t)(sas
->incoming_buffer
+ cx
* len
);
119 r
= kvm_vm_ioctl(kvm_state
, KVM_S390_SET_CMMA_BITS
, &clog
);
121 error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r
));
127 clog
.count
= max
- cx
;
128 clog
.values
= (uint64_t)(sas
->incoming_buffer
+ cx
* len
);
129 r
= kvm_vm_ioctl(kvm_state
, KVM_S390_SET_CMMA_BITS
, &clog
);
131 error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r
));
134 g_free(sas
->incoming_buffer
);
135 sas
->incoming_buffer
= NULL
;
139 static int kvm_s390_stattrib_set_migrationmode(S390StAttribState
*sa
, bool val
)
141 struct kvm_device_attr attr
= {
142 .group
= KVM_S390_VM_MIGRATION
,
146 return kvm_vm_ioctl(kvm_state
, KVM_SET_DEVICE_ATTR
, &attr
);
149 static long long kvm_s390_stattrib_get_dirtycount(S390StAttribState
*sa
)
151 KVMS390StAttribState
*sas
= KVM_S390_STATTRIB(sa
);
154 kvm_s390_stattrib_peek_stattr(sa
, 0, 1, val
);
155 return sas
->still_dirty
;
158 static int kvm_s390_stattrib_get_active(S390StAttribState
*sa
)
160 return kvm_s390_cmma_active() && sa
->migration_enabled
;
163 static void kvm_s390_stattrib_class_init(ObjectClass
*oc
, void *data
)
165 S390StAttribClass
*sac
= S390_STATTRIB_CLASS(oc
);
167 sac
->get_stattr
= kvm_s390_stattrib_get_stattr
;
168 sac
->peek_stattr
= kvm_s390_stattrib_peek_stattr
;
169 sac
->set_stattr
= kvm_s390_stattrib_set_stattr
;
170 sac
->set_migrationmode
= kvm_s390_stattrib_set_migrationmode
;
171 sac
->get_dirtycount
= kvm_s390_stattrib_get_dirtycount
;
172 sac
->synchronize
= kvm_s390_stattrib_synchronize
;
173 sac
->get_active
= kvm_s390_stattrib_get_active
;
176 static const TypeInfo kvm_s390_stattrib_info
= {
177 .name
= TYPE_KVM_S390_STATTRIB
,
178 .parent
= TYPE_S390_STATTRIB
,
179 .instance_init
= kvm_s390_stattrib_instance_init
,
180 .instance_size
= sizeof(KVMS390StAttribState
),
181 .class_init
= kvm_s390_stattrib_class_init
,
182 .class_size
= sizeof(S390StAttribClass
),
185 static void kvm_s390_stattrib_register_types(void)
187 type_register_static(&kvm_s390_stattrib_info
);
190 type_init(kvm_s390_stattrib_register_types
)