Skip to content

Commit 72ffaa4

Browse files
committed
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
2 parents dfdebc2 + 509d97b commit 72ffaa4

File tree

6 files changed

+45
-27
lines changed

6 files changed

+45
-27
lines changed

arch/s390/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ CHECKFLAGS += -D__s390__ -msize-long
2424
else
2525
LD_BFD := elf64-s390
2626
LDFLAGS := -m elf64_s390
27-
KBUILD_AFLAGS_MODULE += -fpic -D__PIC__
28-
KBUILD_CFLAGS_MODULE += -fpic -D__PIC__
27+
KBUILD_AFLAGS_MODULE += -fPIC
28+
KBUILD_CFLAGS_MODULE += -fPIC
2929
KBUILD_CFLAGS += -m64
3030
KBUILD_AFLAGS += -m64
3131
UTS_MACHINE := s390x

arch/s390/include/asm/pgtable.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,10 +1387,7 @@ static inline int has_transparent_hugepage(void)
13871387

13881388
static inline unsigned long pmd_pfn(pmd_t pmd)
13891389
{
1390-
if (pmd_trans_huge(pmd))
1391-
return pmd_val(pmd) >> HPAGE_SHIFT;
1392-
else
1393-
return pmd_val(pmd) >> PAGE_SHIFT;
1390+
return pmd_val(pmd) >> PAGE_SHIFT;
13941391
}
13951392
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
13961393

arch/s390/include/asm/timex.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,32 @@ static inline unsigned long long get_clock_monotonic(void)
128128
return get_clock_xt() - sched_clock_base_cc;
129129
}
130130

131+
/**
132+
* tod_to_ns - convert a TOD format value to nanoseconds
133+
* @todval: to be converted TOD format value
134+
* Returns: number of nanoseconds that correspond to the TOD format value
135+
*
136+
* Converting a 64 Bit TOD format value to nanoseconds means that the value
137+
* must be divided by 4.096. In order to achieve that we multiply with 125
138+
* and divide by 512:
139+
*
140+
* ns = (todval * 125) >> 9;
141+
*
142+
* In order to avoid an overflow with the multiplication we can rewrite this.
143+
* With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits)
144+
* we end up with
145+
*
146+
* ns = ((2^32 * th + tl) * 125 ) >> 9;
147+
* -> ns = (2^23 * th * 125) + ((tl * 125) >> 9);
148+
*
149+
*/
150+
static inline unsigned long long tod_to_ns(unsigned long long todval)
151+
{
152+
unsigned long long ns;
153+
154+
ns = ((todval >> 32) << 23) * 125;
155+
ns += ((todval & 0xffffffff) * 125) >> 9;
156+
return ns;
157+
}
158+
131159
#endif

arch/s390/kernel/time.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);
6363
*/
6464
unsigned long long notrace __kprobes sched_clock(void)
6565
{
66-
return (get_clock_monotonic() * 125) >> 9;
66+
return tod_to_ns(get_clock_monotonic());
6767
}
6868

6969
/*

arch/s390/kvm/interrupt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
408408
return 0;
409409
}
410410

411-
sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9;
411+
sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);
412412

413413
hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);
414414
VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime);

drivers/s390/cio/chsc.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,16 @@ struct chsc_sei_nt2_area {
283283
u8 ccdf[PAGE_SIZE - 24 - 56]; /* content-code dependent field */
284284
} __packed;
285285

286-
#define CHSC_SEI_NT0 0ULL
286+
#define CHSC_SEI_NT0 (1ULL << 63)
287287
#define CHSC_SEI_NT2 (1ULL << 61)
288288

289289
struct chsc_sei {
290290
struct chsc_header request;
291291
u32 reserved1;
292292
u64 ntsm; /* notification type mask */
293293
struct chsc_header response;
294-
u32 reserved2;
294+
u32 :24;
295+
u8 nt;
295296
union {
296297
struct chsc_sei_nt0_area nt0_area;
297298
struct chsc_sei_nt2_area nt2_area;
@@ -496,17 +497,17 @@ static int __chsc_process_crw(struct chsc_sei *sei, u64 ntsm)
496497
css_schedule_eval_all();
497498
}
498499

499-
switch (sei->ntsm) {
500-
case CHSC_SEI_NT0:
500+
switch (sei->nt) {
501+
case 0:
501502
chsc_process_sei_nt0(&sei->u.nt0_area);
502-
return 1;
503-
case CHSC_SEI_NT2:
503+
break;
504+
case 2:
504505
chsc_process_sei_nt2(&sei->u.nt2_area);
505-
return 1;
506+
break;
506507
default:
507-
CIO_CRW_EVENT(2, "chsc: unhandled nt (nt=%08Lx)\n",
508-
sei->ntsm);
509-
return 0;
508+
CIO_CRW_EVENT(2, "chsc: unhandled nt=%d\n",
509+
sei->nt);
510+
break;
510511
}
511512
} else {
512513
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)
537538
sei = sei_page;
538539

539540
CIO_TRACE_EVENT(2, "prcss");
540-
541-
/*
542-
* The ntsm does not allow to select NT0 and NT2 together. We need to
543-
* first check for NT2, than additionally for NT0...
544-
*/
545-
#ifdef CONFIG_PCI
546-
if (!__chsc_process_crw(sei, CHSC_SEI_NT2))
547-
#endif
548-
__chsc_process_crw(sei, CHSC_SEI_NT0);
541+
__chsc_process_crw(sei, CHSC_SEI_NT0 | CHSC_SEI_NT2);
549542
}
550543

551544
void chsc_chp_online(struct chp_id chpid)

0 commit comments

Comments
 (0)