Re: [PATCH 1/2] mm: dmapool: Align to ARCH_DMA_MINALIGN in non-coherent DMA mode
From: kbuild test robot
Date: Sat Sep 09 2017 - 12:29:37 EST
Hi Huacai,
[auto build test WARNING on mmotm/master]
[also build test WARNING on v4.13 next-20170908]
[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/Huacai-Chen/mm-dmapool-Align-to-ARCH_DMA_MINALIGN-in-non-coherent-DMA-mode/20170909-230504
base: git://git.cmpxchg.org/linux-mmotm.git master
config: i386-randconfig-x000-201736 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
In file included from include/linux/ioport.h:12:0,
from include/linux/device.h:16,
from mm/dmapool.c:25:
mm/dmapool.c: In function 'dma_pool_create':
mm/dmapool.c:143:7: error: implicit declaration of function 'plat_device_is_coherent' [-Werror=implicit-function-declaration]
if (!plat_device_is_coherent(dev))
^
include/linux/compiler.h:156:30: note: in definition of macro '__trace_if'
if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
^~~~
>> mm/dmapool.c:143:2: note: in expansion of macro 'if'
if (!plat_device_is_coherent(dev))
^~
mm/dmapool.c: At top level:
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memcpy_and_pad' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:451:2: note: in expansion of macro 'if'
if (dest_len > count) {
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memcpy_and_pad' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:449:2: note: in expansion of macro 'if'
if (dest_size < dest_len)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memcpy_and_pad' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:446:8: note: in expansion of macro 'if'
else if (src_size < dest_len && src_size < count)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memcpy_and_pad' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:444:3: note: in expansion of macro 'if'
if (dest_size < dest_len && dest_size < count)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memcpy_and_pad' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:443:2: note: in expansion of macro 'if'
if (__builtin_constant_p(dest_len) && __builtin_constant_p(count)) {
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'strcpy' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:421:2: note: in expansion of macro 'if'
if (p_size == (size_t)-1 && q_size == (size_t)-1)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'kmemdup' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:411:2: note: in expansion of macro 'if'
if (p_size < size)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'kmemdup' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:409:2: note: in expansion of macro 'if'
if (__builtin_constant_p(size) && p_size < size)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memchr_inv' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:400:2: note: in expansion of macro 'if'
if (p_size < size)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memchr_inv' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:398:2: note: in expansion of macro 'if'
if (__builtin_constant_p(size) && p_size < size)
^~
include/linux/compiler.h:162:4: warning: '______f' is static but declared in inline function 'memchr' which is not static
______f = { \
^
include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
^~~~~~~~~~
include/linux/string.h:389:2: note: in expansion of macro 'if'
vim +/if +143 mm/dmapool.c
> 25 #include <linux/device.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/dmapool.h>
28 #include <linux/kernel.h>
29 #include <linux/list.h>
30 #include <linux/export.h>
31 #include <linux/mutex.h>
32 #include <linux/poison.h>
33 #include <linux/sched.h>
34 #include <linux/slab.h>
35 #include <linux/stat.h>
36 #include <linux/spinlock.h>
37 #include <linux/string.h>
38 #include <linux/types.h>
39 #include <linux/wait.h>
40
41 #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB_DEBUG_ON)
42 #define DMAPOOL_DEBUG 1
43 #endif
44
45 struct dma_pool { /* the pool */
46 struct list_head page_list;
47 spinlock_t lock;
48 size_t size;
49 struct device *dev;
50 size_t allocation;
51 size_t boundary;
52 char name[32];
53 struct list_head pools;
54 };
55
56 struct dma_page { /* cacheable header for 'allocation' bytes */
57 struct list_head page_list;
58 void *vaddr;
59 dma_addr_t dma;
60 unsigned int in_use;
61 unsigned int offset;
62 };
63
64 static DEFINE_MUTEX(pools_lock);
65 static DEFINE_MUTEX(pools_reg_lock);
66
67 static ssize_t
68 show_pools(struct device *dev, struct device_attribute *attr, char *buf)
69 {
70 unsigned temp;
71 unsigned size;
72 char *next;
73 struct dma_page *page;
74 struct dma_pool *pool;
75
76 next = buf;
77 size = PAGE_SIZE;
78
79 temp = scnprintf(next, size, "poolinfo - 0.1\n");
80 size -= temp;
81 next += temp;
82
83 mutex_lock(&pools_lock);
84 list_for_each_entry(pool, &dev->dma_pools, pools) {
85 unsigned pages = 0;
86 unsigned blocks = 0;
87
88 spin_lock_irq(&pool->lock);
89 list_for_each_entry(page, &pool->page_list, page_list) {
90 pages++;
91 blocks += page->in_use;
92 }
93 spin_unlock_irq(&pool->lock);
94
95 /* per-pool info, no real statistics yet */
96 temp = scnprintf(next, size, "%-16s %4u %4zu %4zu %2u\n",
97 pool->name, blocks,
98 pages * (pool->allocation / pool->size),
99 pool->size, pages);
100 size -= temp;
101 next += temp;
102 }
103 mutex_unlock(&pools_lock);
104
105 return PAGE_SIZE - size;
106 }
107
108 static DEVICE_ATTR(pools, S_IRUGO, show_pools, NULL);
109
110 /**
111 * dma_pool_create - Creates a pool of consistent memory blocks, for dma.
112 * @name: name of pool, for diagnostics
113 * @dev: device that will be doing the DMA
114 * @size: size of the blocks in this pool.
115 * @align: alignment requirement for blocks; must be a power of two
116 * @boundary: returned blocks won't cross this power of two boundary
117 * Context: !in_interrupt()
118 *
119 * Returns a dma allocation pool with the requested characteristics, or
120 * null if one can't be created. Given one of these pools, dma_pool_alloc()
121 * may be used to allocate memory. Such memory will all have "consistent"
122 * DMA mappings, accessible by the device and its driver without using
123 * cache flushing primitives. The actual size of blocks allocated may be
124 * larger than requested because of alignment.
125 *
126 * If @boundary is nonzero, objects returned from dma_pool_alloc() won't
127 * cross that size boundary. This is useful for devices which have
128 * addressing restrictions on individual DMA transfers, such as not crossing
129 * boundaries of 4KBytes.
130 */
131 struct dma_pool *dma_pool_create(const char *name, struct device *dev,
132 size_t size, size_t align, size_t boundary)
133 {
134 struct dma_pool *retval;
135 size_t allocation;
136 bool empty = false;
137
138 if (align == 0)
139 align = 1;
140 else if (align & (align - 1))
141 return NULL;
142
> 143 if (!plat_device_is_coherent(dev))
144 align = max_t(size_t, align, dma_get_cache_alignment());
145
146 if (size == 0)
147 return NULL;
148 else if (size < 4)
149 size = 4;
150
151 if ((size % align) != 0)
152 size = ALIGN(size, align);
153
154 allocation = max_t(size_t, size, PAGE_SIZE);
155
156 if (!boundary)
157 boundary = allocation;
158 else if ((boundary < size) || (boundary & (boundary - 1)))
159 return NULL;
160
161 retval = kmalloc_node(sizeof(*retval), GFP_KERNEL, dev_to_node(dev));
162 if (!retval)
163 return retval;
164
165 strlcpy(retval->name, name, sizeof(retval->name));
166
167 retval->dev = dev;
168
169 INIT_LIST_HEAD(&retval->page_list);
170 spin_lock_init(&retval->lock);
171 retval->size = size;
172 retval->boundary = boundary;
173 retval->allocation = allocation;
174
175 INIT_LIST_HEAD(&retval->pools);
176
177 /*
178 * pools_lock ensures that the ->dma_pools list does not get corrupted.
179 * pools_reg_lock ensures that there is not a race between
180 * dma_pool_create() and dma_pool_destroy() or within dma_pool_create()
181 * when the first invocation of dma_pool_create() failed on
182 * device_create_file() and the second assumes that it has been done (I
183 * know it is a short window).
184 */
185 mutex_lock(&pools_reg_lock);
186 mutex_lock(&pools_lock);
187 if (list_empty(&dev->dma_pools))
188 empty = true;
189 list_add(&retval->pools, &dev->dma_pools);
190 mutex_unlock(&pools_lock);
191 if (empty) {
192 int err;
193
194 err = device_create_file(dev, &dev_attr_pools);
195 if (err) {
196 mutex_lock(&pools_lock);
197 list_del(&retval->pools);
198 mutex_unlock(&pools_lock);
199 mutex_unlock(&pools_reg_lock);
200 kfree(retval);
201 return NULL;
202 }
203 }
204 mutex_unlock(&pools_reg_lock);
205 return retval;
206 }
207 EXPORT_SYMBOL(dma_pool_create);
208
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip