]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'trivial/for-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 11 Feb 2016 01:47:49 +0000 (12:47 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 11 Feb 2016 01:47:53 +0000 (12:47 +1100)
20 files changed:
1  2 
drivers/base/core.c
drivers/dma/dw/core.c
drivers/dma/ioat/init.c
drivers/gpu/drm/i915/i915_gem_fence.c
drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c
drivers/media/platform/exynos4-is/fimc-is.c
drivers/media/platform/exynos4-is/mipi-csis.c
drivers/phy/phy-core.c
drivers/rtc/rtc-rx8025.c
drivers/scsi/ufs/ufshcd.c
drivers/usb/dwc3/ep0.c
drivers/usb/dwc3/gadget.c
drivers/usb/gadget/legacy/Kconfig
drivers/usb/host/uhci-q.c
include/linux/device.h
kernel/memremap.c
kernel/time/timekeeping.c
lib/842/842_decompress.c
mm/balloon_compaction.c
net/openvswitch/vport-geneve.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 70ee3775de24ebcf2e80ab2fdad21eaad24dd2fe,9d6b55587eaa59a25c38776e43aeff51ba682c40..57cb5f98fbd6be21c941729831072ed87cad8542
@@@ -150,123 -147,20 +150,124 @@@ void devm_memunmap(struct device *dev, 
  }
  EXPORT_SYMBOL(devm_memunmap);
  
 +pfn_t phys_to_pfn_t(phys_addr_t addr, unsigned long flags)
 +{
 +      return __pfn_to_pfn_t(addr >> PAGE_SHIFT, flags);
 +}
 +EXPORT_SYMBOL(phys_to_pfn_t);
 +
  #ifdef CONFIG_ZONE_DEVICE
 +static DEFINE_MUTEX(pgmap_lock);
 +static RADIX_TREE(pgmap_radix, GFP_KERNEL);
 +#define SECTION_MASK ~((1UL << PA_SECTION_SHIFT) - 1)
 +#define SECTION_SIZE (1UL << PA_SECTION_SHIFT)
 +
  struct page_map {
        struct resource res;
 +      struct percpu_ref *ref;
 +      struct dev_pagemap pgmap;
 +      struct vmem_altmap altmap;
  };
  
 -static void devm_memremap_pages_release(struct device *dev, void *res)
 +void get_zone_device_page(struct page *page)
 +{
 +      percpu_ref_get(page->pgmap->ref);
 +}
 +EXPORT_SYMBOL(get_zone_device_page);
 +
 +void put_zone_device_page(struct page *page)
 +{
 +      put_dev_pagemap(page->pgmap);
 +}
 +EXPORT_SYMBOL(put_zone_device_page);
 +
 +static void pgmap_radix_release(struct resource *res)
 +{
 +      resource_size_t key, align_start, align_size, align_end;
 +
 +      align_start = res->start & ~(SECTION_SIZE - 1);
 +      align_size = ALIGN(resource_size(res), SECTION_SIZE);
 +      align_end = align_start + align_size - 1;
 +
 +      mutex_lock(&pgmap_lock);
 +      for (key = res->start; key <= res->end; key += SECTION_SIZE)
 +              radix_tree_delete(&pgmap_radix, key >> PA_SECTION_SHIFT);
 +      mutex_unlock(&pgmap_lock);
 +}
 +
 +static unsigned long pfn_first(struct page_map *page_map)
  {
 -      struct page_map *page_map = res;
 +      struct dev_pagemap *pgmap = &page_map->pgmap;
 +      const struct resource *res = &page_map->res;
 +      struct vmem_altmap *altmap = pgmap->altmap;
 +      unsigned long pfn;
 +
 +      pfn = res->start >> PAGE_SHIFT;
 +      if (altmap)
 +              pfn += vmem_altmap_offset(altmap);
 +      return pfn;
 +}
 +
 +static unsigned long pfn_end(struct page_map *page_map)
 +{
 +      const struct resource *res = &page_map->res;
 +
 +      return (res->start + resource_size(res)) >> PAGE_SHIFT;
 +}
 +
 +#define for_each_device_pfn(pfn, map) \
 +      for (pfn = pfn_first(map); pfn < pfn_end(map); pfn++)
 +
 +static void devm_memremap_pages_release(struct device *dev, void *data)
 +{
 +      struct page_map *page_map = data;
 +      struct resource *res = &page_map->res;
 +      resource_size_t align_start, align_size;
 +      struct dev_pagemap *pgmap = &page_map->pgmap;
 +
 +      if (percpu_ref_tryget_live(pgmap->ref)) {
-               dev_WARN(dev, "%s: page mapping is still live!\n", __func__);
++              dev_WARN(dev, true, "%s: page mapping is still live!\n",
++                       __func__);
 +              percpu_ref_put(pgmap->ref);
 +      }
  
        /* pages are dead and unused, undo the arch mapping */
 -      arch_remove_memory(page_map->res.start, resource_size(&page_map->res));
 +      align_start = res->start & ~(SECTION_SIZE - 1);
 +      align_size = ALIGN(resource_size(res), SECTION_SIZE);
 +      arch_remove_memory(align_start, align_size);
 +      pgmap_radix_release(res);
 +      dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc,
 +                      "%s: failed to free all reserved pages\n", __func__);
 +}
 +
 +/* assumes rcu_read_lock() held at entry */
 +struct dev_pagemap *find_dev_pagemap(resource_size_t phys)
 +{
 +      struct page_map *page_map;
 +
 +      WARN_ON_ONCE(!rcu_read_lock_held());
 +
 +      page_map = radix_tree_lookup(&pgmap_radix, phys >> PA_SECTION_SHIFT);
 +      return page_map ? &page_map->pgmap : NULL;
  }
  
 -void *devm_memremap_pages(struct device *dev, struct resource *res)
 +/**
 + * devm_memremap_pages - remap and provide memmap backing for the given resource
 + * @dev: hosting device for @res
 + * @res: "host memory" address range
 + * @ref: a live per-cpu reference count
 + * @altmap: optional descriptor for allocating the memmap from @res
 + *
 + * Notes:
 + * 1/ @ref must be 'live' on entry and 'dead' before devm_memunmap_pages() time
 + *    (or devm release event).
 + *
 + * 2/ @res is expected to be a host memory range that could feasibly be
 + *    treated as a "System RAM" range, i.e. not a device mmio range, but
 + *    this is not enforced.
 + */
 +void *devm_memremap_pages(struct device *dev, struct resource *res,
 +              struct percpu_ref *ref, struct vmem_altmap *altmap)
  {
        int is_ram = region_intersects(res->start, resource_size(res),
                        "System RAM");
Simple merge
Simple merge
Simple merge
Simple merge