From 37c5f6c86cf5cda66c71c3bb1672e3b09d81c6da Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Wed, 6 May 2015 13:18:59 +0200 Subject: s390/sclp: unify basic sclp access by exposing "struct sclp" Let's unify basic access to sclp fields by storing the data in an external struct in asm/sclp.h. The values can now directly be accessed by other components, so there is no need for most accessor functions and external variables anymore. The mtid, mtid_max and facility part will be cleaned up separately. Acked-by: Martin Schwidefsky Signed-off-by: David Hildenbrand Signed-off-by: Martin Schwidefsky --- drivers/s390/char/sclp.h | 3 -- drivers/s390/char/sclp_cmd.c | 25 ++++------ drivers/s390/char/sclp_early.c | 105 +++++++++-------------------------------- drivers/s390/char/zcore.c | 10 ++-- drivers/s390/kvm/kvm_virtio.c | 4 +- 5 files changed, 38 insertions(+), 109 deletions(-) (limited to 'drivers') diff --git a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h index a88069f8c677..852f20649f33 100644 --- a/drivers/s390/char/sclp.h +++ b/drivers/s390/char/sclp.h @@ -191,9 +191,6 @@ void sclp_sdias_exit(void); extern int sclp_console_pages; extern int sclp_console_drop; extern unsigned long sclp_console_full; -extern u8 sclp_fac84; -extern unsigned long long sclp_rzm; -extern unsigned long long sclp_rnmax; /* useful inlines */ diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index 7be782116dab..215e7950fd29 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c @@ -101,7 +101,7 @@ static void sclp_fill_cpu_info(struct sclp_cpu_info *info, info->configured = sccb->nr_configured; info->standby = sccb->nr_standby; info->combined = sccb->nr_configured + sccb->nr_standby; - info->has_cpu_type = sclp_fac84 & 0x1; + info->has_cpu_type = sclp.has_cpu_type; memcpy(&info->cpu, page + sccb->offset_configured, info->combined * sizeof(struct sclp_cpu_entry)); } @@ -202,14 +202,14 @@ struct assign_storage_sccb { int arch_get_memory_phys_device(unsigned long start_pfn) { - if (!sclp_rzm) + if (!sclp.rzm) return 0; - return PFN_PHYS(start_pfn) >> ilog2(sclp_rzm); + return PFN_PHYS(start_pfn) >> ilog2(sclp.rzm); } static unsigned long long rn2addr(u16 rn) { - return (unsigned long long) (rn - 1) * sclp_rzm; + return (unsigned long long) (rn - 1) * sclp.rzm; } static int do_assign_storage(sclp_cmdw_t cmd, u16 rn) @@ -250,7 +250,7 @@ static int sclp_assign_storage(u16 rn) if (rc) return rc; start = rn2addr(rn); - storage_key_init_range(start, start + sclp_rzm); + storage_key_init_range(start, start + sclp.rzm); return 0; } @@ -309,7 +309,7 @@ static int sclp_mem_change_state(unsigned long start, unsigned long size, istart = rn2addr(incr->rn); if (start + size - 1 < istart) break; - if (start > istart + sclp_rzm - 1) + if (start > istart + sclp.rzm - 1) continue; if (online) rc |= sclp_assign_storage(incr->rn); @@ -330,7 +330,7 @@ static bool contains_standby_increment(unsigned long start, unsigned long end) istart = rn2addr(incr->rn); if (end - 1 < istart) continue; - if (start > istart + sclp_rzm - 1) + if (start > istart + sclp.rzm - 1) continue; if (incr->standby) return true; @@ -415,7 +415,7 @@ static void __init add_memory_merged(u16 rn) if (!first_rn) goto skip_add; start = rn2addr(first_rn); - size = (unsigned long long) num * sclp_rzm; + size = (unsigned long long) num * sclp.rzm; if (start >= VMEM_MAX_PHYS) goto skip_add; if (start + size > VMEM_MAX_PHYS) @@ -465,7 +465,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned) } if (!assigned) new_incr->rn = last_rn + 1; - if (new_incr->rn > sclp_rnmax) { + if (new_incr->rn > sclp.rnmax) { kfree(new_incr); return; } @@ -550,7 +550,7 @@ static int __init sclp_detect_standby_memory(void) } if (rc || list_empty(&sclp_mem_list)) goto out; - for (i = 1; i <= sclp_rnmax - assigned; i++) + for (i = 1; i <= sclp.rnmax - assigned; i++) insert_increment(0, 1, 0); rc = register_memory_notifier(&sclp_mem_nb); if (rc) @@ -753,8 +753,3 @@ out: free_page((unsigned long) sccb); return rc; } - -bool sclp_has_sprp(void) -{ - return !!(sclp_fac84 & 0x2); -} diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index 1efa4fdb7fe2..4f6525d5e987 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c @@ -48,23 +48,12 @@ struct read_info_sccb { } __packed __aligned(PAGE_SIZE); static char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE) __initdata; -static unsigned int sclp_con_has_vt220 __initdata; -static unsigned int sclp_con_has_linemode __initdata; -static unsigned long sclp_hsa_size; -static unsigned int sclp_max_cpu; static struct sclp_ipl_info sclp_ipl_info; -static unsigned char sclp_siif; -static unsigned char sclp_sigpif; -static u32 sclp_ibc; -static unsigned int sclp_mtid; -static unsigned int sclp_mtid_cp; static unsigned int sclp_mtid_max; -static unsigned int sclp_mtid_prev; +struct sclp_info sclp; +EXPORT_SYMBOL(sclp); u64 sclp_facilities; -u8 sclp_fac84; -unsigned long long sclp_rzm; -unsigned long long sclp_rnmax; static int __init sclp_cmd_sync_early(sclp_cmdw_t cmd, void *sccb) { @@ -118,21 +107,22 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) return; sclp_facilities = sccb->facilities; - sclp_fac84 = sccb->fac84; + sclp.has_sprp = !!(sccb->fac84 & 0x02); + sclp.has_cpu_type = !!(sccb->fac84 & 0x01); if (sccb->fac85 & 0x02) S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP; - sclp_rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; - sclp_rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; - sclp_rzm <<= 20; - sclp_ibc = sccb->ibc; + sclp.rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; + sclp.rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; + sclp.rzm <<= 20; + sclp.ibc = sccb->ibc; if (!sccb->hcpua) { if (MACHINE_IS_VM) - sclp_max_cpu = 64; + sclp.max_cpu = 64; else - sclp_max_cpu = sccb->ncpurl; + sclp.max_cpu = sccb->ncpurl; } else { - sclp_max_cpu = sccb->hcpua + 1; + sclp.max_cpu = sccb->hcpua + 1; } boot_cpu_address = stap(); @@ -140,8 +130,8 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) for (cpu = 0; cpu < sccb->ncpurl; cpue++, cpu++) { if (boot_cpu_address != cpue->core_id) continue; - sclp_siif = cpue->siif; - sclp_sigpif = cpue->sigpif; + sclp.has_siif = cpue->siif; + sclp.has_sigpif = cpue->sigpif; break; } @@ -151,58 +141,15 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) sclp_ipl_info.has_dump = 1; memcpy(&sclp_ipl_info.loadparm, &sccb->loadparm, LOADPARM_LEN); - sclp_mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0; - sclp_mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0; - sclp_mtid_max = max(sclp_mtid, sclp_mtid_cp); - sclp_mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0; + sclp.mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0; + sclp.mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0; + sclp_mtid_max = max(sclp.mtid, sclp.mtid_cp); + sclp.mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0; } -bool __init sclp_has_linemode(void) -{ - return !!sclp_con_has_linemode; -} - -bool __init sclp_has_vt220(void) -{ - return !!sclp_con_has_vt220; -} - -unsigned long long sclp_get_rnmax(void) -{ - return sclp_rnmax; -} - -unsigned long long sclp_get_rzm(void) -{ - return sclp_rzm; -} - -unsigned int sclp_get_max_cpu(void) -{ - return sclp_max_cpu; -} - -int sclp_has_siif(void) -{ - return sclp_siif; -} -EXPORT_SYMBOL(sclp_has_siif); - -int sclp_has_sigpif(void) -{ - return sclp_sigpif; -} -EXPORT_SYMBOL(sclp_has_sigpif); - -unsigned int sclp_get_ibc(void) -{ - return sclp_ibc; -} -EXPORT_SYMBOL(sclp_get_ibc); - unsigned int sclp_get_mtid(u8 cpu_type) { - return cpu_type ? sclp_mtid : sclp_mtid_cp; + return cpu_type ? sclp.mtid : sclp.mtid_cp; } unsigned int sclp_get_mtid_max(void) @@ -210,11 +157,6 @@ unsigned int sclp_get_mtid_max(void) return sclp_mtid_max; } -unsigned int sclp_get_mtid_prev(void) -{ - return sclp_mtid_prev; -} - /* * This function will be called after sclp_facilities_detect(), which gets * called from early.c code. The sclp_facilities_detect() function retrieves @@ -286,11 +228,6 @@ static long __init sclp_hsa_copy_wait(struct sccb_header *sccb) return (((struct sdias_sccb *) sccb)->evbuf.blk_cnt - 1) * PAGE_SIZE; } -unsigned long sclp_get_hsa_size(void) -{ - return sclp_hsa_size; -} - static void __init sclp_hsa_size_detect(void *sccb) { long size; @@ -313,7 +250,7 @@ static void __init sclp_hsa_size_detect(void *sccb) if (size < 0) return; out: - sclp_hsa_size = size; + sclp.hsa_size = size; } static unsigned int __init sclp_con_check_linemode(struct init_sccb *sccb) @@ -331,10 +268,10 @@ static void __init sclp_console_detect(struct init_sccb *sccb) return; if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK) - sclp_con_has_vt220 = 1; + sclp.has_vt220 = 1; if (sclp_con_check_linemode(sccb)) - sclp_con_has_linemode = 1; + sclp.has_linemode = 1; } void __init sclp_early_detect(void) diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index a68fcfd1d48c..9a3dd95029cc 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c @@ -330,9 +330,9 @@ static ssize_t zcore_read(struct file *file, char __user *buf, size_t count, mem_offs = 0; /* Copy from HSA data */ - if (*ppos < sclp_get_hsa_size() + HEADER_SIZE) { + if (*ppos < sclp.hsa_size + HEADER_SIZE) { size = min((count - hdr_count), - (size_t) (sclp_get_hsa_size() - mem_start)); + (size_t) (sclp.hsa_size - mem_start)); rc = memcpy_hsa_user(buf + hdr_count, mem_start, size); if (rc) goto fail; @@ -483,7 +483,7 @@ static ssize_t zcore_hsa_read(struct file *filp, char __user *buf, static char str[18]; if (hsa_available) - snprintf(str, sizeof(str), "%lx\n", sclp_get_hsa_size()); + snprintf(str, sizeof(str), "%lx\n", sclp.hsa_size); else snprintf(str, sizeof(str), "0\n"); return simple_read_from_buffer(buf, count, ppos, str, strlen(str)); @@ -558,7 +558,7 @@ static int __init sys_info_init(enum arch_id arch, unsigned long mem_end) static int __init check_sdias(void) { - if (!sclp_get_hsa_size()) { + if (!sclp.hsa_size) { TRACE("Could not determine HSA size\n"); return -ENODEV; } @@ -619,7 +619,7 @@ static int __init zcore_reipl_init(void) ipl_block = (void *) __get_free_page(GFP_KERNEL); if (!ipl_block) return -ENOMEM; - if (ipib_info.ipib < sclp_get_hsa_size()) + if (ipib_info.ipib < sclp.hsa_size) rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE); else rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE); diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index dd65c8b4c7fe..53fb975c404b 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c @@ -450,7 +450,7 @@ static int __init test_devices_support(unsigned long addr) static int __init kvm_devices_init(void) { int rc; - unsigned long total_memory_size = sclp_get_rzm() * sclp_get_rnmax(); + unsigned long total_memory_size = sclp.rzm * sclp.rnmax; if (!MACHINE_IS_KVM) return -ENODEV; @@ -497,7 +497,7 @@ static __init int early_put_chars(u32 vtermno, const char *buf, int count) static int __init s390_virtio_console_init(void) { - if (sclp_has_vt220() || sclp_has_linemode()) + if (sclp.has_vt220 || sclp.has_linemode) return -ENODEV; return virtio_cons_early_init(early_put_chars); } -- cgit v1.2.3-59-g8ed1b From 3a9f3fe69eab40d9de948230a6789bd7ea68d5e9 Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Wed, 6 May 2015 13:19:29 +0200 Subject: s390/sclp: get rid of sclp_get_mtid() and sclp_get_mtid_max() As all relevant sclp data is now directly accessible, let's move the logic of these two functions to the single caller. Acked-by: Martin Schwidefsky Signed-off-by: David Hildenbrand Signed-off-by: Martin Schwidefsky --- arch/s390/include/asm/sclp.h | 2 -- arch/s390/kernel/smp.c | 5 +++-- drivers/s390/char/sclp_early.c | 12 ------------ 3 files changed, 3 insertions(+), 16 deletions(-) (limited to 'drivers') diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index 74ba690064f5..6b00faa7e1ad 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h @@ -68,8 +68,6 @@ extern struct sclp_info sclp; int sclp_get_cpu_info(struct sclp_cpu_info *info); int sclp_cpu_configure(u8 cpu); int sclp_cpu_deconfigure(u8 cpu); -unsigned int sclp_get_mtid(u8 cpu_type); -unsigned int sclp_get_mtid_max(void); int sclp_sdias_blk_count(void); int sclp_sdias_copy(void *dest, int blk_num, int nr_blks); int sclp_chp_configure(struct chp_id chpid); diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index ac7dda556a7d..0d9d59d4710e 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -740,7 +740,7 @@ static void __init smp_detect_cpus(void) #endif /* Set multi-threading state for the current system */ - mtid = sclp_get_mtid(boot_cpu_type); + mtid = boot_cpu_type ? sclp.mtid : sclp.mtid_cp; mtid = (mtid < smp_max_threads) ? mtid : smp_max_threads - 1; pcpu_set_smt(mtid); @@ -882,7 +882,8 @@ void __init smp_fill_possible_mask(void) { unsigned int possible, sclp_max, cpu; - sclp_max = min(smp_max_threads, sclp_get_mtid_max() + 1); + sclp_max = max(sclp.mtid, sclp.mtid_cp) + 1; + sclp_max = min(smp_max_threads, sclp_max); sclp_max = sclp.max_cpu * sclp_max ?: nr_cpu_ids; possible = setup_possible_cpus ?: nr_cpu_ids; possible = min(possible, sclp_max); diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index 4f6525d5e987..914ff62112c8 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c @@ -49,7 +49,6 @@ struct read_info_sccb { static char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE) __initdata; static struct sclp_ipl_info sclp_ipl_info; -static unsigned int sclp_mtid_max; struct sclp_info sclp; EXPORT_SYMBOL(sclp); @@ -143,20 +142,9 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) sclp.mtid = (sccb->fac42 & 0x80) ? (sccb->fac42 & 31) : 0; sclp.mtid_cp = (sccb->fac42 & 0x80) ? (sccb->fac43 & 31) : 0; - sclp_mtid_max = max(sclp.mtid, sclp.mtid_cp); sclp.mtid_prev = (sccb->fac42 & 0x80) ? (sccb->fac66 & 31) : 0; } -unsigned int sclp_get_mtid(u8 cpu_type) -{ - return cpu_type ? sclp.mtid : sclp.mtid_cp; -} - -unsigned int sclp_get_mtid_max(void) -{ - return sclp_mtid_max; -} - /* * This function will be called after sclp_facilities_detect(), which gets * called from early.c code. The sclp_facilities_detect() function retrieves -- cgit v1.2.3-59-g8ed1b From 78335a30e0ea2ac79db5a9915fdf6edd9e8ded9b Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Wed, 6 May 2015 09:17:51 +0200 Subject: s390/sclp: move sclp_facilities into "struct sclp" Let's also move the facilities into the sclp struct, so we can avoid another separate external variable. Acked-by: Martin Schwidefsky Signed-off-by: David Hildenbrand Signed-off-by: Martin Schwidefsky --- arch/s390/include/asm/sclp.h | 1 + drivers/s390/char/sclp.c | 2 +- drivers/s390/char/sclp.h | 12 +++++------- drivers/s390/char/sclp_cmd.c | 2 +- drivers/s390/char/sclp_early.c | 3 +-- 5 files changed, 9 insertions(+), 11 deletions(-) (limited to 'drivers') diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index 6b00faa7e1ad..c891f41b2753 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h @@ -62,6 +62,7 @@ struct sclp_info { unsigned long long hamax; unsigned int max_cpu; unsigned long hsa_size; + unsigned long long facilities; }; extern struct sclp_info sclp; diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 41ba56d2e752..5e20513c0587 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c @@ -665,7 +665,7 @@ sclp_state_change_cb(struct evbuf_header *evbuf) sclp_send_mask = scbuf->sclp_send_mask; spin_unlock_irqrestore(&sclp_lock, flags); if (scbuf->validity_sclp_active_facility_mask) - sclp_facilities = scbuf->sclp_active_facility_mask; + sclp.facilities = scbuf->sclp_active_facility_mask; sclp_dispatch_state_change(); } diff --git a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h index 852f20649f33..026e38990952 100644 --- a/drivers/s390/char/sclp.h +++ b/drivers/s390/char/sclp.h @@ -100,13 +100,11 @@ struct init_sccb { sccb_mask_t sclp_send_mask; } __attribute__((packed)); -extern u64 sclp_facilities; - -#define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL) -#define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL) -#define SCLP_HAS_CPU_INFO (sclp_facilities & 0x0800000000000000ULL) -#define SCLP_HAS_CPU_RECONFIG (sclp_facilities & 0x0400000000000000ULL) -#define SCLP_HAS_PCI_RECONFIG (sclp_facilities & 0x0000000040000000ULL) +#define SCLP_HAS_CHP_INFO (sclp.facilities & 0x8000000000000000ULL) +#define SCLP_HAS_CHP_RECONFIG (sclp.facilities & 0x2000000000000000ULL) +#define SCLP_HAS_CPU_INFO (sclp.facilities & 0x0800000000000000ULL) +#define SCLP_HAS_CPU_RECONFIG (sclp.facilities & 0x0400000000000000ULL) +#define SCLP_HAS_PCI_RECONFIG (sclp.facilities & 0x0000000040000000ULL) struct gds_subvector { diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index 215e7950fd29..a186918dc393 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c @@ -508,7 +508,7 @@ static int __init sclp_detect_standby_memory(void) if (OLDMEM_BASE) /* No standby memory in kdump mode */ return 0; - if ((sclp_facilities & 0xe00000000000ULL) != 0xe00000000000ULL) + if ((sclp.facilities & 0xe00000000000ULL) != 0xe00000000000ULL) return 0; rc = -ENOMEM; sccb = (void *) __get_free_page(GFP_KERNEL | GFP_DMA); diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index 914ff62112c8..d7f696d95597 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c @@ -52,7 +52,6 @@ static struct sclp_ipl_info sclp_ipl_info; struct sclp_info sclp; EXPORT_SYMBOL(sclp); -u64 sclp_facilities; static int __init sclp_cmd_sync_early(sclp_cmdw_t cmd, void *sccb) { @@ -105,7 +104,7 @@ static void __init sclp_facilities_detect(struct read_info_sccb *sccb) if (sclp_read_info_early(sccb)) return; - sclp_facilities = sccb->facilities; + sclp.facilities = sccb->facilities; sclp.has_sprp = !!(sccb->fac84 & 0x02); sclp.has_cpu_type = !!(sccb->fac84 & 0x01); if (sccb->fac85 & 0x02) -- cgit v1.2.3-59-g8ed1b From 7c53fcb39fddb59a9e32c10e96133049ed90930b Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Mon, 11 May 2015 13:08:05 +0200 Subject: s390/dasd: Enable automatic loading of dasd_diag_mod Enabling a DASD that was configured to use the DIAG250 access method while the corresponding kernel module dasd_diag_mod has not been loaded fails with an error message. To fix this, users need to manually load the dasd_diag_mod module. This procedure can be simplified by automatically loading the dasd_diag_mod from within the kernel when a DASD configured for DIAG250 is set online. Signed-off-by: Peter Oberparleiter Signed-off-by: Martin Schwidefsky --- drivers/s390/block/dasd.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'drivers') diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 57fd66357b95..1aec8ff0b587 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -38,6 +38,8 @@ */ #define DASD_CHANQ_MAX_SIZE 4 +#define DASD_DIAG_MOD "dasd_diag_mod" + /* * SECTION: exported variables of dasd.c */ @@ -3300,6 +3302,21 @@ int dasd_generic_set_online(struct ccw_device *cdev, discipline = base_discipline; if (device->features & DASD_FEATURE_USEDIAG) { if (!dasd_diag_discipline_pointer) { + /* Try to load the required module. */ + rc = request_module(DASD_DIAG_MOD); + if (rc) { + pr_warn("%s Setting the DASD online failed " + "because the required module %s " + "could not be loaded (rc=%d)\n", + dev_name(&cdev->dev), DASD_DIAG_MOD, + rc); + dasd_delete_device(device); + return -ENODEV; + } + } + /* Module init could have failed, so check again here after + * request_module(). */ + if (!dasd_diag_discipline_pointer) { pr_warn("%s Setting the DASD online failed because of missing DIAG discipline\n", dev_name(&cdev->dev)); dasd_delete_device(device); -- cgit v1.2.3-59-g8ed1b From b8a43b045eda4d5b25f00696970fb23cf3edcb23 Mon Sep 17 00:00:00 2001 From: Joe Perches Date: Tue, 19 May 2015 18:37:56 -0700 Subject: s390/sclp: Use DECLARE_BITMAP Use the generic mechanism to declare a bitmap instead of unsigned long. Signed-off-by: Joe Perches Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- drivers/s390/char/sclp_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers') diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index a186918dc393..f74c040d5c10 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c @@ -186,7 +186,7 @@ int sclp_cpu_deconfigure(u8 cpu) static DEFINE_MUTEX(sclp_mem_mutex); static LIST_HEAD(sclp_mem_list); static u8 sclp_max_storage_id; -static unsigned long sclp_storage_ids[256 / BITS_PER_LONG]; +static DECLARE_BITMAP(sclp_storage_ids, 256); static int sclp_mem_state_changed; struct memory_increment { -- cgit v1.2.3-59-g8ed1b From 2e4aa2f2bdcf9b80bace0b0c460bd407d76f49d3 Mon Sep 17 00:00:00 2001 From: Nicholas Mc Guire Date: Fri, 29 May 2015 16:50:55 +0200 Subject: s390/sclp: pass timeout as HZ independent value schedule_timeout takes a timeout in jiffies but the code currently is passing in a constant SDIAS_SLEEP_TICKS, as this is otherwise unused it is replaced by 500ms as recommended by Michael Holzheu and converted with msecs_to_jiffies(); As SDIAS_SLEEP_TICKS was only used in this one location it is dropped. Patch was compile tested with (s390) defconfig + CONFIG_MARCH_Z10=y, (implies CONFIG_CRASH_DUMP=y) Patch is against 4.1-rc5 (localversion-next is -next-20150529) Link: http://lkml.org/lkml/2015/5/29/235 Signed-off-by: Nicholas Mc Guire Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- drivers/s390/char/sclp_sdias.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers') diff --git a/drivers/s390/char/sclp_sdias.c b/drivers/s390/char/sclp_sdias.c index eb7cb076c001..7cdd13dd7be1 100644 --- a/drivers/s390/char/sclp_sdias.c +++ b/drivers/s390/char/sclp_sdias.c @@ -21,7 +21,6 @@ #define TRACE(x...) debug_sprintf_event(sdias_dbf, 1, x) #define SDIAS_RETRIES 300 -#define SDIAS_SLEEP_TICKS 50 static struct debug_info *sdias_dbf; @@ -68,7 +67,7 @@ static int sdias_sclp_send(struct sclp_req *req) /* not initiated, wait some time and retry */ set_current_state(TASK_INTERRUPTIBLE); TRACE("add request failed: rc = %i\n",rc); - schedule_timeout(SDIAS_SLEEP_TICKS); + schedule_timeout(msecs_to_jiffies(500)); continue; } /* initiated, wait for completion of service call */ -- cgit v1.2.3-59-g8ed1b From 8cb81811e924ff0214ce4e8344e2feb1549cf0ce Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 2 Jun 2015 12:38:39 +0200 Subject: s390/keyboard: avoid off-by-one when using strnlen_user() strnlen_user() returns the length of the string including terminating 0. So avoid counting it again and unnecessarily reducing maximum string size by 1. Signed-off-by: Jan Kara Signed-off-by: Heiko Carstens Signed-off-by: Martin Schwidefsky --- drivers/s390/char/keyboard.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 01463b052ae7..ef04a9f7a704 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c @@ -433,20 +433,23 @@ do_kdgkb_ioctl(struct kbd_data *kbd, struct kbsentry __user *u_kbs, case KDSKBSENT: if (!perm) return -EPERM; - len = strnlen_user(u_kbs->kb_string, - sizeof(u_kbs->kb_string) - 1); + len = strnlen_user(u_kbs->kb_string, sizeof(u_kbs->kb_string)); if (!len) return -EFAULT; - if (len > sizeof(u_kbs->kb_string) - 1) + if (len > sizeof(u_kbs->kb_string)) return -EINVAL; - p = kmalloc(len + 1, GFP_KERNEL); + p = kmalloc(len, GFP_KERNEL); if (!p) return -ENOMEM; if (copy_from_user(p, u_kbs->kb_string, len)) { kfree(p); return -EFAULT; } - p[len] = 0; + /* + * Make sure the string is terminated by 0. User could have + * modified it between us running strnlen_user() and copying it. + */ + p[len - 1] = 0; kfree(kbd->func_table[kb_func]); kbd->func_table[kb_func] = p; break; -- cgit v1.2.3-59-g8ed1b From d9a5c0c65bb93e6c0236c73fe560fe980c3a5d1c Mon Sep 17 00:00:00 2001 From: Vaishali Thakkar Date: Mon, 15 Jun 2015 15:01:18 +0200 Subject: s390/zcrypt: remove obsolete __constant __constant_cpu_to_le16 converted to cpu_to_le16 Signed-off-by: Vaishali Thakkar Signed-off-by: Ingo Tuchscherer Signed-off-by: Martin Schwidefsky --- drivers/s390/crypto/zcrypt_pcicc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers') diff --git a/drivers/s390/crypto/zcrypt_pcicc.c b/drivers/s390/crypto/zcrypt_pcicc.c index 4d14c04b746e..9f18876f058b 100644 --- a/drivers/s390/crypto/zcrypt_pcicc.c +++ b/drivers/s390/crypto/zcrypt_pcicc.c @@ -98,11 +98,11 @@ static struct ap_driver zcrypt_pcicc_driver = { * - VUD block */ static struct CPRB static_cprb = { - .cprb_len = __constant_cpu_to_le16(0x0070), + .cprb_len = cpu_to_le16(0x0070), .cprb_ver_id = 0x41, .func_id = {0x54,0x32}, .checkpoint_flag= 0x01, - .svr_namel = __constant_cpu_to_le16(0x0008), + .svr_namel = cpu_to_le16(0x0008), .svr_name = {'I','C','S','F',' ',' ',' ',' '} }; @@ -164,7 +164,7 @@ static int ICAMEX_msg_to_type6MEX_msg(struct zcrypt_device *zdev, }; static struct function_and_rules_block static_pke_function_and_rules ={ .function_code = {'P','K'}, - .ulen = __constant_cpu_to_le16(10), + .ulen = cpu_to_le16(10), .only_rule = {'P','K','C','S','-','1','.','2'} }; struct { @@ -251,7 +251,7 @@ static int ICACRT_msg_to_type6CRT_msg(struct zcrypt_device *zdev, }; static struct function_and_rules_block static_pkd_function_and_rules ={ .function_code = {'P','D'}, - .ulen = __constant_cpu_to_le16(10), + .ulen = cpu_to_le16(10), .only_rule = {'P','K','C','S','-','1','.','2'} }; struct { -- cgit v1.2.3-59-g8ed1b