]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Jul 2017 22:39:36 +0000 (15:39 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Jul 2017 22:39:36 +0000 (15:39 -0700)
Pull s390 updates from Martin Schwidefsky:
 "The bulk of the s390 patches for 4.13. Some new things but mostly bug
  fixes and cleanups. Noteworthy changes:

   - The SCM block driver is converted to blk-mq

   - Switch s390 to 5 level page tables. The virtual address space for a
     user space process can now have up to 16EB-4KB.

   - Introduce a ELF phdr flag for qemu to avoid the global
     vm.alloc_pgste which forces all processes to large page tables

   - A couple of PCI improvements to improve error recovery

   - Included is the merge of the base support for proper machine checks
     for KVM"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (52 commits)
  s390/dasd: Fix faulty ENODEV for RO sysfs attribute
  s390/pci: recognize name clashes with uids
  s390/pci: provide more debug information
  s390/pci: fix handling of PEC 306
  s390/pci: improve pci hotplug
  s390/pci: introduce clp_get_state
  s390/pci: improve error handling during fmb (de)registration
  s390/pci: improve unreg_ioat error handling
  s390/pci: improve error handling during interrupt deregistration
  s390/pci: don't cleanup in arch_setup_msi_irqs
  KVM: s390: Backup the guest's machine check info
  s390/nmi: s390: New low level handling for machine check happening in guest
  s390/fpu: export save_fpu_regs for all configs
  s390/kvm: avoid global config of vm.alloc_pgste=1
  s390: rename struct psw_bits members
  s390: rename psw_bits enums
  s390/mm: use correct address space when enabling DAT
  s390/cio: introduce io_subchannel_type
  s390/ipl: revert Load Normal semantics for LPAR CCW-type re-IPL
  s390/dumpstack: remove raw stack dump
  ...

1  2 
arch/s390/Kconfig
arch/s390/include/asm/kvm_host.h
arch/s390/include/asm/processor.h
arch/s390/kvm/gaccess.c
arch/s390/kvm/kvm-s390.c
arch/s390/mm/mmap.c
drivers/s390/block/dasd.c
drivers/s390/block/scm_blk.c
drivers/s390/block/scm_blk.h

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 3c2c84b728772d78dd8d0cb22a2611f198854356,725f912fab41c286e9b16775c9d12522767b58ca..42018a20f2b7516309a41db87dce04c83098b1e7
@@@ -231,22 -228,12 +228,12 @@@ static inline void scm_request_init(str
        aob->request.data = (u64) aobrq;
        scmrq->bdev = bdev;
        scmrq->retries = 4;
 -      scmrq->error = 0;
 +      scmrq->error = BLK_STS_OK;
        /* We don't use all msbs - place aidaws at the end of the aob page. */
        scmrq->next_aidaw = (void *) &aob->msb[nr_requests_per_io];
-       scm_request_cluster_init(scmrq);
  }
  
- static void scm_ensure_queue_restart(struct scm_blk_dev *bdev)
- {
-       if (atomic_read(&bdev->queued_reqs)) {
-               /* Queue restart is triggered by the next interrupt. */
-               return;
-       }
-       blk_delay_queue(bdev->rq, SCM_QUEUE_DELAY);
- }
- void scm_request_requeue(struct scm_request *scmrq)
+ static void scm_request_requeue(struct scm_request *scmrq)
  {
        struct scm_blk_dev *bdev = scmrq->bdev;
        int i;
@@@ -419,43 -394,28 +394,28 @@@ restart
                return;
  
  requeue:
-       spin_lock_irqsave(&bdev->rq_lock, flags);
        scm_request_requeue(scmrq);
-       spin_unlock_irqrestore(&bdev->rq_lock, flags);
  }
  
- static void scm_blk_tasklet(struct scm_blk_dev *bdev)
 -void scm_blk_irq(struct scm_device *scmdev, void *data, int error)
++void scm_blk_irq(struct scm_device *scmdev, void *data, blk_status_t error)
  {
-       struct scm_request *scmrq;
-       unsigned long flags;
-       spin_lock_irqsave(&bdev->lock, flags);
-       while (!list_empty(&bdev->finished_requests)) {
-               scmrq = list_first_entry(&bdev->finished_requests,
-                                        struct scm_request, list);
-               list_del(&scmrq->list);
-               spin_unlock_irqrestore(&bdev->lock, flags);
+       struct scm_request *scmrq = data;
  
-               if (scmrq->error && scmrq->retries-- > 0) {
+       scmrq->error = error;
+       if (error) {
+               __scmrq_log_error(scmrq);
+               if (scmrq->retries-- > 0) {
                        scm_blk_handle_error(scmrq);
-                       /* Request restarted or requeued, handle next. */
-                       spin_lock_irqsave(&bdev->lock, flags);
-                       continue;
+                       return;
                }
+       }
  
-               if (scm_test_cluster_request(scmrq)) {
-                       scm_cluster_request_irq(scmrq);
-                       spin_lock_irqsave(&bdev->lock, flags);
-                       continue;
-               }
+       scm_request_finish(scmrq);
+ }
  
-               scm_request_finish(scmrq);
-               spin_lock_irqsave(&bdev->lock, flags);
-       }
-       spin_unlock_irqrestore(&bdev->lock, flags);
-       /* Look out for more requests. */
-       blk_run_queue(bdev->rq);
+ static void scm_blk_request_done(struct request *req)
+ {
+       blk_mq_end_request(req, 0);
  }
  
  static const struct block_device_operations scm_blk_devops = {
index cd598d1a4eaedc1464f22702ab9b7ed2c304f06b,242d17a91920acdf545694baef63956a717d2098..71288dd9dd7f51e8ced7e4eb799096d313f51cf3
@@@ -35,14 -32,7 +32,7 @@@ struct scm_request 
        struct aob *aob;
        struct list_head list;
        u8 retries;
 -      int error;
 +      blk_status_t error;
- #ifdef CONFIG_SCM_BLOCK_CLUSTER_WRITE
-       struct {
-               enum {CLUSTER_NONE, CLUSTER_READ, CLUSTER_WRITE} state;
-               struct list_head list;
-               void **buf;
-       } cluster;
- #endif
  };
  
  #define to_aobrq(rq) container_of((void *) rq, struct aob_rq_header, data)
  int scm_blk_dev_setup(struct scm_blk_dev *, struct scm_device *);
  void scm_blk_dev_cleanup(struct scm_blk_dev *);
  void scm_blk_set_available(struct scm_blk_dev *);
 -void scm_blk_irq(struct scm_device *, void *, int);
 +void scm_blk_irq(struct scm_device *, void *, blk_status_t);
  
- void scm_request_finish(struct scm_request *);
- void scm_request_requeue(struct scm_request *);
  struct aidaw *scm_aidaw_fetch(struct scm_request *scmrq, unsigned int bytes);
  
  int scm_drv_init(void);