Re: [PATCH v1 4/4] mhi_bus: dev: uci: add user space interface driver
From: kbuild test robot
Date: Fri Apr 27 2018 - 21:05:10 EST
Hi Sujeev,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on v4.17-rc2 next-20180426]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Sujeev-Dias/mhi_bus-core-Add-support-for-MHI-host-interface/20180428-065959
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
In file included from drivers/bus/mhi/devices/mhi_uci.c:26:0:
include/linux/mhi.h:658:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int'
static inlint int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl)
^~~
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_queue_inbound':
>> include/linux/kern_levels.h:5:18: warning: format '%ld' expects argument of type 'long int', but argument 5 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:114:3: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:114:43: note: format string is defined here
MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu);
~~^
%d
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_write':
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:243:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Enter: to xfer:%lu bytes\n", count);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:243:29: note: format string is defined here
MSG_VERB("Enter: to xfer:%lu bytes\n", count);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:89:4: note: in expansion of macro 'pr_err'
pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:266:4: note: in expansion of macro 'MSG_ERR'
MSG_ERR("Failed to allocate memory %lu\n", xfer_size);
^~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:266:41: note: format string is defined here
MSG_ERR("Failed to allocate memory %lu\n", xfer_size);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:295:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:295:44: note: format string is defined here
MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_read':
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:321:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Client provided buf len:%lu\n", count);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:321:38: note: format string is defined here
MSG_VERB("Client provided buf len:%lu\n", count);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:376:21: note: format string is defined here
MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:376:28: note: format string is defined here
MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size);
~~^
%u
In file included from include/linux/printk.h:7:0,
from include/linux/kernel.h:14,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/cdev.h:5,
from drivers/bus/mhi/devices/mhi_uci.c:13:
include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=]
#define KERN_SOH "\001" /* ASCII Start Of Header */
^
include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
^~~~~~~~
include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR'
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
^~~~~~~~
>> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err'
pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
^~~~~~
drivers/bus/mhi/devices/mhi_uci.c:400:2: note: in expansion of macro 'MSG_VERB'
MSG_VERB("Returning %lu bytes\n", to_copy);
^~~~~~~~
drivers/bus/mhi/devices/mhi_uci.c:400:24: note: format string is defined here
MSG_VERB("Returning %lu bytes\n", to_copy);
~~^
%u
vim +/pr_err +73 drivers/bus/mhi/devices/mhi_uci.c
70
71 #define MSG_VERB(fmt, ...) do { \
72 if (msg_lvl <= MHI_MSG_LVL_VERBOSE) \
> 73 pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \
74 } while (0)
75
76 #else
77
78 #define MSG_VERB(fmt, ...)
79
80 #endif
81
82 #define MSG_LOG(fmt, ...) do { \
83 if (msg_lvl <= MHI_MSG_LVL_INFO) \
84 pr_err("[I][%s] " fmt, __func__, ##__VA_ARGS__); \
85 } while (0)
86
87 #define MSG_ERR(fmt, ...) do { \
88 if (msg_lvl <= MHI_MSG_LVL_ERROR) \
> 89 pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \
90 } while (0)
91
92 #define MAX_UCI_DEVICES (64)
93
94 static DECLARE_BITMAP(uci_minors, MAX_UCI_DEVICES);
95 static struct mhi_uci_drv mhi_uci_drv;
96
97 static int mhi_queue_inbound(struct uci_dev *uci_dev)
98 {
99 struct mhi_device *mhi_dev = uci_dev->mhi_dev;
100 int nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);
101 size_t mtu = uci_dev->mtu;
102 void *buf;
103 struct uci_buf *uci_buf;
104 int ret = -EIO, i;
105
106 for (i = 0; i < nr_trbs; i++) {
107 buf = kmalloc(mtu + sizeof(*uci_buf), GFP_KERNEL);
108 if (!buf)
109 return -ENOMEM;
110
111 uci_buf = buf + mtu;
112 uci_buf->data = buf;
113
> 114 MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu);
115
116 ret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu,
117 MHI_EOT);
118 if (ret) {
119 kfree(buf);
120 MSG_ERR("Failed to queue buffer %d\n", i);
121 return ret;
122 }
123 }
124
125 return ret;
126 }
127
128 static long mhi_uci_ioctl(struct file *file,
129 unsigned int cmd,
130 unsigned long arg)
131 {
132 struct uci_dev *uci_dev = file->private_data;
133 struct mhi_device *mhi_dev = uci_dev->mhi_dev;
134 long ret = -ERESTARTSYS;
135
136 mutex_lock(&uci_dev->mutex);
137 if (uci_dev->enabled)
138 ret = mhi_ioctl(mhi_dev, cmd, arg);
139 mutex_unlock(&uci_dev->mutex);
140
141 return ret;
142 }
143
144 static int mhi_uci_release(struct inode *inode, struct file *file)
145 {
146 struct uci_dev *uci_dev = file->private_data;
147
148 mutex_lock(&uci_dev->mutex);
149 uci_dev->ref_count--;
150 if (!uci_dev->ref_count) {
151 struct uci_buf *itr, *tmp;
152 struct uci_chan *uci_chan;
153
154 MSG_LOG("Last client left, closing node\n");
155
156 if (uci_dev->enabled)
157 mhi_unprepare_from_transfer(uci_dev->mhi_dev);
158
159 /* clean inbound channel */
160 uci_chan = &uci_dev->dl_chan;
161 list_for_each_entry_safe(itr, tmp, &uci_chan->pending, node) {
162 list_del(&itr->node);
163 kfree(itr->data);
164 }
165 if (uci_chan->cur_buf)
166 kfree(uci_chan->cur_buf->data);
167
168 uci_chan->cur_buf = NULL;
169
170 if (!uci_dev->enabled) {
171 MSG_LOG("Node is deleted, freeing dev node\n");
172 mutex_unlock(&uci_dev->mutex);
173 mutex_destroy(&uci_dev->mutex);
174 clear_bit(MINOR(uci_dev->devt), uci_minors);
175 kfree(uci_dev);
176 return 0;
177 }
178 }
179
180 mutex_unlock(&uci_dev->mutex);
181
182 MSG_LOG("exit: ref_count:%d\n", uci_dev->ref_count);
183
184 return 0;
185 }
186
187 static unsigned int mhi_uci_poll(struct file *file, poll_table *wait)
188 {
189 struct uci_dev *uci_dev = file->private_data;
190 struct mhi_device *mhi_dev = uci_dev->mhi_dev;
191 struct uci_chan *uci_chan;
192 unsigned int mask = 0;
193
194 poll_wait(file, &uci_dev->dl_chan.wq, wait);
195 poll_wait(file, &uci_dev->ul_chan.wq, wait);
196
197 uci_chan = &uci_dev->dl_chan;
198 spin_lock_bh(&uci_chan->lock);
199 if (!uci_dev->enabled) {
200 mask = POLLERR;
201 } else if (!list_empty(&uci_chan->pending) || uci_chan->cur_buf) {
202 MSG_VERB("Client can read from node\n");
203 mask |= POLLIN | POLLRDNORM;
204 }
205 spin_unlock_bh(&uci_chan->lock);
206
207 uci_chan = &uci_dev->ul_chan;
208 spin_lock_bh(&uci_chan->lock);
209 if (!uci_dev->enabled) {
210 mask |= POLLERR;
211 } else if (mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 0) {
212 MSG_VERB("Client can write to node\n");
213 mask |= POLLOUT | POLLWRNORM;
214 }
215 spin_unlock_bh(&uci_chan->lock);
216
217 MSG_LOG("Client attempted to poll, returning mask 0x%x\n", mask);
218
219 return mask;
220 }
221
222 static ssize_t mhi_uci_write(struct file *file,
223 const char __user *buf,
224 size_t count,
225 loff_t *offp)
226 {
227 struct uci_dev *uci_dev = file->private_data;
228 struct mhi_device *mhi_dev = uci_dev->mhi_dev;
229 struct uci_chan *uci_chan = &uci_dev->ul_chan;
230 size_t bytes_xfered = 0;
231 int ret;
232
233 if (!buf || !count)
234 return -EINVAL;
235
236 /* confirm channel is active */
237 spin_lock_bh(&uci_chan->lock);
238 if (!uci_dev->enabled) {
239 spin_unlock_bh(&uci_chan->lock);
240 return -ERESTARTSYS;
241 }
242
243 MSG_VERB("Enter: to xfer:%lu bytes\n", count);
244
245 while (count) {
246 size_t xfer_size;
247 void *kbuf;
248 enum MHI_FLAGS flags;
249
250 spin_unlock_bh(&uci_chan->lock);
251
252 /* wait for free descriptors */
253 ret = wait_event_interruptible(uci_chan->wq,
254 (!uci_dev->enabled) ||
255 mhi_get_no_free_descriptors
256 (mhi_dev, DMA_TO_DEVICE) > 0);
257
258 if (ret == -ERESTARTSYS) {
259 MSG_LOG("Exit signal caught for node\n");
260 return -ERESTARTSYS;
261 }
262
263 xfer_size = min_t(size_t, count, uci_dev->mtu);
264 kbuf = kmalloc(xfer_size, GFP_KERNEL);
265 if (!kbuf) {
> 266 MSG_ERR("Failed to allocate memory %lu\n", xfer_size);
267 return -ENOMEM;
268 }
269
270 ret = copy_from_user(kbuf, buf, xfer_size);
271 if (unlikely(ret)) {
272 kfree(kbuf);
273 return ret;
274 }
275
276 spin_lock_bh(&uci_chan->lock);
277 flags = (count - xfer_size) ? MHI_EOB : MHI_EOT;
278 if (uci_dev->enabled)
279 ret = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, kbuf,
280 xfer_size, flags);
281 else
282 ret = -ERESTARTSYS;
283
284 if (ret) {
285 kfree(kbuf);
286 goto sys_interrupt;
287 }
288
289 bytes_xfered += xfer_size;
290 count -= xfer_size;
291 buf += xfer_size;
292 }
293
294 spin_unlock_bh(&uci_chan->lock);
295 MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered);
296
297 return bytes_xfered;
298
299 sys_interrupt:
300 spin_unlock_bh(&uci_chan->lock);
301
302 return ret;
303 }
304
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip