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:
Linus Torvalds 2013-01-17 08:56:30 -08:00
commit 72ffaa48e1
6 changed files with 45 additions and 27 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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());
} }
/* /*

View File

@ -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);

View File

@ -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)