lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202108010356.p1fp7X3c-lkp@intel.com>
Date:   Sun, 1 Aug 2021 03:59:58 +0800
From:   kernel test robot <lkp@...el.com>
To:     Ben Widawsky <ben.widawsky@...el.com>
Cc:     kbuild-all@...ts.01.org,
        Alison Schofield <alison.schofield@...el.com>,
        Vishal Verma <vishal.l.verma@...el.com>,
        Ira Weiny <ira.weiny@...el.com>,
        Ben Widawsky <ben.widawsky@...el.com>,
        Dan Williams <dan.j.williams@...el.com>,
        linux-kernel@...r.kernel.org
Subject: [cxl-cxl:pending 6/6] drivers/cxl/core/memdev.c:21:29: error:
 implicit declaration of function 'to_cxl_memdev'

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git pending
head:   13a47ea9e8feb1362eaf4601b5b40f7cea9174ff
commit: 13a47ea9e8feb1362eaf4601b5b40f7cea9174ff [6/6] cxl/core: Move memdev management to core
config: um-allmodconfig (attached as .config)
compiler: gcc-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git/commit/?id=13a47ea9e8feb1362eaf4601b5b40f7cea9174ff
        git remote add cxl-cxl https://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl.git
        git fetch --no-tags cxl-cxl pending
        git checkout 13a47ea9e8feb1362eaf4601b5b40f7cea9174ff
        # save the attached .config to linux build tree
        make W=1 ARCH=um 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>

All error/warnings (new ones prefixed by >>):

   drivers/cxl/core/memdev.c: In function 'cxl_memdev_release':
>> drivers/cxl/core/memdev.c:21:29: error: implicit declaration of function 'to_cxl_memdev' [-Werror=implicit-function-declaration]
      21 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
>> drivers/cxl/core/memdev.c:21:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
>> drivers/cxl/core/memdev.c:23:33: error: invalid use of undefined type 'struct cxl_memdev'
      23 |  ida_free(&cxl_memdev_ida, cxlmd->id);
         |                                 ^~
   drivers/cxl/core/memdev.c: In function 'firmware_version_show':
   drivers/cxl/core/memdev.c:36:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
      36 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:37:30: error: invalid use of undefined type 'struct cxl_memdev'
      37 |  struct cxl_mem *cxlm = cxlmd->cxlm;
         |                              ^~
>> drivers/cxl/core/memdev.c:39:40: error: invalid use of undefined type 'struct cxl_mem'
      39 |  return sysfs_emit(buf, "%.16s\n", cxlm->firmware_version);
         |                                        ^~
   drivers/cxl/core/memdev.c: In function 'payload_max_show':
   drivers/cxl/core/memdev.c:46:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
      46 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:47:30: error: invalid use of undefined type 'struct cxl_memdev'
      47 |  struct cxl_mem *cxlm = cxlmd->cxlm;
         |                              ^~
   drivers/cxl/core/memdev.c:49:38: error: invalid use of undefined type 'struct cxl_mem'
      49 |  return sysfs_emit(buf, "%zu\n", cxlm->payload_size);
         |                                      ^~
   drivers/cxl/core/memdev.c: In function 'label_storage_size_show':
   drivers/cxl/core/memdev.c:56:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
      56 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:57:30: error: invalid use of undefined type 'struct cxl_memdev'
      57 |  struct cxl_mem *cxlm = cxlmd->cxlm;
         |                              ^~
   drivers/cxl/core/memdev.c:59:38: error: invalid use of undefined type 'struct cxl_mem'
      59 |  return sysfs_emit(buf, "%zu\n", cxlm->lsa_size);
         |                                      ^~
   drivers/cxl/core/memdev.c: In function 'ram_size_show':
   drivers/cxl/core/memdev.c:66:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
      66 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:67:30: error: invalid use of undefined type 'struct cxl_memdev'
      67 |  struct cxl_mem *cxlm = cxlmd->cxlm;
         |                              ^~
   drivers/cxl/core/memdev.c:68:42: error: invalid use of undefined type 'struct cxl_mem'
      68 |  unsigned long long len = range_len(&cxlm->ram_range);
         |                                          ^~
   drivers/cxl/core/memdev.c: In function 'pmem_size_show':
   drivers/cxl/core/memdev.c:79:29: warning: initialization of 'struct cxl_memdev *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
      79 |  struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
         |                             ^~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:80:30: error: invalid use of undefined type 'struct cxl_memdev'
      80 |  struct cxl_mem *cxlm = cxlmd->cxlm;
         |                              ^~
   drivers/cxl/core/memdev.c:81:42: error: invalid use of undefined type 'struct cxl_mem'
      81 |  unsigned long long len = range_len(&cxlm->pmem_range);
         |                                          ^~
   drivers/cxl/core/memdev.c: In function 'cxl_memdev_unregister':
   drivers/cxl/core/memdev.c:137:29: error: invalid use of undefined type 'struct cxl_memdev'
     137 |  struct device *dev = &cxlmd->dev;
         |                             ^~
   drivers/cxl/core/memdev.c:138:28: error: invalid use of undefined type 'struct cxl_memdev'
     138 |  struct cdev *cdev = &cxlmd->cdev;
         |                            ^~
   In file included from include/linux/list.h:9,
                    from include/linux/rculist.h:10,
                    from include/linux/pid.h:5,
                    from include/linux/sched.h:14,
                    from include/linux/ratelimit.h:6,
                    from include/linux/dev_printk.h:16,
                    from include/linux/device.h:15,
                    from drivers/cxl/core/memdev.c:4:
>> drivers/cxl/core/memdev.c:141:32: error: invalid use of undefined type 'struct cdev'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |                                ^~
   include/linux/kernel.h:494:26: note: in definition of macro 'container_of'
     494 |  void *__mptr = (void *)(ptr);     \
         |                          ^~~
   In file included from <command-line>:
>> drivers/cxl/core/memdev.c:141:32: error: invalid use of undefined type 'struct cdev'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |                                ^~
   include/linux/compiler_types.h:308:9: note: in definition of macro '__compiletime_assert'
     308 |   if (!(condition))     \
         |         ^~~~~~~~~
   include/linux/compiler_types.h:328:2: note: in expansion of macro '_compiletime_assert'
     328 |  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
         |  ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
      39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
         |                                     ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:495:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |  ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:495:20: note: in expansion of macro '__same_type'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |                    ^~~~~~~~~~~
   drivers/cxl/core/memdev.c:141:15: note: in expansion of macro 'container_of'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |               ^~~~~~~~~~~~
>> include/linux/kernel.h:495:51: error: invalid use of undefined type 'const struct cdevm_file_operations'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |                                                   ^~
   include/linux/compiler_types.h:308:9: note: in definition of macro '__compiletime_assert'
     308 |   if (!(condition))     \
         |         ^~~~~~~~~
   include/linux/compiler_types.h:328:2: note: in expansion of macro '_compiletime_assert'
     328 |  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
         |  ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
      39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
         |                                     ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:495:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |  ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:495:20: note: in expansion of macro '__same_type'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |                    ^~~~~~~~~~~
   drivers/cxl/core/memdev.c:141:15: note: in expansion of macro 'container_of'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |               ^~~~~~~~~~~~
>> drivers/cxl/core/memdev.c:141:32: error: invalid use of undefined type 'struct cdev'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |                                ^~
   include/linux/compiler_types.h:308:9: note: in definition of macro '__compiletime_assert'
     308 |   if (!(condition))     \
         |         ^~~~~~~~~
   include/linux/compiler_types.h:328:2: note: in expansion of macro '_compiletime_assert'
     328 |  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
         |  ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
      39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
         |                                     ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:495:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     495 |  BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
         |  ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:496:6: note: in expansion of macro '__same_type'
     496 |     !__same_type(*(ptr), void),   \
         |      ^~~~~~~~~~~
   drivers/cxl/core/memdev.c:141:15: note: in expansion of macro 'container_of'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |               ^~~~~~~~~~~~
>> include/linux/compiler_types.h:140:35: error: invalid use of undefined type 'const struct cdevm_file_operations'
     140 | #define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
         |                                   ^~~~~~~~~~~~~~~~~~
   include/linux/stddef.h:17:32: note: in expansion of macro '__compiler_offsetof'
      17 | #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
         |                                ^~~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:498:21: note: in expansion of macro 'offsetof'
     498 |  ((type *)(__mptr - offsetof(type, member))); })
         |                     ^~~~~~~~
   drivers/cxl/core/memdev.c:141:15: note: in expansion of macro 'container_of'
     141 |  cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
         |               ^~~~~~~~~~~~
>> drivers/cxl/core/memdev.c:142:12: error: invalid use of undefined type 'const struct cdevm_file_operations'
     142 |  cdevm_fops->shutdown(dev);
         |            ^~
>> drivers/cxl/core/memdev.c:144:2: error: implicit declaration of function 'cdev_device_del'; did you mean 'device_del'? [-Werror=implicit-function-declaration]
     144 |  cdev_device_del(&cxlmd->cdev, dev);
         |  ^~~~~~~~~~~~~~~
         |  device_del
   drivers/cxl/core/memdev.c:144:24: error: invalid use of undefined type 'struct cxl_memdev'
     144 |  cdev_device_del(&cxlmd->cdev, dev);
         |                        ^~
   drivers/cxl/core/memdev.c: At top level:
>> drivers/cxl/core/memdev.c:148:51: warning: 'struct cxl_mem' declared inside parameter list will not be visible outside of this definition or declaration
     148 | static struct cxl_memdev *cxl_memdev_alloc(struct cxl_mem *cxlm,
         |                                                   ^~~~~~~
   drivers/cxl/core/memdev.c: In function 'cxl_memdev_alloc':
   drivers/cxl/core/memdev.c:151:29: error: invalid use of undefined type 'struct cxl_mem'
     151 |  struct pci_dev *pdev = cxlm->pdev;
         |                             ^~
>> drivers/cxl/core/memdev.c:157:24: error: invalid application of 'sizeof' to incomplete type 'struct cxl_memdev'
     157 |  cxlmd = kzalloc(sizeof(*cxlmd), GFP_KERNEL);
         |                        ^
   drivers/cxl/core/memdev.c:164:7: error: invalid use of undefined type 'struct cxl_memdev'
     164 |  cxlmd->id = rc;
         |       ^~
   drivers/cxl/core/memdev.c:166:14: error: invalid use of undefined type 'struct cxl_memdev'
     166 |  dev = &cxlmd->dev;
         |              ^~
>> drivers/cxl/core/memdev.c:169:14: error: 'cxl_bus_type' undeclared (first use in this function); did you mean 'pci_bus_type'?
     169 |  dev->bus = &cxl_bus_type;
         |              ^~~~~~~~~~~~
         |              pci_bus_type
   drivers/cxl/core/memdev.c:169:14: note: each undeclared identifier is reported only once for each function it appears in
   In file included from include/linux/fs.h:7,
                    from include/linux/huge_mm.h:8,
                    from include/linux/mm.h:728,
                    from include/linux/scatterlist.h:8,
                    from include/linux/dmapool.h:14,
                    from include/linux/pci.h:1466,
                    from drivers/cxl/core/memdev.c:7:
   drivers/cxl/core/memdev.c:170:40: error: invalid use of undefined type 'struct cxl_memdev'
     170 |  dev->devt = MKDEV(cxl_mem_major, cxlmd->id);
         |                                        ^~
   include/linux/kdev_t.h:12:46: note: in definition of macro 'MKDEV'
      12 | #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
         |                                              ^~
   drivers/cxl/core/memdev.c:174:15: error: invalid use of undefined type 'struct cxl_memdev'
     174 |  cdev = &cxlmd->cdev;
         |               ^~
>> drivers/cxl/core/memdev.c:175:2: error: implicit declaration of function 'cdev_init'; did you mean 'cred_init'? [-Werror=implicit-function-declaration]
     175 |  cdev_init(cdev, fops);
         |  ^~~~~~~~~
         |  cred_init
   drivers/cxl/core/memdev.c: At top level:
>> drivers/cxl/core/memdev.c:185:20: warning: 'struct cdevm_file_operations' declared inside parameter list will not be visible outside of this definition or declaration
     185 |       const struct cdevm_file_operations *cdevm_fops)
         |                    ^~~~~~~~~~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:184:49: warning: 'struct cxl_mem' declared inside parameter list will not be visible outside of this definition or declaration
     184 | devm_cxl_add_memdev(struct device *host, struct cxl_mem *cxlm,
         |                                                 ^~~~~~~
>> drivers/cxl/core/memdev.c:184:1: warning: no previous prototype for 'devm_cxl_add_memdev' [-Wmissing-prototypes]
     184 | devm_cxl_add_memdev(struct device *host, struct cxl_mem *cxlm,
         | ^~~~~~~~~~~~~~~~~~~
   drivers/cxl/core/memdev.c: In function 'devm_cxl_add_memdev':
   drivers/cxl/core/memdev.c:192:44: error: invalid use of undefined type 'const struct cdevm_file_operations'
     192 |  cxlmd = cxl_memdev_alloc(cxlm, &cdevm_fops->fops);
         |                                            ^~
>> drivers/cxl/core/memdev.c:192:27: error: passing argument 1 of 'cxl_memdev_alloc' from incompatible pointer type [-Werror=incompatible-pointer-types]
     192 |  cxlmd = cxl_memdev_alloc(cxlm, &cdevm_fops->fops);
         |                           ^~~~
         |                           |
         |                           struct cxl_mem *
   drivers/cxl/core/memdev.c:148:60: note: expected 'struct cxl_mem *' but argument is of type 'struct cxl_mem *'
     148 | static struct cxl_memdev *cxl_memdev_alloc(struct cxl_mem *cxlm,
         |                                            ~~~~~~~~~~~~~~~~^~~~
   drivers/cxl/core/memdev.c:196:14: error: invalid use of undefined type 'struct cxl_memdev'
     196 |  dev = &cxlmd->dev;
         |              ^~
   drivers/cxl/core/memdev.c:197:39: error: invalid use of undefined type 'struct cxl_memdev'
     197 |  rc = dev_set_name(dev, "mem%d", cxlmd->id);
         |                                       ^~
   drivers/cxl/core/memdev.c:205:7: error: invalid use of undefined type 'struct cxl_memdev'
     205 |  cxlmd->cxlm = cxlm;
         |       ^~
   drivers/cxl/core/memdev.c:207:15: error: invalid use of undefined type 'struct cxl_memdev'
     207 |  cdev = &cxlmd->cdev;
         |               ^~
>> drivers/cxl/core/memdev.c:208:7: error: implicit declaration of function 'cdev_device_add'; did you mean 'pci_device_add'? [-Werror=implicit-function-declaration]
     208 |  rc = cdev_device_add(cdev, dev);
         |       ^~~~~~~~~~~~~~~
         |       pci_device_add
   drivers/cxl/core/memdev.c:222:12: error: invalid use of undefined type 'const struct cdevm_file_operations'
     222 |  cdevm_fops->shutdown(dev);
         |            ^~
   drivers/cxl/core/memdev.c: At top level:
>> drivers/cxl/core/memdev.c:228:12: warning: no previous prototype for 'cxl_memdev_init' [-Wmissing-prototypes]
     228 | __init int cxl_memdev_init(void)
         |            ^~~~~~~~~~~~~~~
   drivers/cxl/core/memdev.c:242:6: warning: no previous prototype for 'cxl_memdev_exit' [-Wmissing-prototypes]
     242 | void cxl_memdev_exit(void)
         |      ^~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/to_cxl_memdev +21 drivers/cxl/core/memdev.c

     3	
   > 4	#include <linux/device.h>
     5	#include <linux/slab.h>
     6	#include <linux/idr.h>
     7	#include <linux/pci.h>
     8	#include <mem.h>
     9	
    10	/*
    11	 * An entire PCI topology full of devices should be enough for any
    12	 * config
    13	 */
    14	#define CXL_MEM_MAX_DEVS 65536
    15	
    16	static int cxl_mem_major;
    17	static DEFINE_IDA(cxl_memdev_ida);
    18	
    19	static void cxl_memdev_release(struct device *dev)
    20	{
  > 21		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    22	
  > 23		ida_free(&cxl_memdev_ida, cxlmd->id);
    24		kfree(cxlmd);
    25	}
    26	
    27	static char *cxl_memdev_devnode(struct device *dev, umode_t *mode, kuid_t *uid,
    28					kgid_t *gid)
    29	{
    30		return kasprintf(GFP_KERNEL, "cxl/%s", dev_name(dev));
    31	}
    32	
    33	static ssize_t firmware_version_show(struct device *dev,
    34					     struct device_attribute *attr, char *buf)
    35	{
  > 36		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    37		struct cxl_mem *cxlm = cxlmd->cxlm;
    38	
  > 39		return sysfs_emit(buf, "%.16s\n", cxlm->firmware_version);
    40	}
    41	static DEVICE_ATTR_RO(firmware_version);
    42	
    43	static ssize_t payload_max_show(struct device *dev,
    44					struct device_attribute *attr, char *buf)
    45	{
    46		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    47		struct cxl_mem *cxlm = cxlmd->cxlm;
    48	
    49		return sysfs_emit(buf, "%zu\n", cxlm->payload_size);
    50	}
    51	static DEVICE_ATTR_RO(payload_max);
    52	
    53	static ssize_t label_storage_size_show(struct device *dev,
    54					       struct device_attribute *attr, char *buf)
    55	{
    56		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    57		struct cxl_mem *cxlm = cxlmd->cxlm;
    58	
    59		return sysfs_emit(buf, "%zu\n", cxlm->lsa_size);
    60	}
    61	static DEVICE_ATTR_RO(label_storage_size);
    62	
    63	static ssize_t ram_size_show(struct device *dev, struct device_attribute *attr,
    64				     char *buf)
    65	{
    66		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    67		struct cxl_mem *cxlm = cxlmd->cxlm;
    68		unsigned long long len = range_len(&cxlm->ram_range);
    69	
    70		return sysfs_emit(buf, "%#llx\n", len);
    71	}
    72	
    73	static struct device_attribute dev_attr_ram_size =
    74		__ATTR(size, 0444, ram_size_show, NULL);
    75	
    76	static ssize_t pmem_size_show(struct device *dev, struct device_attribute *attr,
    77				      char *buf)
    78	{
    79		struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
    80		struct cxl_mem *cxlm = cxlmd->cxlm;
    81		unsigned long long len = range_len(&cxlm->pmem_range);
    82	
    83		return sysfs_emit(buf, "%#llx\n", len);
    84	}
    85	
    86	static struct device_attribute dev_attr_pmem_size =
    87		__ATTR(size, 0444, pmem_size_show, NULL);
    88	
    89	static struct attribute *cxl_memdev_attributes[] = {
    90		&dev_attr_firmware_version.attr,
    91		&dev_attr_payload_max.attr,
    92		&dev_attr_label_storage_size.attr,
    93		NULL,
    94	};
    95	
    96	static struct attribute *cxl_memdev_pmem_attributes[] = {
    97		&dev_attr_pmem_size.attr,
    98		NULL,
    99	};
   100	
   101	static struct attribute *cxl_memdev_ram_attributes[] = {
   102		&dev_attr_ram_size.attr,
   103		NULL,
   104	};
   105	
   106	static struct attribute_group cxl_memdev_attribute_group = {
   107		.attrs = cxl_memdev_attributes,
   108	};
   109	
   110	static struct attribute_group cxl_memdev_ram_attribute_group = {
   111		.name = "ram",
   112		.attrs = cxl_memdev_ram_attributes,
   113	};
   114	
   115	static struct attribute_group cxl_memdev_pmem_attribute_group = {
   116		.name = "pmem",
   117		.attrs = cxl_memdev_pmem_attributes,
   118	};
   119	
   120	static const struct attribute_group *cxl_memdev_attribute_groups[] = {
   121		&cxl_memdev_attribute_group,
   122		&cxl_memdev_ram_attribute_group,
   123		&cxl_memdev_pmem_attribute_group,
   124		NULL,
   125	};
   126	
   127	static const struct device_type cxl_memdev_type = {
   128		.name = "cxl_memdev",
   129		.release = cxl_memdev_release,
   130		.devnode = cxl_memdev_devnode,
   131		.groups = cxl_memdev_attribute_groups,
   132	};
   133	
   134	static void cxl_memdev_unregister(void *_cxlmd)
   135	{
   136		struct cxl_memdev *cxlmd = _cxlmd;
   137		struct device *dev = &cxlmd->dev;
   138		struct cdev *cdev = &cxlmd->cdev;
   139		const struct cdevm_file_operations *cdevm_fops;
   140	
 > 141		cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
 > 142		cdevm_fops->shutdown(dev);
   143	
 > 144		cdev_device_del(&cxlmd->cdev, dev);
   145		put_device(dev);
   146	}
   147	
 > 148	static struct cxl_memdev *cxl_memdev_alloc(struct cxl_mem *cxlm,
   149						   const struct file_operations *fops)
   150	{
   151		struct pci_dev *pdev = cxlm->pdev;
   152		struct cxl_memdev *cxlmd;
   153		struct device *dev;
   154		struct cdev *cdev;
   155		int rc;
   156	
 > 157		cxlmd = kzalloc(sizeof(*cxlmd), GFP_KERNEL);
   158		if (!cxlmd)
   159			return ERR_PTR(-ENOMEM);
   160	
   161		rc = ida_alloc_range(&cxl_memdev_ida, 0, CXL_MEM_MAX_DEVS, GFP_KERNEL);
   162		if (rc < 0)
   163			goto err;
   164		cxlmd->id = rc;
   165	
   166		dev = &cxlmd->dev;
   167		device_initialize(dev);
   168		dev->parent = &pdev->dev;
 > 169		dev->bus = &cxl_bus_type;
 > 170		dev->devt = MKDEV(cxl_mem_major, cxlmd->id);
   171		dev->type = &cxl_memdev_type;
   172		device_set_pm_not_required(dev);
   173	
 > 174		cdev = &cxlmd->cdev;
 > 175		cdev_init(cdev, fops);
   176		return cxlmd;
   177	
   178	err:
   179		kfree(cxlmd);
   180		return ERR_PTR(rc);
   181	}
   182	
   183	struct cxl_memdev *
 > 184	devm_cxl_add_memdev(struct device *host, struct cxl_mem *cxlm,
 > 185			    const struct cdevm_file_operations *cdevm_fops)
   186	{
   187		struct cxl_memdev *cxlmd;
   188		struct device *dev;
   189		struct cdev *cdev;
   190		int rc;
   191	
 > 192		cxlmd = cxl_memdev_alloc(cxlm, &cdevm_fops->fops);
   193		if (IS_ERR(cxlmd))
   194			return cxlmd;
   195	
   196		dev = &cxlmd->dev;
 > 197		rc = dev_set_name(dev, "mem%d", cxlmd->id);
   198		if (rc)
   199			goto err;
   200	
   201		/*
   202		 * Activate ioctl operations, no cxl_memdev_rwsem manipulation
   203		 * needed as this is ordered with cdev_add() publishing the device.
   204		 */
   205		cxlmd->cxlm = cxlm;
   206	
   207		cdev = &cxlmd->cdev;
 > 208		rc = cdev_device_add(cdev, dev);
   209		if (rc)
   210			goto err;
   211	
   212		rc = devm_add_action_or_reset(host, cxl_memdev_unregister, cxlmd);
   213		if (rc)
   214			return ERR_PTR(rc);
   215		return cxlmd;
   216	
   217	err:
   218		/*
   219		 * The cdev was briefly live, shutdown any ioctl operations that
   220		 * saw that state.
   221		 */
   222		cdevm_fops->shutdown(dev);
   223		put_device(dev);
   224		return ERR_PTR(rc);
   225	}
   226	EXPORT_SYMBOL_GPL(devm_cxl_add_memdev);
   227	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

Download attachment ".config.gz" of type "application/gzip" (62334 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