]> Pileus Git - ~andy/linux/commitdiff
Merge tag 'stable/for-linus-3.14-rc0-tag' of git://git.kernel.org/pub/scm/linux/kerne...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 27 Jan 2014 16:17:09 +0000 (08:17 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 27 Jan 2014 16:17:09 +0000 (08:17 -0800)
Pull swiotlb bug-fixes from Konrad Rzeszutek Wilk:
 - Don't DoS with 'swiotlb is full' message.
 - Documentation update.

* tag 'stable/for-linus-3.14-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb:
  swiotlb: Don't DoS us with 'swiotlb buffer is full' (v2)
  swiotlb: update format

1  2 
Documentation/kernel-parameters.txt
lib/swiotlb.c

index be6ba33d4ff1ae85bc6bad162e5f9d6a210bbc32,557763487a1ae459077d784042ad0ad6fe3ca975..8f441dab03963624c0f32eb8f030c2b3c9a38f9d
@@@ -343,9 -343,6 +343,9 @@@ bytes respectively. Such letter suffixe
                        no: ACPI OperationRegions are not marked as reserved,
                        no further checks are performed.
  
 +      acpi_no_memhotplug [ACPI] Disable memory hotplug.  Useful for kdump
 +                         kernels.
 +
        add_efi_memmap  [EFI; X86] Include EFI memory map in
                        kernel's map of available physical RAM.
  
        atkbd.softrepeat= [HW]
                        Use software keyboard repeat
  
 +      audit=          [KNL] Enable the audit sub-system
 +                      Format: { "0" | "1" } (0 = disabled, 1 = enabled)
 +                      0 - kernel audit is disabled and can not be enabled
 +                          until the next reboot
 +                      unset - kernel audit is initialized but disabled and
 +                          will be fully enabled by the userspace auditd.
 +                      1 - kernel audit is initialized and partially enabled,
 +                          storing at most audit_backlog_limit messages in
 +                          RAM until it is fully enabled by the userspace
 +                          auditd.
 +                      Default: unset
 +
 +      audit_backlog_limit= [KNL] Set the audit queue size limit.
 +                      Format: <int> (must be >=0)
 +                      Default: 64
 +
        baycom_epp=     [HW,AX25]
                        Format: <io>,<mode>
  
  
        cgroup_disable= [KNL] Disable a particular controller
                        Format: {name of the controller(s) to disable}
 -                              {Currently supported controllers - "memory"}
 +                      The effects of cgroup_disable=foo are:
 +                      - foo isn't auto-mounted if you mount all cgroups in
 +                        a single hierarchy
 +                      - foo isn't visible as an individually mountable
 +                        subsystem
 +                      {Currently only "memory" controller deal with this and
 +                      cut the overhead, others just disable the usage. So
 +                      only cgroup_disable=memory is actually worthy}
  
        checkreqprot    [SELINUX] Set initial checkreqprot flag value.
                        Format: { "0" | "1" }
        disable=        [IPV6]
                        See Documentation/networking/ipv6.txt.
  
 +      disable_cpu_apicid= [X86,APIC,SMP]
 +                      Format: <int>
 +                      The number of initial APIC ID for the
 +                      corresponding CPU to be disabled at boot,
 +                      mostly used for the kdump 2nd kernel to
 +                      disable BSP to wake up multiple CPUs without
 +                      causing system reset or hang due to sending
 +                      INIT from AP to BSP.
 +
        disable_ddw     [PPC/PSERIES]
                        Disable Dynamic DMA Window support. Use this if
                        to workaround buggy firmware.
  
                        The xen output can only be used by Xen PV guests.
  
 +      edac_report=    [HW,EDAC] Control how to report EDAC event
 +                      Format: {"on" | "off" | "force"}
 +                      on: enable EDAC to report H/W event. May be overridden
 +                      by other higher priority error reporting module.
 +                      off: disable H/W event reporting through EDAC.
 +                      force: enforce the use of EDAC to report H/W event.
 +                      default: on.
 +
        ekgdboc=        [X86,KGDB] Allow early kernel console debugging
                        ekgdboc=kbd
  
        edd=            [EDD]
                        Format: {"off" | "on" | "skip[mbr]"}
  
 +      efi=            [EFI]
 +                      Format: { "old_map" }
 +                      old_map [X86-64]: switch to the old ioremap-based EFI
 +                      runtime services mapping. 32-bit still uses this one by
 +                      default.
 +
        efi_no_storage_paranoia [EFI; X86]
                        Using this parameter you can use more than 50% of
                        your efi variable storage. Use this parameter only if
                        debugfs files are removed at module unload time.
  
        gpt             [EFI] Forces disk with valid GPT signature but
 -                      invalid Protective MBR to be treated as GPT.
 +                      invalid Protective MBR to be treated as GPT. If the
 +                      primary GPT is corrupted, it enables the backup/alternate
 +                      GPT to be used instead.
  
        grcan.enable0=  [HW] Configuration of physical interface 0. Determines
                        the "Enable 0" bit of the configuration register.
                        Valid arguments: on, off
                        Default: on
  
 +      kmemcheck=      [X86] Boot-time kmemcheck enable/disable/one-shot mode
 +                      Valid arguments: 0, 1, 2
 +                      kmemcheck=0 (disabled)
 +                      kmemcheck=1 (enabled)
 +                      kmemcheck=2 (one-shot mode)
 +                      Default: 2 (one-shot mode)
 +
        kstack=N        [X86] Print N words from the kernel stack
                        in oops dumps.
  
  
                        * atapi_dmadir: Enable ATAPI DMADIR bridge support
  
 +                      * disable: Disable this device.
 +
                        If there are multiple matching configurations changing
                        the same attribute, the last one is used.
  
        noapic          [SMP,APIC] Tells the kernel to not make use of any
                        IOAPICs that may be present in the system.
  
 +      nokaslr         [X86]
 +                      Disable kernel base offset ASLR (Address Space
 +                      Layout Randomization) if built into the kernel.
 +
        noautogroup     Disable scheduler automatic task group creation.
  
        nobats          [PPC] Do not use BATs for mapping kernel lowmem
                        for RCU-preempt, and "s" for RCU-sched, and "N"
                        is the CPU number.  This reduces OS jitter on the
                        offloaded CPUs, which can be useful for HPC and
 -
                        real-time workloads.  It can also improve energy
                        efficiency for asymmetric multiprocessors.
  
                        periodically wake up to do the polling.
  
        rcutree.blimit= [KNL]
 -                      Set maximum number of finished RCU callbacks to process
 -                      in one batch.
 +                      Set maximum number of finished RCU callbacks to
 +                      process in one batch.
  
        rcutree.rcu_fanout_leaf= [KNL]
                        Increase the number of CPUs assigned to each
                        value is one, and maximum value is HZ.
  
        rcutree.qhimark= [KNL]
 -                      Set threshold of queued
 -                      RCU callbacks over which batch limiting is disabled.
 +                      Set threshold of queued RCU callbacks beyond which
 +                      batch limiting is disabled.
  
        rcutree.qlowmark= [KNL]
                        Set threshold of queued RCU callbacks below which
                        controller if no parameter or 1 is given or disable
                        it if 0 is given (See Documentation/cgroups/memory.txt)
  
