diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-05 15:17:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-05 15:17:33 -0500 |
commit | 3eac69038322f52b7366e4e6bbdb06e749714133 (patch) | |
tree | ba00fba16bea1ffcc56d28c5653268ca7dc9389c | |
parent | 925cbd7ed4b073a2afc9915e241ab789b44a3f61 (diff) | |
parent | 8a9bd4f8ebc6800bfc0596e28631ff6809a2f615 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Martin Schwidefsky:
"Four bug fixes"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/dasd: fix wrongly assigned configuration data
s390: fix preemption race in disable_sacf_uaccess
s390/sclp: disable FORTIFY_SOURCE for early sclp code
s390/pci: handle insufficient resources during dma tlb flush
-rw-r--r-- | arch/s390/lib/uaccess.c | 2 | ||||
-rw-r--r-- | arch/s390/pci/pci_dma.c | 21 | ||||
-rw-r--r-- | arch/s390/pci/pci_insn.c | 3 | ||||
-rw-r--r-- | drivers/s390/block/dasd_3990_erp.c | 10 | ||||
-rw-r--r-- | drivers/s390/char/Makefile | 2 |
5 files changed, 35 insertions, 3 deletions
diff --git a/arch/s390/lib/uaccess.c b/arch/s390/lib/uaccess.c index cae5a1e16cbd..c4f8039a35e8 100644 --- a/arch/s390/lib/uaccess.c +++ b/arch/s390/lib/uaccess.c | |||
@@ -89,11 +89,11 @@ EXPORT_SYMBOL(enable_sacf_uaccess); | |||
89 | 89 | ||
90 | void disable_sacf_uaccess(mm_segment_t old_fs) | 90 | void disable_sacf_uaccess(mm_segment_t old_fs) |
91 | { | 91 | { |
92 | current->thread.mm_segment = old_fs; | ||
92 | if (old_fs == USER_DS && test_facility(27)) { | 93 | if (old_fs == USER_DS && test_facility(27)) { |
93 | __ctl_load(S390_lowcore.user_asce, 1, 1); | 94 | __ctl_load(S390_lowcore.user_asce, 1, 1); |
94 | clear_cpu_flag(CIF_ASCE_PRIMARY); | 95 | clear_cpu_flag(CIF_ASCE_PRIMARY); |
95 | } | 96 | } |
96 | current->thread.mm_segment = old_fs; | ||
97 | } | 97 | } |
98 | EXPORT_SYMBOL(disable_sacf_uaccess); | 98 | EXPORT_SYMBOL(disable_sacf_uaccess); |
99 | 99 | ||
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index f7aa5a77827e..2d15d84c20ed 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
@@ -181,6 +181,9 @@ out_unlock: | |||
181 | static int __dma_purge_tlb(struct zpci_dev *zdev, dma_addr_t dma_addr, | 181 | static int __dma_purge_tlb(struct zpci_dev *zdev, dma_addr_t dma_addr, |
182 | size_t size, int flags) | 182 | size_t size, int flags) |
183 | { | 183 | { |
184 | unsigned long irqflags; | ||
185 | int ret; | ||
186 | |||
184 | /* | 187 | /* |
185 | * With zdev->tlb_refresh == 0, rpcit is not required to establish new | 188 | * With zdev->tlb_refresh == 0, rpcit is not required to establish new |
186 | * translations when previously invalid translation-table entries are | 189 | * translations when previously invalid translation-table entries are |
@@ -196,8 +199,22 @@ static int __dma_purge_tlb(struct zpci_dev *zdev, dma_addr_t dma_addr, | |||
196 | return 0; | 199 | return 0; |
197 | } | 200 | } |
198 | 201 | ||
199 | return zpci_refresh_trans((u64) zdev->fh << 32, dma_addr, | 202 | ret = zpci_refresh_trans((u64) zdev->fh << 32, dma_addr, |
200 | PAGE_ALIGN(size)); | 203 | PAGE_ALIGN(size)); |
204 | if (ret == -ENOMEM && !s390_iommu_strict) { | ||
205 | /* enable the hypervisor to free some resources */ | ||
206 | if (zpci_refresh_global(zdev)) | ||
207 | goto out; | ||
208 | |||
209 | spin_lock_irqsave(&zdev->iommu_bitmap_lock, irqflags); | ||
210 | bitmap_andnot(zdev->iommu_bitmap, zdev->iommu_bitmap, | ||
211 | zdev->lazy_bitmap, zdev->iommu_pages); | ||
212 | bitmap_zero(zdev->lazy_bitmap, zdev->iommu_pages); | ||
213 | spin_unlock_irqrestore(&zdev->iommu_bitmap_lock, irqflags); | ||
214 | ret = 0; | ||
215 | } | ||
216 | out: | ||
217 | return ret; | ||
201 | } | 218 | } |
202 | 219 | ||
203 | static int dma_update_trans(struct zpci_dev *zdev, unsigned long pa, | 220 | static int dma_update_trans(struct zpci_dev *zdev, unsigned long pa, |
diff --git a/arch/s390/pci/pci_insn.c b/arch/s390/pci/pci_insn.c index 19bcb3b45a70..f069929e8211 100644 --- a/arch/s390/pci/pci_insn.c +++ b/arch/s390/pci/pci_insn.c | |||
@@ -89,6 +89,9 @@ int zpci_refresh_trans(u64 fn, u64 addr, u64 range) | |||
89 | if (cc) | 89 | if (cc) |
90 | zpci_err_insn(cc, status, addr, range); | 90 | zpci_err_insn(cc, status, addr, range); |
91 | 91 | ||
92 | if (cc == 1 && (status == 4 || status == 16)) | ||
93 | return -ENOMEM; | ||
94 | |||
92 | return (cc) ? -EIO : 0; | 95 | return (cc) ? -EIO : 0; |
93 | } | 96 | } |
94 | 97 | ||
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index c94b606e0df8..ee14d8e45c97 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
@@ -2803,6 +2803,16 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) | |||
2803 | erp = dasd_3990_erp_handle_match_erp(cqr, erp); | 2803 | erp = dasd_3990_erp_handle_match_erp(cqr, erp); |
2804 | } | 2804 | } |
2805 | 2805 | ||
2806 | |||
2807 | /* | ||
2808 | * For path verification work we need to stick with the path that was | ||
2809 | * originally chosen so that the per path configuration data is | ||
2810 | * assigned correctly. | ||
2811 | */ | ||
2812 | if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) { | ||
2813 | erp->lpm = cqr->lpm; | ||
2814 | } | ||
2815 | |||
2806 | if (device->features & DASD_FEATURE_ERPLOG) { | 2816 | if (device->features & DASD_FEATURE_ERPLOG) { |
2807 | /* print current erp_chain */ | 2817 | /* print current erp_chain */ |
2808 | dev_err(&device->cdev->dev, | 2818 | dev_err(&device->cdev->dev, |
diff --git a/drivers/s390/char/Makefile b/drivers/s390/char/Makefile index 05ac6ba15a53..614b44e70a28 100644 --- a/drivers/s390/char/Makefile +++ b/drivers/s390/char/Makefile | |||
@@ -17,6 +17,8 @@ CFLAGS_REMOVE_sclp_early_core.o += $(CC_FLAGS_MARCH) | |||
17 | CFLAGS_sclp_early_core.o += -march=z900 | 17 | CFLAGS_sclp_early_core.o += -march=z900 |
18 | endif | 18 | endif |
19 | 19 | ||
20 | CFLAGS_sclp_early_core.o += -D__NO_FORTIFY | ||
21 | |||
20 | obj-y += ctrlchar.o keyboard.o defkeymap.o sclp.o sclp_rw.o sclp_quiesce.o \ | 22 | obj-y += ctrlchar.o keyboard.o defkeymap.o sclp.o sclp_rw.o sclp_quiesce.o \ |
21 | sclp_cmd.o sclp_config.o sclp_cpi_sys.o sclp_ocf.o sclp_ctl.o \ | 23 | sclp_cmd.o sclp_config.o sclp_cpi_sys.o sclp_ocf.o sclp_ctl.o \ |
22 | sclp_early.o sclp_early_core.o | 24 | sclp_early.o sclp_early_core.o |