[<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