Merge branch 'for-5.7/libnvdimm' into libnvdimm-for-next
authorDan Williams <dan.j.williams@intel.com>
Fri, 3 Apr 2020 02:55:17 +0000 (19:55 -0700)
committerDan Williams <dan.j.williams@intel.com>
Fri, 3 Apr 2020 02:55:17 +0000 (19:55 -0700)
- Introduce 'zero_page_range' as a dax operation. This facilitates
  filesystem-dax operation without a block-device.

- Advertise a persistence-domain for of_pmem and papr_scm. The
  persistence domain indicates where cpu-store cycles need to reach in
  the platform-memory subsystem before the platform will consider them
  power-fail protected.

- Fixup some flexible-array declarations.

1  2 
arch/powerpc/platforms/pseries/papr_scm.c
drivers/acpi/nfit/nfit.h
drivers/nvdimm/nd.h

@@@ -285,6 -285,25 +285,6 @@@ int papr_scm_ndctl(struct nvdimm_bus_de
        return 0;
  }
  
 -static inline int papr_scm_node(int node)
 -{
 -      int min_dist = INT_MAX, dist;
 -      int nid, min_node;
 -
 -      if ((node == NUMA_NO_NODE) || node_online(node))
 -              return node;
 -
 -      min_node = first_online_node;
 -      for_each_online_node(nid) {
 -              dist = node_distance(node, nid);
 -              if (dist < min_dist) {
 -                      min_dist = dist;
 -                      min_node = nid;
 -              }
 -      }
 -      return min_node;
 -}
 -
  static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
  {
        struct device *dev = &p->pdev->dev;
        }
  
        dimm_flags = 0;
 -      set_bit(NDD_ALIASING, &dimm_flags);
 +      set_bit(NDD_LABELING, &dimm_flags);
  
        p->nvdimm = nvdimm_create(p->bus, p, NULL, dimm_flags,
                                  PAPR_SCM_DIMM_CMD_MASK, 0, NULL);
  
        memset(&ndr_desc, 0, sizeof(ndr_desc));
        target_nid = dev_to_node(&p->pdev->dev);
 -      online_nid = papr_scm_node(target_nid);
 +      online_nid = numa_map_to_online_node(target_nid);
        ndr_desc.numa_node = online_nid;
        ndr_desc.target_node = target_nid;
        ndr_desc.res = &p->res;
  
        if (p->is_volatile)
                p->region = nvdimm_volatile_region_create(p->bus, &ndr_desc);
-       else
+       else {
+               set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc.flags);
                p->region = nvdimm_pmem_region_create(p->bus, &ndr_desc);
+       }
        if (!p->region) {
                dev_err(dev, "Error registering region %pR from %pOF\n",
                                ndr_desc.res, p->dn);
diff --combined drivers/acpi/nfit/nfit.h
@@@ -34,7 -34,6 +34,7 @@@
                | ACPI_NFIT_MEM_NOT_ARMED | ACPI_NFIT_MEM_MAP_FAILED)
  
  #define NVDIMM_FAMILY_MAX NVDIMM_FAMILY_HYPERV
 +#define NVDIMM_CMD_MAX 31
  
  #define NVDIMM_STANDARD_CMDMASK \
  (1 << ND_CMD_SMART | 1 << ND_CMD_SMART_THRESHOLD | 1 << ND_CMD_DIMM_FLAGS \
@@@ -145,32 -144,32 +145,32 @@@ struct nfit_spa 
        unsigned long ars_state;
        u32 clear_err_unit;
        u32 max_ars;
-       struct acpi_nfit_system_address spa[0];
+       struct acpi_nfit_system_address spa[];
  };
  
  struct nfit_dcr {
        struct list_head list;
-       struct acpi_nfit_control_region dcr[0];
+       struct acpi_nfit_control_region dcr[];
  };
  
  struct nfit_bdw {
        struct list_head list;
-       struct acpi_nfit_data_region bdw[0];
+       struct acpi_nfit_data_region bdw[];
  };
  
  struct nfit_idt {
        struct list_head list;
-       struct acpi_nfit_interleave idt[0];
+       struct acpi_nfit_interleave idt[];
  };
  
  struct nfit_flush {
        struct list_head list;
-       struct acpi_nfit_flush_address flush[0];
+       struct acpi_nfit_flush_address flush[];
  };
  
  struct nfit_memdev {
        struct list_head list;
-       struct acpi_nfit_memory_map memdev[0];
+       struct acpi_nfit_memory_map memdev[];
  };
  
  enum nfit_mem_flags {
diff --combined drivers/nvdimm/nd.h
@@@ -39,7 -39,7 +39,7 @@@ struct nd_region_data 
        int ns_count;
        int ns_active;
        unsigned int hints_shift;
-       void __iomem *flush_wpq[0];
+       void __iomem *flush_wpq[];
  };
  
  static inline void __iomem *ndrd_get_flush_wpq(struct nd_region_data *ndrd,
@@@ -146,7 -146,6 +146,7 @@@ struct nd_region 
        struct device *btt_seed;
        struct device *pfn_seed;
        struct device *dax_seed;
 +      unsigned long align;
        u16 ndr_mappings;
        u64 ndr_size;
        u64 ndr_start;
        struct nd_interleave_set *nd_set;
        struct nd_percpu_lane __percpu *lane;
        int (*flush)(struct nd_region *nd_region, struct bio *bio);
-       struct nd_mapping mapping[0];
+       struct nd_mapping mapping[];
  };
  
  struct nd_blk_region {
@@@ -253,7 -252,7 +253,7 @@@ int nvdimm_set_config_data(struct nvdim
                void *buf, size_t len);
  long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
                unsigned int len);
 -void nvdimm_set_aliasing(struct device *dev);
 +void nvdimm_set_labeling(struct device *dev);
  void nvdimm_set_locked(struct device *dev);
  void nvdimm_clear_locked(struct device *dev);
  int nvdimm_security_setup_events(struct device *dev);