Merge remote-tracking branch 'upstream' into next
authorAvi Kivity <avi@redhat.com>
Sun, 5 Aug 2012 10:25:10 +0000 (13:25 +0300)
committerAvi Kivity <avi@redhat.com>
Sun, 5 Aug 2012 10:25:10 +0000 (13:25 +0300)
 - bring back critical fixes (esp. aa67f6096c19bc)
 - provide an updated base for development

* upstream: (4334 commits)
  missed mnt_drop_write() in do_dentry_open()
  UBIFS: nuke pdflush from comments
  gfs2: nuke pdflush from comments
  drbd: nuke pdflush from comments
  nilfs2: nuke write_super from comments
  hfs: nuke write_super from comments
  vfs: nuke pdflush from comments
  jbd/jbd2: nuke write_super from comments
  btrfs: nuke pdflush from comments
  btrfs: nuke write_super from comments
  ext4: nuke pdflush from comments
  ext4: nuke write_super from comments
  ext3: nuke write_super from comments
  Documentation: fix the VM knobs descritpion WRT pdflush
  Documentation: get rid of write_super
  vfs: kill write_super and sync_supers
  ACPI processor: Fix tick_broadcast_mask online/offline regression
  ACPI: Only count valid srat memory structures
  ACPI: Untangle a return statement for better readability
  Linux 3.6-rc1
  ...

Signed-off-by: Avi Kivity <avi@redhat.com>
1  2 
arch/s390/include/asm/processor.h
arch/s390/kernel/dis.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c

index 31feac6305442d3be6921de435d7d8c2667ab24b,11e4e3236937e106aba159b83e7cc6ae6167c7b0..eac4fb5fb826b1edb7ff38697a38f3a8c94b5443
@@@ -120,7 -120,9 +120,9 @@@ struct stack_frame 
        regs->psw.mask  = psw_user_bits | PSW_MASK_BA;                  \
        regs->psw.addr  = new_psw | PSW_ADDR_AMODE;                     \
        regs->gprs[15]  = new_stackp;                                   \
+       __tlb_flush_mm(current->mm);                                    \
        crst_table_downgrade(current->mm, 1UL << 31);                   \
+       update_mm(current->mm, current);                                \
  } while (0)
  
  /* Forward declaration, a strange C thing */
