Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull more s390 patches from Martin Schwidefsky: "A couple of bug fixes: one of the transparent huge page primitives is broken, the sched_clock function overflows after 417 days, the XFS module has grown too large for -fpic and the new pci code has broken normal channel subsystem notifications." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/chsc: fix SEI usage s390/time: fix sched_clock() overflow s390: use -fPIC for module compile s390/mm: fix pmd_pfn() for thp
This commit is contained in:
commit
72ffaa48e1
|
@ -24,8 +24,8 @@ CHECKFLAGS += -D__s390__ -msize-long
|
||||||
else
|
else
|
||||||
LD_BFD := elf64-s390
|
LD_BFD := elf64-s390
|
||||||
LDFLAGS := -m elf64_s390
|
LDFLAGS := -m elf64_s390
|
||||||
KBUILD_AFLAGS_MODULE += -fpic -D__PIC__
|
KBUILD_AFLAGS_MODULE += -fPIC
|
||||||
KBUILD_CFLAGS_MODULE += -fpic -D__PIC__
|
KBUILD_CFLAGS_MODULE += -fPIC
|
||||||
KBUILD_CFLAGS += -m64
|
KBUILD_CFLAGS += -m64
|
||||||
KBUILD_AFLAGS += -m64
|
KBUILD_AFLAGS += -m64
|
||||||
UTS_MACHINE := s390x
|
UTS_MACHINE := s390x
|
||||||
|
|
|
@ -1387,10 +1387,7 @@ static inline int has_transparent_hugepage(void)
|
||||||
|
|
||||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||||
{
|
{
|
||||||
if (pmd_trans_huge(pmd))
|
return pmd_val(pmd) >> PAGE_SHIFT;
|
||||||
return pmd_val(pmd) >> HPAGE_SHIFT;
|
|
||||||
else
|
|
||||||
return pmd_val(pmd) >> PAGE_SHIFT;
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||||
|
|
||||||
|
|
|
@ -128,4 +128,32 @@ static inline unsigned long long get_clock_monotonic(void)
|
||||||
return get_clock_xt() - sched_clock_base_cc;
|
return get_clock_xt() - sched_clock_base_cc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tod_to_ns - convert a TOD format value to nanoseconds
|
||||||
|
* @todval: to be converted TOD format value
|
||||||
|
* Returns: number of nanoseconds that correspond to the TOD format value
|
||||||
|
*
|
||||||
|
* Converting a 64 Bit TOD format value to nanoseconds means that the value
|
||||||
|
* must be divided by 4.096. In order to achieve that we multiply with 125
|
||||||
|
* and divide by 512:
|
||||||
|
*
|
||||||
|
* ns = (todval * 125) >> 9;
|
||||||
|
*
|
||||||
|
* In order to avoid an overflow with the multiplication we can rewrite this.
|
||||||
|
* With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits)
|
||||||
|
* we end up with
|
||||||
|
*
|
||||||
|
* ns = ((2^32 * th + tl) * 125 ) >> 9;
|
||||||
|
* -> ns = (2^23 * th * 125) + ((tl * 125) >> 9);
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline unsigned long long tod_to_ns(unsigned long long todval)
|
||||||
|
{
|
||||||
|
unsigned long long ns;
|
||||||
|
|
||||||
|
ns = ((todval >> 32) << 23) * 125;
|
||||||
|
ns += ((todval & 0xffffffff) * 125) >> 9;
|
||||||
|
return ns;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);
|
||||||
*/
|
*/
|
||||||
unsigned long long notrace __kprobes sched_clock(void)
|
unsigned long long notrace __kprobes sched_clock(void)
|
||||||
{
|
{
|
||||||
return (get_clock_monotonic() * 125) >> 9;
|
return tod_to_ns(get_clock_monotonic());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -408,7 +408,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9;
|
sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);
|
||||||
|
|
||||||
hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);
|
hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);
|
||||||
VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime);
|
VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime);
|
||||||
|
|
|
@ -283,7 +283,7 @@ struct chsc_sei_nt2_area {
|
||||||
u8 ccdf[PAGE_SIZE - 24 - 56]; /* content-code dependent field */
|
u8 ccdf[PAGE_SIZE - 24 - 56]; /* content-code dependent field */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
#define CHSC_SEI_NT0 0ULL
|
#define CHSC_SEI_NT0 (1ULL << 63)
|
||||||
#define CHSC_SEI_NT2 (1ULL << 61)
|
#define CHSC_SEI_NT2 (1ULL << 61)
|
||||||
|
|
||||||
struct chsc_sei {
|
struct chsc_sei {
|
||||||
|
@ -291,7 +291,8 @@ struct chsc_sei {
|
||||||
u32 reserved1;
|
u32 reserved1;
|
||||||
u64 ntsm; /* notification type mask */
|
u64 ntsm; /* notification type mask */
|
||||||
struct chsc_header response;
|
struct chsc_header response;
|
||||||
u32 reserved2;
|
u32 :24;
|
||||||
|
u8 nt;
|
||||||
union {
|
union {
|
||||||
struct chsc_sei_nt0_area nt0_area;
|
struct chsc_sei_nt0_area nt0_area;
|
||||||
struct chsc_sei_nt2_area nt2_area;
|
struct chsc_sei_nt2_area nt2_area;
|
||||||
|
@ -496,17 +497,17 @@ static int __chsc_process_crw(struct chsc_sei *sei, u64 ntsm)
|
||||||
css_schedule_eval_all();
|
css_schedule_eval_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sei->ntsm) {
|
switch (sei->nt) {
|
||||||
case CHSC_SEI_NT0:
|
case 0:
|
||||||
chsc_process_sei_nt0(&sei->u.nt0_area);
|
chsc_process_sei_nt0(&sei->u.nt0_area);
|
||||||
return 1;
|
break;
|
||||||
case CHSC_SEI_NT2:
|
case 2:
|
||||||
chsc_process_sei_nt2(&sei->u.nt2_area);
|
chsc_process_sei_nt2(&sei->u.nt2_area);
|
||||||
return 1;
|
break;
|
||||||
default:
|
default:
|
||||||
CIO_CRW_EVENT(2, "chsc: unhandled nt (nt=%08Lx)\n",
|
CIO_CRW_EVENT(2, "chsc: unhandled nt=%d\n",
|
||||||
sei->ntsm);
|
sei->nt);
|
||||||
return 0;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n",
|
CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n",
|
||||||
|
@ -537,15 +538,7 @@ static void chsc_process_crw(struct crw *crw0, struct crw *crw1, int overflow)
|
||||||
sei = sei_page;
|
sei = sei_page;
|
||||||
|
|
||||||
CIO_TRACE_EVENT(2, "prcss");
|
CIO_TRACE_EVENT(2, "prcss");
|
||||||
|
__chsc_process_crw(sei, CHSC_SEI_NT0 | CHSC_SEI_NT2);
|
||||||
/*
|
|
||||||
* The ntsm does not allow to select NT0 and NT2 together. We need to
|
|
||||||
* first check for NT2, than additionally for NT0...
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_PCI
|
|
||||||
if (!__chsc_process_crw(sei, CHSC_SEI_NT2))
|
|
||||||
#endif
|
|
||||||
__chsc_process_crw(sei, CHSC_SEI_NT0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void chsc_chp_online(struct chp_id chpid)
|
void chsc_chp_online(struct chp_id chpid)
|
||||||
|
|
Loading…
Reference in New Issue