Message ID | 1534166953-15041-2-git-send-email-rppt@linux.vnet.ibm.com |
---|---|
State | Accepted |
Series | "lazy-pages: always use pre-copy for stack" |
Headers | show |
diff --git a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h index eeb68be..4662f76 100644 --- a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h +++ b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h @@ -20,6 +20,7 @@ typedef struct user_fpsimd_state user_fpregs_struct_t; #define REG_RES(r) ((uint64_t)(r).regs[0]) #define REG_IP(r) ((uint64_t)(r).pc) +#define REG_SP(r) ((uint64_t)((r).sp)) #define REG_SYSCALL_NR(r) ((uint64_t)(r).regs[8]) #define user_regs_native(pregs) true diff --git a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h index 03442ee..b8286d4 100644 --- a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h +++ b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h @@ -54,6 +54,7 @@ struct user_vfp_exc { #define REG_RES(regs) ((regs).ARM_r0) #define REG_IP(regs) ((regs).ARM_pc) +#define REG_SP(regs) ((regs).ARM_sp) #define REG_SYSCALL_NR(regs) ((regs).ARM_r7) #define user_regs_native(pregs) true diff --git a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h index 4b8a200..89fc4aa 100644 --- a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h +++ b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h @@ -74,6 +74,7 @@ typedef struct { #define REG_RES(regs) ((uint64_t)(regs).gpr[3]) #define REG_IP(regs) ((uint64_t)(regs).nip) +#define REG_SP(regs) ((uint64_t)(regs).gpr[1]) #define REG_SYSCALL_NR(regs) ((uint64_t)(regs).gpr[0]) #define user_regs_native(pregs) true diff --git a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h index 9386998..fddf65d 100644 --- a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h +++ b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h @@ -64,6 +64,7 @@ typedef struct { #define REG_RES(r) ((uint64_t)(r).prstatus.gprs[2]) #define REG_IP(r) ((uint64_t)(r).prstatus.psw.addr) +#define REG_SP(r) ((uint64_t)(r).prstatus.gprs[15]) /* * We assume that REG_SYSCALL_NR() is only used for pie code where we * always use svc 0 with opcode in %r1. diff --git a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h index af42461..e6d3949 100644 --- a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h +++ b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h @@ -111,6 +111,7 @@ typedef struct xsave_struct user_fpregs_struct_t; #define REG_RES(regs) get_user_reg(®s, ax) #define REG_IP(regs) get_user_reg(®s, ip) +#define REG_SP(regs) get_user_reg(®s, sp) #define REG_SYSCALL_NR(regs) get_user_reg(®s, orig_ax) #define __NR(syscall, compat) ((compat) ? __NR32_##syscall : __NR_##syscall) diff --git a/compel/include/uapi/infect.h b/compel/include/uapi/infect.h index f087f21..3b98f2d 100644 --- a/compel/include/uapi/infect.h +++ b/compel/include/uapi/infect.h @@ -165,4 +165,7 @@ extern void compel_relocs_apply(void *mem, void *vbase, size_t size, compel_relo extern unsigned long compel_task_size(void); +extern uint64_t compel_get_leader_sp(struct parasite_ctl *ctl); +extern uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl); + #endif diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c index d51b8aa..4648e39 100644 --- a/compel/src/lib/infect.c +++ b/compel/src/lib/infect.c @@ -1585,3 +1585,13 @@ struct parasite_blob_desc *compel_parasite_blob_desc(struct parasite_ctl *ctl) { return &ctl->pblob; } + +uint64_t compel_get_leader_sp(struct parasite_ctl *ctl) +{ + return REG_SP(ctl->orig.regs); +} + +uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl) +{ + return REG_SP(tctl->th.regs); +}
Looks good On 08/13/2018 03:29 PM, Mike Rapoport wrote: > We need to know what are stack pointers of every thread to ensure that the > current stack page will not be treated as lazy. Acked-by: Alice Frosi <alice@linux.vnet.ibm.com> > Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com> > --- > compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/arm/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/s390/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/x86/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/include/uapi/infect.h | 3 +++ > compel/src/lib/infect.c | 10 ++++++++++ > 7 files changed, 18 insertions(+) > > diff --git a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > index eeb68be..4662f76 100644 > --- a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > @@ -20,6 +20,7 @@ typedef struct user_fpsimd_state user_fpregs_struct_t; > > #define REG_RES(r) ((uint64_t)(r).regs[0]) > #define REG_IP(r) ((uint64_t)(r).pc) > +#define REG_SP(r) ((uint64_t)((r).sp)) > #define REG_SYSCALL_NR(r) ((uint64_t)(r).regs[8]) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > index 03442ee..b8286d4 100644 > --- a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > @@ -54,6 +54,7 @@ struct user_vfp_exc { > > #define REG_RES(regs) ((regs).ARM_r0) > #define REG_IP(regs) ((regs).ARM_pc) > +#define REG_SP(regs) ((regs).ARM_sp) > #define REG_SYSCALL_NR(regs) ((regs).ARM_r7) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > index 4b8a200..89fc4aa 100644 > --- a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > @@ -74,6 +74,7 @@ typedef struct { > > #define REG_RES(regs) ((uint64_t)(regs).gpr[3]) > #define REG_IP(regs) ((uint64_t)(regs).nip) > +#define REG_SP(regs) ((uint64_t)(regs).gpr[1]) > #define REG_SYSCALL_NR(regs) ((uint64_t)(regs).gpr[0]) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > index 9386998..fddf65d 100644 > --- a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > @@ -64,6 +64,7 @@ typedef struct { > > #define REG_RES(r) ((uint64_t)(r).prstatus.gprs[2]) > #define REG_IP(r) ((uint64_t)(r).prstatus.psw.addr) > +#define REG_SP(r) ((uint64_t)(r).prstatus.gprs[15]) > /* > * We assume that REG_SYSCALL_NR() is only used for pie code where we > * always use svc 0 with opcode in %r1. > diff --git a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > index af42461..e6d3949 100644 > --- a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > @@ -111,6 +111,7 @@ typedef struct xsave_struct user_fpregs_struct_t; > > #define REG_RES(regs) get_user_reg(®s, ax) > #define REG_IP(regs) get_user_reg(®s, ip) > +#define REG_SP(regs) get_user_reg(®s, sp) > #define REG_SYSCALL_NR(regs) get_user_reg(®s, orig_ax) > > #define __NR(syscall, compat) ((compat) ? __NR32_##syscall : __NR_##syscall) > diff --git a/compel/include/uapi/infect.h b/compel/include/uapi/infect.h > index f087f21..3b98f2d 100644 > --- a/compel/include/uapi/infect.h > +++ b/compel/include/uapi/infect.h > @@ -165,4 +165,7 @@ extern void compel_relocs_apply(void *mem, void *vbase, size_t size, compel_relo > > extern unsigned long compel_task_size(void); > > +extern uint64_t compel_get_leader_sp(struct parasite_ctl *ctl); > +extern uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl); > + > #endif > diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c > index d51b8aa..4648e39 100644 > --- a/compel/src/lib/infect.c > +++ b/compel/src/lib/infect.c > @@ -1585,3 +1585,13 @@ struct parasite_blob_desc *compel_parasite_blob_desc(struct parasite_ctl *ctl) > { > return &ctl->pblob; > } > + > +uint64_t compel_get_leader_sp(struct parasite_ctl *ctl) > +{ > + return REG_SP(ctl->orig.regs); > +} > + > +uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl) > +{ > + return REG_SP(tctl->th.regs); > +}
On 13/08/2018 15:29, Mike Rapoport wrote: > We need to know what are stack pointers of every thread to ensure that the > current stack page will not be treated as lazy. For the ppc64's part: Reviewed-by: Laurent Dufour <ldufour@linux.vnet.ibm.com> > > Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com> > --- > compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/arm/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/s390/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/arch/x86/src/lib/include/uapi/asm/infect-types.h | 1 + > compel/include/uapi/infect.h | 3 +++ > compel/src/lib/infect.c | 10 ++++++++++ > 7 files changed, 18 insertions(+) > > diff --git a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > index eeb68be..4662f76 100644 > --- a/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h > @@ -20,6 +20,7 @@ typedef struct user_fpsimd_state user_fpregs_struct_t; > > #define REG_RES(r) ((uint64_t)(r).regs[0]) > #define REG_IP(r) ((uint64_t)(r).pc) > +#define REG_SP(r) ((uint64_t)((r).sp)) > #define REG_SYSCALL_NR(r) ((uint64_t)(r).regs[8]) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > index 03442ee..b8286d4 100644 > --- a/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/arm/src/lib/include/uapi/asm/infect-types.h > @@ -54,6 +54,7 @@ struct user_vfp_exc { > > #define REG_RES(regs) ((regs).ARM_r0) > #define REG_IP(regs) ((regs).ARM_pc) > +#define REG_SP(regs) ((regs).ARM_sp) > #define REG_SYSCALL_NR(regs) ((regs).ARM_r7) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > index 4b8a200..89fc4aa 100644 > --- a/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h > @@ -74,6 +74,7 @@ typedef struct { > > #define REG_RES(regs) ((uint64_t)(regs).gpr[3]) > #define REG_IP(regs) ((uint64_t)(regs).nip) > +#define REG_SP(regs) ((uint64_t)(regs).gpr[1]) > #define REG_SYSCALL_NR(regs) ((uint64_t)(regs).gpr[0]) > > #define user_regs_native(pregs) true > diff --git a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > index 9386998..fddf65d 100644 > --- a/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/s390/src/lib/include/uapi/asm/infect-types.h > @@ -64,6 +64,7 @@ typedef struct { > > #define REG_RES(r) ((uint64_t)(r).prstatus.gprs[2]) > #define REG_IP(r) ((uint64_t)(r).prstatus.psw.addr) > +#define REG_SP(r) ((uint64_t)(r).prstatus.gprs[15]) > /* > * We assume that REG_SYSCALL_NR() is only used for pie code where we > * always use svc 0 with opcode in %r1. > diff --git a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > index af42461..e6d3949 100644 > --- a/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > +++ b/compel/arch/x86/src/lib/include/uapi/asm/infect-types.h > @@ -111,6 +111,7 @@ typedef struct xsave_struct user_fpregs_struct_t; > > #define REG_RES(regs) get_user_reg(®s, ax) > #define REG_IP(regs) get_user_reg(®s, ip) > +#define REG_SP(regs) get_user_reg(®s, sp) > #define REG_SYSCALL_NR(regs) get_user_reg(®s, orig_ax) > > #define __NR(syscall, compat) ((compat) ? __NR32_##syscall : __NR_##syscall) > diff --git a/compel/include/uapi/infect.h b/compel/include/uapi/infect.h > index f087f21..3b98f2d 100644 > --- a/compel/include/uapi/infect.h > +++ b/compel/include/uapi/infect.h > @@ -165,4 +165,7 @@ extern void compel_relocs_apply(void *mem, void *vbase, size_t size, compel_relo > > extern unsigned long compel_task_size(void); > > +extern uint64_t compel_get_leader_sp(struct parasite_ctl *ctl); > +extern uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl); > + > #endif > diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c > index d51b8aa..4648e39 100644 > --- a/compel/src/lib/infect.c > +++ b/compel/src/lib/infect.c > @@ -1585,3 +1585,13 @@ struct parasite_blob_desc *compel_parasite_blob_desc(struct parasite_ctl *ctl) > { > return &ctl->pblob; > } > + > +uint64_t compel_get_leader_sp(struct parasite_ctl *ctl) > +{ > + return REG_SP(ctl->orig.regs); > +} > + > +uint64_t compel_get_thread_sp(struct parasite_thread_ctl *tctl) > +{ > + return REG_SP(tctl->th.regs); > +} >
We need to know what are stack pointers of every thread to ensure that the current stack page will not be treated as lazy. Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com> --- compel/arch/aarch64/src/lib/include/uapi/asm/infect-types.h | 1 + compel/arch/arm/src/lib/include/uapi/asm/infect-types.h | 1 + compel/arch/ppc64/src/lib/include/uapi/asm/infect-types.h | 1 + compel/arch/s390/src/lib/include/uapi/asm/infect-types.h | 1 + compel/arch/x86/src/lib/include/uapi/asm/infect-types.h | 1 + compel/include/uapi/infect.h | 3 +++ compel/src/lib/infect.c | 10 ++++++++++ 7 files changed, 18 insertions(+)