Merge branch 'for-4.12/dax' into libnvdimm-for-next
authorDan Williams <dan.j.williams@intel.com>
Fri, 5 May 2017 06:38:43 +0000 (23:38 -0700)
committerDan Williams <dan.j.williams@intel.com>
Fri, 5 May 2017 06:38:43 +0000 (23:38 -0700)
1  2 
drivers/acpi/nfit/core.c
drivers/dax/dax-private.h
drivers/dax/device.c
drivers/nvdimm/claim.c
drivers/nvdimm/pmem.c
tools/testing/nvdimm/Kbuild
tools/testing/nvdimm/dax-dev.c

Simple merge
index b1cd7a8e5ab9126be730b8a65cbd5c5e91bb6ffe,0000000000000000000000000000000000000000..b6fc4f04636de1cd52d4195331b1e4168847bb1e
mode 100644,000000..100644
--- /dev/null
@@@ -1,61 -1,0 +1,57 @@@
-  * struct dax_dev - subdivision of a dax region
 +/*
 + * Copyright(c) 2016 Intel Corporation. All rights reserved.
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of version 2 of the GNU General Public License as
 + * published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope that it will be useful, but
 + * WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * General Public License for more details.
 + */
 +#ifndef __DAX_PRIVATE_H__
 +#define __DAX_PRIVATE_H__
 +
 +#include <linux/device.h>
 +#include <linux/cdev.h>
 +
 +/**
 + * struct dax_region - mapping infrastructure for dax devices
 + * @id: kernel-wide unique region for a memory range
 + * @base: linear address corresponding to @res
 + * @kref: to pin while other agents have a need to do lookups
 + * @dev: parent device backing this region
 + * @align: allocation and mapping alignment for child dax devices
 + * @res: physical address range of the region
 + * @pfn_flags: identify whether the pfns are paged back or not
 + */
 +struct dax_region {
 +      int id;
 +      struct ida ida;
 +      void *base;
 +      struct kref kref;
 +      struct device *dev;
 +      unsigned int align;
 +      struct resource res;
 +      unsigned long pfn_flags;
 +};
 +
 +/**
-  * @inode - inode
-  * @dev - device backing the character device
-  * @cdev - core chardev data
-  * @alive - !alive + srcu grace period == no new mappings can be established
++ * struct dev_dax - instance data for a subdivision of a dax region
 + * @region - parent region
- struct dax_dev {
++ * @dax_dev - core dax functionality
++ * @dev - device core
 + * @id - child id in the region
 + * @num_resources - number of physical address extents in this device
 + * @res - array of physical address ranges
 + */
-       struct inode *inode;
++struct dev_dax {
 +      struct dax_region *region;
-       struct cdev cdev;
-       bool alive;
++      struct dax_device *dax_dev;
 +      struct device dev;
 +      int id;
 +      int num_resources;
 +      struct resource res[0];
 +};
 +#endif
index 5e8302d3a89cec5641c1179ab34021a0abe67417,a0db055054a45dca61360b710072134f7ea89081..006e657dfcb94489be49a541346ca508ed10a7c7
  #include <linux/dax.h>
  #include <linux/fs.h>
  #include <linux/mm.h>
 +#include "dax-private.h"
  #include "dax.h"
  
- static dev_t dax_devt;
- DEFINE_STATIC_SRCU(dax_srcu);
  static struct class *dax_class;