@@@ -138,7 -140,6 +140,7 @@@ extern int kernel_thread(int (*fn)(voi
  extern unsigned long thread_saved_pc(struct task_struct *t);
  
  extern void show_code(struct pt_regs *regs);
 +extern int insn_to_mnemonic(unsigned char *instruction, char buf[8]);
  
  unsigned long get_wchan(struct task_struct *p);
  #define task_pt_regs(tsk) ((struct pt_regs *) \
diff --combined arch/s390/kernel/dis.c
index c02310b8db09e651424f4b08b63a3e0247679bde,619c5d3507264ca1f7417563a9152b55270374a2..ffb622b16ab5251f2b718ad0be832d03e02b4a4e
@@@ -1468,33 -1468,6 +1468,33 @@@ static struct insn *find_insn(unsigned 
        return NULL;
  }
  
 +/**
 + * insn_to_mnemonic - decode an s390 instruction
 + * @instruction: instruction to decode
 + * @buf: buffer to fill with mnemonic
 + *
 + * Decode the instruction at @instruction and store the corresponding
 + * mnemonic into @buf.
 + * @buf is left unchanged if the instruction could not be decoded.
 + * Returns:
 + *  %0 on success, %-ENOENT if the instruction was not found.
 + */
 +int insn_to_mnemonic(unsigned char *instruction, char buf[8])
 +{
 +      struct insn *insn;
 +
 +      insn = find_insn(instruction);
 +      if (!insn)
 +              return -ENOENT;
 +      if (insn->name[0] == '\0')
 +              snprintf(buf, sizeof(buf), "%s",
 +                       long_insn_name[(int) insn->name[1]]);
 +      else
 +              snprintf(buf, sizeof(buf), "%.5s", insn->name);
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(insn_to_mnemonic);
 +
  static int print_insn(char *buffer, unsigned char *code, unsigned long addr)
  {
        struct insn *insn;
  
  void show_code(struct pt_regs *regs)
  {
-       char *mode = (regs->psw.mask & PSW_MASK_PSTATE) ? "User" : "Krnl";
+       char *mode = user_mode(regs) ? "User" : "Krnl";
        unsigned char code[64];
        char buffer[64], *ptr;
        mm_segment_t old_fs;
  
        /* Get a snapshot of the 64 bytes surrounding the fault address. */
        old_fs = get_fs();
-       set_fs((regs->psw.mask & PSW_MASK_PSTATE) ? USER_DS : KERNEL_DS);
+       set_fs(user_mode(regs) ? USER_DS : KERNEL_DS);
        for (start = 32; start && regs->psw.addr >= 34 - start; start -= 2) {
                addr = regs->psw.addr - 34 + start;
                if (__copy_from_user(code + start - 2,
diff --combined arch/x86/kvm/vmx.c
index 2300e5319ed9e045ff1d766974f8bc1d30b8d3a3,c00f03de1b794af8fe65387747813d57ed2885a2..d6e4cbc42b8e8754f4c7822e1b2ad09f3f47946c
@@@ -1343,7 -1343,7 +1343,7 @@@ static bool update_transition_efer(stru
        guest_efer = vmx->vcpu.arch.efer;
  
        /*
 -       * NX is emulated; LMA and LME handled by hardware; SCE meaninless
 +       * NX is emulated; LMA and LME handled by hardware; SCE meaningless
         * outside long mode
         */
        ignore_bits = EFER_NX | EFER_SCE;
@@@ -1488,13 -1488,6 +1488,6 @@@ static void __vmx_load_host_state(struc
                loadsegment(ds, vmx->host_state.ds_sel);
                loadsegment(es, vmx->host_state.es_sel);
        }
- #else
-       /*
-        * The sysexit path does not restore ds/es, so we must set them to
-        * a reasonable value ourselves.
-        */
-       loadsegment(ds, __USER_DS);
-       loadsegment(es, __USER_DS);
  #endif
        reload_tss();
  #ifdef CONFIG_X86_64
@@@ -3261,7 -3254,7 +3254,7 @@@ static void vmx_set_segment(struct kvm_
         * qemu binaries.
         *   IA32 arch specifies that at the time of processor reset the
         * "Accessed" bit in the AR field of segment registers is 1. And qemu
 -       * is setting it to 0 in the usedland code. This causes invalid guest
 +       * is setting it to 0 in the userland code. This causes invalid guest
         * state vmexit when "unrestricted guest" mode is turned on.
         *    Fix for this setup issue in cpu_reset is being pushed in the qemu
         * tree. Newer qemu binaries with that qemu fix would not need this
@@@ -4446,7 -4439,7 +4439,7 @@@ vmx_patch_hypercall(struct kvm_vcpu *vc
        hypercall[2] = 0xc1;
  }
  
 -/* called to set cr0 as approriate for a mov-to-cr0 exit. */
 +/* called to set cr0 as appropriate for a mov-to-cr0 exit. */
  static int handle_set_cr0(struct kvm_vcpu *vcpu, unsigned long val)
  {
        if (to_vmx(vcpu)->nested.vmxon &&
@@@ -6370,6 -6363,19 +6363,19 @@@ static void __noclone vmx_vcpu_run(stru
  #endif
              );
  
+ #ifndef CONFIG_X86_64
+       /*
+        * The sysexit path does not restore ds/es, so we must set them to
+        * a reasonable value ourselves.
+        *
+        * We can't defer this to vmx_load_host_state() since that function
+        * may be executed in interrupt context, which saves and restore segments
+        * around it, nullifying its effect.
+        */
+       loadsegment(ds, __USER_DS);
+       loadsegment(es, __USER_DS);
+ #endif
        vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)
                                  | (1 << VCPU_EXREG_RFLAGS)
                                  | (1 << VCPU_EXREG_CPL)
diff --combined arch/x86/kvm/x86.c
index a87c82aa3196112c97f48e15b38f5059f3371978,42bce48f692850cf3cadf96e83c86e5f8bf760ee..3ca90d74711dc244afe36ca3f01595a1a69b0fda
@@@ -806,7 -806,7 +806,7 @@@ EXPORT_SYMBOL_GPL(kvm_rdpmc)
   * kvm-specific. Those are put in the beginning of the list.
   */
  
 -#define KVM_SAVE_MSRS_BEGIN   9
 +#define KVM_SAVE_MSRS_BEGIN   10
  static u32 msrs_to_save[] = {
        MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK,
        MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW,
@@@ -925,6 -925,10 +925,10 @@@ static void kvm_write_wall_clock(struc
         */
        getboottime(&boot);
  
+       if (kvm->arch.kvmclock_offset) {
+               struct timespec ts = ns_to_timespec(kvm->arch.kvmclock_offset);
+               boot = timespec_sub(boot, ts);
+       }
        wc.sec = boot.tv_sec;
        wc.nsec = boot.tv_nsec;
        wc.version = version;
@@@ -1093,7 -1097,7 +1097,7 @@@ void kvm_write_tsc(struct kvm_vcpu *vcp
                 * For each generation, we track the original measured
                 * nanosecond time, offset, and write, so if TSCs are in
                 * sync, we can match exact offset, and if not, we can match
 -               * exact software computaion in compute_guest_tsc()
 +               * exact software computation in compute_guest_tsc()
                 *
                 * These values are tracked in kvm->arch.cur_xxx variables.
                 */
@@@ -1500,7 -1504,7 +1504,7 @@@ static int kvm_pv_enable_async_pf(struc
  {
        gpa_t gpa = data & ~0x3f;
  
 -      /* Bits 2:5 are resrved, Should be zero */
 +      /* Bits 2:5 are reserved, Should be zero */
        if (data & 0x3c)
                return 1;
  
@@@ -1723,7 -1727,7 +1727,7 @@@ int kvm_set_msr_common(struct kvm_vcpu 
                 * Ignore all writes to this no longer documented MSR.
                 * Writes are only relevant for old K7 processors,
                 * all pre-dating SVM, but a recommended workaround from
 -               * AMD for these chips. It is possible to speicify the
 +               * AMD for these chips. It is possible to specify the
                 * affected processor models on the command line, hence
                 * the need to ignore the workaround.
                 */
@@@ -2632,6 -2636,7 +2636,6 @@@ static int kvm_set_guest_paused(struct 
        if (!vcpu->arch.time_page)
                return -EINVAL;
        src->flags |= PVCLOCK_GUEST_STOPPED;
 -      mark_page_dirty(vcpu->kvm, vcpu->arch.time >> PAGE_SHIFT);
        kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
        return 0;
  }
@@@ -3082,7 -3087,7 +3086,7 @@@ static int kvm_vm_ioctl_reinject(struc
        if (!kvm->arch.vpit)
                return -ENXIO;
        mutex_lock(&kvm->arch.vpit->pit_state.lock);
 -      kvm->arch.vpit->pit_state.pit_timer.reinject = control->pit_reinject;
 +      kvm->arch.vpit->pit_state.reinject = control->pit_reinject;
        mutex_unlock(&kvm->arch.vpit->pit_state.lock);
        return 0;
  }
        return r;
  }
  
 +int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event)
 +{
 +      if (!irqchip_in_kernel(kvm))
 +              return -ENXIO;
 +
 +      irq_event->status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
 +                                      irq_event->irq, irq_event->level);
 +      return 0;
 +}
 +
  long kvm_arch_vm_ioctl(struct file *filp,
                       unsigned int ioctl, unsigned long arg)
  {
        create_pit_unlock:
                mutex_unlock(&kvm->slots_lock);
                break;
 -      case KVM_IRQ_LINE_STATUS:
 -      case KVM_IRQ_LINE: {
 -              struct kvm_irq_level irq_event;
 -
 -              r = -EFAULT;
 -              if (copy_from_user(&irq_event, argp, sizeof irq_event))
 -                      goto out;
 -              r = -ENXIO;
 -              if (irqchip_in_kernel(kvm)) {
 -                      __s32 status;
 -                      status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
 -                                      irq_event.irq, irq_event.level);
 -                      if (ioctl == KVM_IRQ_LINE_STATUS) {
 -                              r = -EFAULT;
 -                              irq_event.status = status;
 -                              if (copy_to_user(argp, &irq_event,
 -                                                      sizeof irq_event))
 -                                      goto out;
 -                      }
 -                      r = 0;
 -              }
 -              break;
 -      }
        case KVM_GET_IRQCHIP: {
                /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
                struct kvm_irqchip *chip;
@@@ -4478,7 -4496,7 +4482,7 @@@ static bool reexecute_instruction(struc
  
        /*
         * if emulation was due to access to shadowed page table
 -       * and it failed try to unshadow page and re-entetr the
 +       * and it failed try to unshadow page and re-enter the
         * guest to let CPU execute the instruction.
         */
        if (kvm_mmu_unprotect_page_virt(vcpu, gva))
@@@ -5574,7 -5592,7 +5578,7 @@@ int kvm_arch_vcpu_ioctl_get_regs(struc
                /*
                 * We are here if userspace calls get_regs() in the middle of
                 * instruction emulation. Registers state needs to be copied
 -               * back from emulation context to vcpu. Usrapace shouldn't do
 +               * back from emulation context to vcpu. Userspace shouldn't do
                 * that usually, but some bad designed PV devices (vmware
                 * backdoor interface) need this to work
                 */
@@@ -6103,7 -6121,7 +6107,7 @@@ int kvm_arch_hardware_enable(void *garb
         * as we reset last_host_tsc on all VCPUs to stop this from being
         * called multiple times (one for each physical CPU bringup).
         *
 -       * Platforms with unnreliable TSCs don't have to deal with this, they
 +       * Platforms with unreliable TSCs don't have to deal with this, they
         * will be compensated by the logic in vcpu_load, which sets the TSC to
         * catchup mode.  This will catchup all VCPUs to real time, but cannot
         * guarantee that they stay in perfect synchronization.
@@@ -6300,10 -6318,6 +6304,10 @@@ void kvm_arch_free_memslot(struct kvm_m
        int i;
  
        for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) {
 +              if (!dont || free->arch.rmap_pde[i] != dont->arch.rmap_pde[i]) {
 +                      kvm_kvfree(free->arch.rmap_pde[i]);
 +                      free->arch.rmap_pde[i] = NULL;
 +              }
                if (!dont || free->arch.lpage_info[i] != dont->arch.lpage_info[i]) {
                        kvm_kvfree(free->arch.lpage_info[i]);
                        free->arch.lpage_info[i] = NULL;
@@@ -6323,11 -6337,6 +6327,11 @@@ int kvm_arch_create_memslot(struct kvm_
                lpages = gfn_to_index(slot->base_gfn + npages - 1,
                                      slot->base_gfn, level) + 1;
  
 +              slot->arch.rmap_pde[i] =
 +                      kvm_kvzalloc(lpages * sizeof(*slot->arch.rmap_pde[i]));
 +              if (!slot->arch.rmap_pde[i])
 +                      goto out_free;
 +
                slot->arch.lpage_info[i] =
                        kvm_kvzalloc(lpages * sizeof(*slot->arch.lpage_info[i]));
                if (!slot->arch.lpage_info[i])
  
  out_free:
        for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) {
 +              kvm_kvfree(slot->arch.rmap_pde[i]);
                kvm_kvfree(slot->arch.lpage_info[i]);
 +              slot->arch.rmap_pde[i] = NULL;
                slot->arch.lpage_info[i] = NULL;
        }
        return -ENOMEM;
@@@ -6378,7 -6385,7 +6382,7 @@@ int kvm_arch_prepare_memory_region(stru
                map_flags = MAP_SHARED | MAP_ANONYMOUS;
  
        /*To keep backward compatibility with older userspace,
 -       *x86 needs to hanlde !user_alloc case.
 +       *x86 needs to handle !user_alloc case.
         */
        if (!user_alloc) {
                if (npages && !old.rmap) {