Message ID | 20170124071724.4572.85855.stgit@PASHA-ISP (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 24/01/2017 08:17, Pavel Dovgalyuk wrote: > This patch implements saving/restoring of static apic_delivered variable. > > Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> > --- > hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ > include/hw/i386/apic_internal.h | 2 ++ > 2 files changed, 34 insertions(+) > > diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c > index d78c885..ac6cc67 100644 > --- a/hw/intc/apic_common.c > +++ b/hw/intc/apic_common.c > @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) > return s->wait_for_sipi != 0; > } > > +static bool apic_irq_delivered_needed(void *opaque) > +{ > + return true; Is it needed for CPUs except the first (or the last?)? Paolo > +} > + > +static void apic_irq_delivered_pre_save(void *opaque) > +{ > + APICCommonState *s = APIC_COMMON(opaque); > + s->apic_irq_delivered = apic_irq_delivered; > +} > + > +static int apic_irq_delivered_post_load(void *opaque, int version_id) > +{ > + APICCommonState *s = APIC_COMMON(opaque); > + apic_irq_delivered = s->apic_irq_delivered; > + return 0; > +} > + > static const VMStateDescription vmstate_apic_common_sipi = { > .name = "apic_sipi", > .version_id = 1, > @@ -396,6 +414,19 @@ static const VMStateDescription vmstate_apic_common_sipi = { > } > }; > > +static const VMStateDescription vmstate_apic_irq_delivered = { > + .name = "apic_irq_delivered", > + .version_id = 1, > + .minimum_version_id = 1, > + .needed = apic_irq_delivered_needed, > + .pre_save = apic_irq_delivered_pre_save, > + .post_load = apic_irq_delivered_post_load, > + .fields = (VMStateField[]) { > + VMSTATE_INT32(apic_irq_delivered, APICCommonState), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static const VMStateDescription vmstate_apic_common = { > .name = "apic", > .version_id = 3, > @@ -430,6 +461,7 @@ static const VMStateDescription vmstate_apic_common = { > }, > .subsections = (const VMStateDescription*[]) { > &vmstate_apic_common_sipi, > + &vmstate_apic_irq_delivered, > NULL > } > }; > diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h > index 1209eb4..20ad28c 100644 > --- a/include/hw/i386/apic_internal.h > +++ b/include/hw/i386/apic_internal.h > @@ -189,6 +189,8 @@ struct APICCommonState { > DeviceState *vapic; > hwaddr vapic_paddr; /* note: persistence via kvmvapic */ > bool legacy_instance_id; > + > + int apic_irq_delivered; /* for saving static variable */ > }; > > typedef struct VAPICState { > > >
> From: Paolo Bonzini [mailto:paolo.bonzini@gmail.com] On Behalf Of Paolo Bonzini > On 24/01/2017 08:17, Pavel Dovgalyuk wrote: > > This patch implements saving/restoring of static apic_delivered variable. > > > > Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> > > --- > > hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ > > include/hw/i386/apic_internal.h | 2 ++ > > 2 files changed, 34 insertions(+) > > > > diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c > > index d78c885..ac6cc67 100644 > > --- a/hw/intc/apic_common.c > > +++ b/hw/intc/apic_common.c > > @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) > > return s->wait_for_sipi != 0; > > } > > > > +static bool apic_irq_delivered_needed(void *opaque) > > +{ > > + return true; > > Is it needed for CPUs except the first (or the last?)? > As this is global variable, it is needed only for one CPU. Do you mean that APIC state is saved for every CPU? > > +} > > + > > +static void apic_irq_delivered_pre_save(void *opaque) > > +{ > > + APICCommonState *s = APIC_COMMON(opaque); > > + s->apic_irq_delivered = apic_irq_delivered; > > +} > > + > > +static int apic_irq_delivered_post_load(void *opaque, int version_id) > > +{ > > + APICCommonState *s = APIC_COMMON(opaque); > > + apic_irq_delivered = s->apic_irq_delivered; > > + return 0; > > +} > > + > > static const VMStateDescription vmstate_apic_common_sipi = { > > .name = "apic_sipi", > > .version_id = 1, > > @@ -396,6 +414,19 @@ static const VMStateDescription vmstate_apic_common_sipi = { > > } > > }; > > > > +static const VMStateDescription vmstate_apic_irq_delivered = { > > + .name = "apic_irq_delivered", > > + .version_id = 1, > > + .minimum_version_id = 1, > > + .needed = apic_irq_delivered_needed, > > + .pre_save = apic_irq_delivered_pre_save, > > + .post_load = apic_irq_delivered_post_load, > > + .fields = (VMStateField[]) { > > + VMSTATE_INT32(apic_irq_delivered, APICCommonState), > > + VMSTATE_END_OF_LIST() > > + } > > +}; > > + > > static const VMStateDescription vmstate_apic_common = { > > .name = "apic", > > .version_id = 3, > > @@ -430,6 +461,7 @@ static const VMStateDescription vmstate_apic_common = { > > }, > > .subsections = (const VMStateDescription*[]) { > > &vmstate_apic_common_sipi, > > + &vmstate_apic_irq_delivered, > > NULL > > } > > }; > > diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h > > index 1209eb4..20ad28c 100644 > > --- a/include/hw/i386/apic_internal.h > > +++ b/include/hw/i386/apic_internal.h > > @@ -189,6 +189,8 @@ struct APICCommonState { > > DeviceState *vapic; > > hwaddr vapic_paddr; /* note: persistence via kvmvapic */ > > bool legacy_instance_id; > > + > > + int apic_irq_delivered; /* for saving static variable */ > > }; > > > > typedef struct VAPICState { > > > > > > Pavel Dovgalyuk
On 25/01/2017 12:52, Pavel Dovgalyuk wrote: >> From: Paolo Bonzini [mailto:paolo.bonzini@gmail.com] On Behalf Of Paolo Bonzini >> On 24/01/2017 08:17, Pavel Dovgalyuk wrote: >>> This patch implements saving/restoring of static apic_delivered variable. >>> >>> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> >>> --- >>> hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ >>> include/hw/i386/apic_internal.h | 2 ++ >>> 2 files changed, 34 insertions(+) >>> >>> diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c >>> index d78c885..ac6cc67 100644 >>> --- a/hw/intc/apic_common.c >>> +++ b/hw/intc/apic_common.c >>> @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) >>> return s->wait_for_sipi != 0; >>> } >>> >>> +static bool apic_irq_delivered_needed(void *opaque) >>> +{ >>> + return true; >> >> Is it needed for CPUs except the first (or the last?)? >> > > As this is global variable, it is needed only for one CPU. > Do you mean that APIC state is saved for every CPU? Yes, each CPU has its own APIC. Paolo >>> +} >>> + >>> +static void apic_irq_delivered_pre_save(void *opaque) >>> +{ >>> + APICCommonState *s = APIC_COMMON(opaque); >>> + s->apic_irq_delivered = apic_irq_delivered; >>> +} >>> + >>> +static int apic_irq_delivered_post_load(void *opaque, int version_id) >>> +{ >>> + APICCommonState *s = APIC_COMMON(opaque); >>> + apic_irq_delivered = s->apic_irq_delivered; >>> + return 0; >>> +} >>> + >>> static const VMStateDescription vmstate_apic_common_sipi = { >>> .name = "apic_sipi", >>> .version_id = 1, >>> @@ -396,6 +414,19 @@ static const VMStateDescription vmstate_apic_common_sipi = { >>> } >>> }; >>> >>> +static const VMStateDescription vmstate_apic_irq_delivered = { >>> + .name = "apic_irq_delivered", >>> + .version_id = 1, >>> + .minimum_version_id = 1, >>> + .needed = apic_irq_delivered_needed, >>> + .pre_save = apic_irq_delivered_pre_save, >>> + .post_load = apic_irq_delivered_post_load, >>> + .fields = (VMStateField[]) { >>> + VMSTATE_INT32(apic_irq_delivered, APICCommonState), >>> + VMSTATE_END_OF_LIST() >>> + } >>> +}; >>> + >>> static const VMStateDescription vmstate_apic_common = { >>> .name = "apic", >>> .version_id = 3, >>> @@ -430,6 +461,7 @@ static const VMStateDescription vmstate_apic_common = { >>> }, >>> .subsections = (const VMStateDescription*[]) { >>> &vmstate_apic_common_sipi, >>> + &vmstate_apic_irq_delivered, >>> NULL >>> } >>> }; >>> diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h >>> index 1209eb4..20ad28c 100644 >>> --- a/include/hw/i386/apic_internal.h >>> +++ b/include/hw/i386/apic_internal.h >>> @@ -189,6 +189,8 @@ struct APICCommonState { >>> DeviceState *vapic; >>> hwaddr vapic_paddr; /* note: persistence via kvmvapic */ >>> bool legacy_instance_id; >>> + >>> + int apic_irq_delivered; /* for saving static variable */ >>> }; >>> >>> typedef struct VAPICState { >>> >>> >>> > > Pavel Dovgalyuk >
> From: Paolo Bonzini [mailto:pbonzini@redhat.com] > On 25/01/2017 12:52, Pavel Dovgalyuk wrote: > >> From: Paolo Bonzini [mailto:paolo.bonzini@gmail.com] On Behalf Of Paolo Bonzini > >> On 24/01/2017 08:17, Pavel Dovgalyuk wrote: > >>> This patch implements saving/restoring of static apic_delivered variable. > >>> > >>> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> > >>> --- > >>> hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ > >>> include/hw/i386/apic_internal.h | 2 ++ > >>> 2 files changed, 34 insertions(+) > >>> > >>> diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c > >>> index d78c885..ac6cc67 100644 > >>> --- a/hw/intc/apic_common.c > >>> +++ b/hw/intc/apic_common.c > >>> @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) > >>> return s->wait_for_sipi != 0; > >>> } > >>> > >>> +static bool apic_irq_delivered_needed(void *opaque) > >>> +{ > >>> + return true; > >> > >> Is it needed for CPUs except the first (or the last?)? > >> > > > > As this is global variable, it is needed only for one CPU. > > Do you mean that APIC state is saved for every CPU? > > Yes, each CPU has its own APIC. How to link this data to a single CPU? Pavel Dovgalyuk
On 25/01/2017 14:01, Pavel Dovgalyuk wrote: >> From: Paolo Bonzini [mailto:pbonzini@redhat.com] >> On 25/01/2017 12:52, Pavel Dovgalyuk wrote: >>>> From: Paolo Bonzini [mailto:paolo.bonzini@gmail.com] On Behalf Of Paolo Bonzini >>>> On 24/01/2017 08:17, Pavel Dovgalyuk wrote: >>>>> This patch implements saving/restoring of static apic_delivered variable. >>>>> >>>>> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> >>>>> --- >>>>> hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ >>>>> include/hw/i386/apic_internal.h | 2 ++ >>>>> 2 files changed, 34 insertions(+) >>>>> >>>>> diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c >>>>> index d78c885..ac6cc67 100644 >>>>> --- a/hw/intc/apic_common.c >>>>> +++ b/hw/intc/apic_common.c >>>>> @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) >>>>> return s->wait_for_sipi != 0; >>>>> } >>>>> >>>>> +static bool apic_irq_delivered_needed(void *opaque) >>>>> +{ >>>>> + return true; >>>> >>>> Is it needed for CPUs except the first (or the last?)? >>>> >>> >>> As this is global variable, it is needed only for one CPU. >>> Do you mean that APIC state is saved for every CPU? >> >> Yes, each CPU has its own APIC. > > How to link this data to a single CPU? Since it's global, you only need to migrate it once. You're migrating the same value many times. Paolo
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c index d78c885..ac6cc67 100644 --- a/hw/intc/apic_common.c +++ b/hw/intc/apic_common.c @@ -384,6 +384,24 @@ static bool apic_common_sipi_needed(void *opaque) return s->wait_for_sipi != 0; } +static bool apic_irq_delivered_needed(void *opaque) +{ + return true; +} + +static void apic_irq_delivered_pre_save(void *opaque) +{ + APICCommonState *s = APIC_COMMON(opaque); + s->apic_irq_delivered = apic_irq_delivered; +} + +static int apic_irq_delivered_post_load(void *opaque, int version_id) +{ + APICCommonState *s = APIC_COMMON(opaque); + apic_irq_delivered = s->apic_irq_delivered; + return 0; +} + static const VMStateDescription vmstate_apic_common_sipi = { .name = "apic_sipi", .version_id = 1, @@ -396,6 +414,19 @@ static const VMStateDescription vmstate_apic_common_sipi = { } }; +static const VMStateDescription vmstate_apic_irq_delivered = { + .name = "apic_irq_delivered", + .version_id = 1, + .minimum_version_id = 1, + .needed = apic_irq_delivered_needed, + .pre_save = apic_irq_delivered_pre_save, + .post_load = apic_irq_delivered_post_load, + .fields = (VMStateField[]) { + VMSTATE_INT32(apic_irq_delivered, APICCommonState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_apic_common = { .name = "apic", .version_id = 3, @@ -430,6 +461,7 @@ static const VMStateDescription vmstate_apic_common = { }, .subsections = (const VMStateDescription*[]) { &vmstate_apic_common_sipi, + &vmstate_apic_irq_delivered, NULL } }; diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h index 1209eb4..20ad28c 100644 --- a/include/hw/i386/apic_internal.h +++ b/include/hw/i386/apic_internal.h @@ -189,6 +189,8 @@ struct APICCommonState { DeviceState *vapic; hwaddr vapic_paddr; /* note: persistence via kvmvapic */ bool legacy_instance_id; + + int apic_irq_delivered; /* for saving static variable */ }; typedef struct VAPICState {
This patch implements saving/restoring of static apic_delivered variable. Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> --- hw/intc/apic_common.c | 32 ++++++++++++++++++++++++++++++++ include/hw/i386/apic_internal.h | 2 ++ 2 files changed, 34 insertions(+)