- static DEFINE_IDA(dax_minor_ida);
- static int nr_dax = CONFIG_NR_DEV_DAX;
- module_param(nr_dax, int, S_IRUGO);
- static struct vfsmount *dax_mnt;
- static struct kmem_cache *dax_cache __read_mostly;
- static struct super_block *dax_superblock __read_mostly;
- MODULE_PARM_DESC(nr_dax, "max number of device-dax instances");
  
 -/**
 - * struct dax_region - mapping infrastructure for dax devices
 - * @id: kernel-wide unique region for a memory range
 - * @base: linear address corresponding to @res
 - * @kref: to pin while other agents have a need to do lookups
 - * @dev: parent device backing this region
 - * @align: allocation and mapping alignment for child dax devices
 - * @res: physical address range of the region
 - * @pfn_flags: identify whether the pfns are paged back or not
 - */
 -struct dax_region {
 -      int id;
 -      struct ida ida;
 -      void *base;
 -      struct kref kref;
 -      struct device *dev;
 -      unsigned int align;
 -      struct resource res;
 -      unsigned long pfn_flags;
 -};
 -
 -/**
 - * struct dev_dax - instance data for a subdivision of a dax region
 - * @region - parent region
 - * @dax_dev - core dax functionality
 - * @dev - device core
 - * @id - child id in the region
 - * @num_resources - number of physical address extents in this device
 - * @res - array of physical address ranges
 +/*
 + * Rely on the fact that drvdata is set before the attributes are
 + * registered, and that the attributes are unregistered before drvdata
 + * is cleared to assume that drvdata is always valid.
   */
 -struct dev_dax {
 -      struct dax_region *region;
 -      struct dax_device *dax_dev;
 -      struct device dev;
 -      int id;
 -      int num_resources;
 -      struct resource res[0];
 -};
 -
  static ssize_t id_show(struct device *dev,
                struct device_attribute *attr, char *buf)
  {
@@@ -340,8 -271,7 +217,8 @@@ static int check_vma(struct dev_dax *de
        return 0;
  }
  
 -static phys_addr_t pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
 +/* see "strong" declaration in tools/testing/nvdimm/dax-dev.c */
- __weak phys_addr_t dax_pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
++__weak phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
                unsigned long size)
  {
        struct resource *res;
@@@ -386,7 -317,7 +264,7 @@@ static int __dev_dax_pte_fault(struct d
        if (fault_size != dax_region->align)
                return VM_FAULT_SIGBUS;
  
-       phys = dax_pgoff_to_phys(dax_dev, vmf->pgoff, PAGE_SIZE);
 -      phys = pgoff_to_phys(dev_dax, vmf->pgoff, PAGE_SIZE);
++      phys = dax_pgoff_to_phys(dev_dax, vmf->pgoff, PAGE_SIZE);
        if (phys == -1) {
                dev_dbg(dev, "%s: pgoff_to_phys(%#lx) failed\n", __func__,
                                vmf->pgoff);
@@@ -441,7 -373,7 +320,7 @@@ static int __dev_dax_pmd_fault(struct d
                return VM_FAULT_SIGBUS;
  
        pgoff = linear_page_index(vmf->vma, pmd_addr);
-       phys = dax_pgoff_to_phys(dax_dev, pgoff, PMD_SIZE);
 -      phys = pgoff_to_phys(dev_dax, pgoff, PMD_SIZE);
++      phys = dax_pgoff_to_phys(dev_dax, pgoff, PMD_SIZE);
        if (phys == -1) {
                dev_dbg(dev, "%s: pgoff_to_phys(%#lx) failed\n", __func__,
                                pgoff);
@@@ -492,7 -425,7 +372,7 @@@ static int __dev_dax_pud_fault(struct d
                return VM_FAULT_SIGBUS;
  
        pgoff = linear_page_index(vmf->vma, pud_addr);
-       phys = dax_pgoff_to_phys(dax_dev, pgoff, PUD_SIZE);
 -      phys = pgoff_to_phys(dev_dax, pgoff, PUD_SIZE);
++      phys = dax_pgoff_to_phys(dev_dax, pgoff, PUD_SIZE);
        if (phys == -1) {
                dev_dbg(dev, "%s: pgoff_to_phys(%#lx) failed\n", __func__,
                                pgoff);
Simple merge
Simple merge
index 6dcb3c4d53be7f4fefcff4e217328d4521a9330f,2033ad03b8cda3eff063bc74c73d14bbafda7c03..d870520da68b9b9bc924ff035a57808890693385
@@@ -48,10 -51,12 +51,13 @@@ nd_blk-y += config_check.
  nd_e820-y := $(NVDIMM_SRC)/e820.o
  nd_e820-y += config_check.o
  
- dax-y := $(DAX_SRC)/dax.o
- dax-y += dax-dev.o
+ dax-y := $(DAX_SRC)/super.o
  dax-y += config_check.o
  
+ device_dax-y := $(DAX_SRC)/device.o
++device_dax-y += dax-dev.o
+ device_dax-y += config_check.o
  dax_pmem-y := $(DAX_SRC)/pmem.o
  dax_pmem-y += config_check.o
  
index e89721d8924c610b8e77ff59555587a347110c31,0000000000000000000000000000000000000000..36ee3d8797c3bcdac889d2fa32d4c2280906f845
mode 100644,000000..100644
--- /dev/null
@@@ -1,49 -1,0 +1,49 @@@
- phys_addr_t dax_pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
 +/*
 + * Copyright (c) 2016, Intel Corporation.
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU General Public License,
 + * version 2, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT
 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 + * more details.
 + */
 +#include "test/nfit_test.h"
 +#include <linux/mm.h>
 +#include "../../../drivers/dax/dax-private.h"
 +
-       for (i = 0; i < dax_dev->num_resources; i++) {
-               res = &dax_dev->res[i];
++phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff,
 +              unsigned long size)
 +{
 +      struct resource *res;
 +      phys_addr_t addr;
 +      int i;
 +
-       if (i < dax_dev->num_resources) {
-               res = &dax_dev->res[i];
++      for (i = 0; i < dev_dax->num_resources; i++) {
++              res = &dev_dax->res[i];
 +              addr = pgoff * PAGE_SIZE + res->start;
 +              if (addr >= res->start && addr <= res->end)
 +                      break;
 +              pgoff -= PHYS_PFN(resource_size(res));
 +      }
 +
-                               if (dax_dev->region->align > PAGE_SIZE)
++      if (i < dev_dax->num_resources) {
++              res = &dev_dax->res[i];
 +              if (addr + size - 1 <= res->end) {
 +                      if (get_nfit_res(addr)) {
 +                              struct page *page;
 +
++                              if (dev_dax->region->align > PAGE_SIZE)
 +                                      return -1;
 +
 +                              page = vmalloc_to_page((void *)addr);
 +                              return PFN_PHYS(page_to_pfn(page));
 +                      } else
 +                              return addr;
 +              }
 +      }
 +
 +      return -1;
 +}