s390 patches for 4.8-rc3
Subsystems (6)
Hi Linus,
please pull from the 'for-linus' branch of
git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git for-linus
to receive the following updates:
A couple of bug fixes, minor cleanup and a change to the default config.
Christian Borntraeger (3):
s390/crc32-vx: Fix checksum calculation for small sizes s390/lib: fix memcmp and strstr
s390/config: make the vector optimized crc function builtin
Heiko Carstens (1):
s390/pageattr: handle numpages parameter correctly
Sascha Silbe (1):
s390: clarify compressed image code path
Sebastian Ott (6):
s390/cio: stop using subchannel_id from ccw_device_private s390/qdio: obtain subchannel_id via ccw_device_get_schid() s390/cio: remove subchannel_id from ccw_device_private s390/qdio: get rid of spin_lock_irqsave usage s390/qdio: fix double return code evaluation s390/qdio: remove checks for ccw device internal state
Stefan Haberland (2):
s390/dasd: fix hanging device after clear subchannel s390/dasd: fix failing CUIR assignment under LPAR
Ursula Braun (1):
s390/qdio: avoid reschedule of outbound tasklet once killed
arch/s390/boot/compressed/head.S | 11 +++- arch/s390/configs/default_defconfig | 2 +- arch/s390/configs/gcov_defconfig | 2 +- arch/s390/configs/performance_defconfig | 2 +- arch/s390/crypto/crc32-vx.c | 6 +- arch/s390/defconfig | 2 +- arch/s390/kernel/head.S | 4 +- arch/s390/lib/string.c | 16 ++--- arch/s390/mm/pageattr.c | 2 + drivers/s390/block/dasd.c | 10 ++- drivers/s390/block/dasd_eckd.c | 10 +++ drivers/s390/cio/device.c | 2 - drivers/s390/cio/device_status.c | 7 +- drivers/s390/cio/io_sch.h | 1 - drivers/s390/cio/qdio_main.c | 113 ++++++++++++++++---------------- 15 files changed, 107 insertions(+), 83 deletions(-)
arch/s390/boot/compressed/head.S +8 -3
@@ -21,16 +21,21 @@ ENTRY(startup_continue) lg %r15,.Lstack-.LPG1(%r13) aghi %r15,-160 brasl %r14,decompress_kernel - # setup registers for memory mover & branch to target + # Set up registers for memory mover. We move the decompressed image to + # 0x11000, starting at offset 0x11000 in the decompressed image so + # that code living at 0x11000 in the image will end up at 0x11000 in + # memory. lgr %r4,%r2 lg %r2,.Loffset-.LPG1(%r13) la %r4,0(%r2,%r4) lg %r3,.Lmvsize-.LPG1(%r13) lgr %r5,%r3 - # move the memory mover someplace safe + # Move the memory mover someplace safe so it doesn't overwrite itself. la %r1,0x200 mvc 0(mover_end-mover,%r1),mover-.LPG1(%r13) - # decompress image is started at 0x11000 + # When the memory mover is done we pass control to + # arch/s390/kernel/head64.S:startup_continue which lives at 0x11000 in + # the decompressed image. lgr %r6,%r2 br %r1 mover:
arch/s390/configs/default_defconfig +1 -1
@@ -678,7 +678,7 @@ CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_AES_S390=m CONFIG_CRYPTO_GHASH_S390=m -CONFIG_CRYPTO_CRC32_S390=m +CONFIG_CRYPTO_CRC32_S390=y CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m CONFIG_X509_CERTIFICATE_PARSER=m
arch/s390/configs/gcov_defconfig +1 -1
@@ -616,7 +616,7 @@ CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_AES_S390=m CONFIG_CRYPTO_GHASH_S390=m -CONFIG_CRYPTO_CRC32_S390=m +CONFIG_CRYPTO_CRC32_S390=y CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m CONFIG_X509_CERTIFICATE_PARSER=m
arch/s390/configs/performance_defconfig +1 -1
@@ -615,7 +615,7 @@ CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_AES_S390=m CONFIG_CRYPTO_GHASH_S390=m -CONFIG_CRYPTO_CRC32_S390=m +CONFIG_CRYPTO_CRC32_S390=y CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m CONFIG_X509_CERTIFICATE_PARSER=m
arch/s390/crypto/crc32-vx.c +3 -3
@@ -51,6 +51,9 @@ u32 crc32c_le_vgfm_16(u32 crc, unsigned char const *buf, size_t size);struct kernel_fpu vxstate; \unsigned long prealign, aligned, remaining; \ \ +if (datalen <VX_MIN_LEN +VX_ALIGN_MASK ) \ +return ___crc32_sw (crc, data, datalen); \ + \if ((unsigned long )data &VX_ALIGN_MASK ) { \ prealign =VX_ALIGNMENT - \ ((unsigned long )data &VX_ALIGN_MASK ); \
@@ -59,9 +62,6 @@ u32 crc32c_le_vgfm_16(u32 crc, unsigned char const *buf, size_t size); data = (void *)((unsigned long )data + prealign); \ } \ \ -if (datalen <VX_MIN_LEN ) \ -return ___crc32_sw (crc, data, datalen); \ - \ aligned = datalen & ~VX_ALIGN_MASK ; \ remaining = datalen &VX_ALIGN_MASK ; \ \
arch/s390/defconfig +1 -1
@@ -234,7 +234,7 @@ CONFIG_CRYPTO_SHA256_S390=m CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_AES_S390=m -CONFIG_CRYPTO_CRC32_S390=m +CONFIG_CRYPTO_CRC32_S390=y CONFIG_CRC7=m # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set
arch/s390/kernel/head.S +3 -1
@@ -309,7 +309,9 @@ ENTRY(startup_kdump) l %r15,.Lstack-.LPG0(%r13) ahi %r15,-STACK_FRAME_OVERHEAD brasl %r14,verify_facilities - /* Continue with startup code in head64.S */ +# For uncompressed images, continue in +# arch/s390/kernel/head64.S. For compressed images, continue in +# arch/s390/boot/compressed/head.S. jg startup_continue .Lstack:
arch/s390/lib/string.c +7 -9
@@ -237,11 +237,10 @@ char * strrchr(const char * s, int c)EXPORT_SYMBOL (strrchr);static inline int clcle (const char *s1,unsigned long l1, -const char *s2,unsigned long l2, -int *diff) +const char *s2,unsigned long l2) { register unsigned long r2 asm("2") = (unsigned long) s1; - register unsigned long r3 asm("3") = (unsigned long) l2; + register unsigned long r3 asm("3") = (unsigned long) l1; register unsigned long r4 asm("4") = (unsigned long) s2; register unsigned long r5 asm("5") = (unsigned long) l2;int cc;
@@ -252,7 +251,6 @@ static inline int clcle(const char *s1, unsigned long l1, " srl %0,28" : "=&d" (cc), "+a" (r2), "+a" (r3), "+a" (r4), "+a" (r5) : : "cc"); - *diff = *(char *)r2 - *(char *)r4;return cc; }
@@ -270,9 +268,9 @@ char * strstr(const char * s1,const char * s2)return (char *) s1; l1 =__strend (s1) - s1;while (l1-- >= l2) { -int cc, dummy; +int cc; - cc =clcle (s1, l1, s2, l2, &dummy); + cc =clcle (s1, l2, s2, l2);if (!cc)return (char *) s1; s1++;
@@ -313,11 +311,11 @@ EXPORT_SYMBOL(memchr);*/ int memcmp (const void *cs,const void *ct,size_t n) { -int ret, diff; +int ret; - ret =clcle (cs, n, ct, n, &diff); + ret =clcle (cs, n, ct, n);if (ret) - ret = diff; + ret = ret ==1 ?-1 :1 ;return ret; }EXPORT_SYMBOL (memcmp);
arch/s390/mm/pageattr.c +2 -0
@@ -252,6 +252,8 @@ static int change_page_attr(unsigned long addr, unsigned long end,int rc = -EINVAL ;pgd_t *pgdp; +if (addr == end) +return 0 ;if (end >=MODULES_END )return -EINVAL ;mutex_lock (&cpa_mutex);
drivers/s390/block/dasd.c +9 -1
@@ -1643,9 +1643,18 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,u8 *sense =NULL ;int expires; + cqr = (struct dasd_ccw_req *) intparm;if (IS_ERR (irb)) {switch (PTR_ERR (irb)) {case -EIO : +if (cqr && cqr->status ==DASD_CQR_CLEAR_PENDING ) { + device = (struct dasd_device *) cqr->startdev; + cqr->status =DASD_CQR_CLEARED ; +dasd_device_clear_timer (device); +wake_up (&dasd_flush_wq); +dasd_schedule_device_bh (device); +return ; + }break ;case -ETIMEDOUT : DBF_EVENT_DEVID(DBF_WARNING, cdev, "%s: "
@@ -1661,7 +1670,6 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, } now =get_tod_clock (); - cqr = (struct dasd_ccw_req *) intparm;/* check for conditions that should be handled immediately */ if (!cqr || !(scsw_dstat(&irb->scsw) == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) &&
drivers/s390/block/dasd_eckd.c +10 -0
@@ -5078,6 +5078,8 @@ static int dasd_eckd_read_message_buffer(struct dasd_device *device,return PTR_ERR (cqr); } + cqr->lpm = lpum; +retry: cqr->startdev = device; cqr->memdev = device; cqr->block =NULL ;
@@ -5122,6 +5124,14 @@ static int dasd_eckd_read_message_buffer(struct dasd_device *device, (prssdp +1 );memcpy (messages, message_buf,sizeof (struct dasd_rssd_messages )); + }else if (cqr->lpm) { +/* +* on z/VM we might not be able to do I/O on the requested path +* but instead we get the required information on any path +* so retry with open path mask +*/ + cqr->lpm =0 ; + goto retry; }else DBF_EVENT_DEVID (DBF_WARNING , device->cdev, "Reading messages failed with rc=%d\n"
drivers/s390/cio/device.c +0 -2
@@ -762,7 +762,6 @@ static int io_subchannel_initialize_dev(struct subchannel *sch, priv->state =DEV_STATE_NOT_OPER ; priv->dev_id.devno = sch->schib.pmcw.dev; priv->dev_id.ssid = sch->schid.ssid; - priv->schid = sch->schid;INIT_WORK (&priv->todo_work, ccw_device_todo);INIT_LIST_HEAD (&priv->cmb_list);
@@ -1000,7 +999,6 @@ static int ccw_device_move_to_sch(struct ccw_device *cdev,put_device (&old_sch->dev);/* Initialize new subchannel. */ spin_lock_irq (sch->lock); - cdev->private->schid = sch->schid; cdev->ccwlock = sch->lock;if (!sch_is_pseudo_sch (sch))sch_set_cdev (sch, cdev);
drivers/s390/cio/device_status.c +4 -3
@@ -26,6 +26,7 @@static void ccw_device_msg_control_check (struct ccw_device *cdev,struct irb *irb) { +struct subchannel *sch =to_subchannel (cdev->dev.parent);char dbf_text[15 ]; if (!scsw_is_valid_cstat(&irb->scsw) ||
@@ -36,10 +37,10 @@ ccw_device_msg_control_check(struct ccw_device *cdev, struct irb *irb)"received" " ... device %04x on subchannel 0.%x.%04x, dev_stat " ": %02X sch_stat : %02X\n" , - cdev->private->dev_id.devno, cdev->private->schid.ssid, - cdev->private->schid.sch_no, + cdev->private->dev_id.devno, sch->schid.ssid, + sch->schid.sch_no, scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw)); -sprintf (dbf_text,"chk%x" , cdev->private->schid.sch_no); +sprintf (dbf_text,"chk%x" , sch->schid.sch_no);CIO_TRACE_EVENT (0 , dbf_text);CIO_HEX_EVENT (0 , irb,sizeof (struct irb )); }
drivers/s390/cio/io_sch.h +0 -1
@@ -120,7 +120,6 @@ struct ccw_device_private {int state;/* device state */ atomic_t onoff;struct ccw_dev_id dev_id;/* device id */ -struct subchannel_id schid;/* subchannel number */ struct ccw_request req;/* internal I/O request */ int iretry;u8 pgid_valid_mask;/* mask of valid PGIDs */
drivers/s390/cio/qdio_main.c +57 -56
319 lines not on this page · raw message