-       swiotlb=        [IA-64] Number of I/O TLB slabs
+       swiotlb=        [ARM,IA-64,PPC,MIPS,X86]
+                       Format: { <int> | force }
+                       <int> -- Number of I/O TLB slabs
+                       force -- force using of bounce buffers even if they
+                                wouldn't be automatically used by the kernel
  
        switches=       [HW,M68k]
  
diff --combined lib/swiotlb.c
index 615f3de4b5ce2e3248a101f1adc174a03d65b6fb,4634ac9cdb38e8fd31ed06f073078f8e7010c6e4..2e1c102759ce7a18f9a988b54c14c0b4c154d0bb
@@@ -172,9 -172,8 +172,9 @@@ int __init swiotlb_init_with_tbl(char *
        /*
         * Get the overflow emergency buffer
         */
 -      v_overflow_buffer = alloc_bootmem_low_pages_nopanic(
 -                                              PAGE_ALIGN(io_tlb_overflow));
 +      v_overflow_buffer = memblock_virt_alloc_nopanic(
 +                                              PAGE_ALIGN(io_tlb_overflow),
 +                                              PAGE_SIZE);
        if (!v_overflow_buffer)
                return -ENOMEM;
  
         * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE
         * between io_tlb_start and io_tlb_end.
         */
 -      io_tlb_list = alloc_bootmem_pages(PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
 +      io_tlb_list = memblock_virt_alloc(
 +                              PAGE_ALIGN(io_tlb_nslabs * sizeof(int)),
 +                              PAGE_SIZE);
        for (i = 0; i < io_tlb_nslabs; i++)
                io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
        io_tlb_index = 0;
 -      io_tlb_orig_addr = alloc_bootmem_pages(PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
 +      io_tlb_orig_addr = memblock_virt_alloc(
 +                              PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)),
 +                              PAGE_SIZE);
  
        if (verbose)
                swiotlb_print_info();
@@@ -220,13 -215,13 +220,13 @@@ swiotlb_init(int verbose
        bytes = io_tlb_nslabs << IO_TLB_SHIFT;
  
        /* Get IO TLB memory from the low pages */
 -      vstart = alloc_bootmem_low_pages_nopanic(PAGE_ALIGN(bytes));
 +      vstart = memblock_virt_alloc_nopanic(PAGE_ALIGN(bytes), PAGE_SIZE);
        if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
                return;
  
        if (io_tlb_start)
 -              free_bootmem(io_tlb_start,
 -                               PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
 +              memblock_free_early(io_tlb_start,
 +                                  PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
        pr_warn("Cannot allocate SWIOTLB buffer");
        no_iotlb_memory = true;
  }
@@@ -362,14 -357,14 +362,14 @@@ void __init swiotlb_free(void
                free_pages((unsigned long)phys_to_virt(io_tlb_start),
                           get_order(io_tlb_nslabs << IO_TLB_SHIFT));
        } else {
 -              free_bootmem_late(io_tlb_overflow_buffer,
 -                                PAGE_ALIGN(io_tlb_overflow));
 -              free_bootmem_late(__pa(io_tlb_orig_addr),
 -                                PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
 -              free_bootmem_late(__pa(io_tlb_list),
 -                                PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
 -              free_bootmem_late(io_tlb_start,
 -                                PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
 +              memblock_free_late(io_tlb_overflow_buffer,
 +                                 PAGE_ALIGN(io_tlb_overflow));
 +              memblock_free_late(__pa(io_tlb_orig_addr),
 +                                 PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
 +              memblock_free_late(__pa(io_tlb_list),
 +                                 PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
 +              memblock_free_late(io_tlb_start,
 +                                 PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
        }
        io_tlb_nslabs = 0;
  }
@@@ -510,7 -505,8 +510,8 @@@ phys_addr_t swiotlb_tbl_map_single(stru
  
  not_found:
        spin_unlock_irqrestore(&io_tlb_lock, flags);
-       dev_warn(hwdev, "swiotlb buffer is full\n");
+       if (printk_ratelimit())
+               dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size);
        return SWIOTLB_MAP_ERROR;
  found:
        spin_unlock_irqrestore(&io_tlb_lock, flags);