Hi Chunming, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v5.1-rc1 next-20190320] [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/Chunming-Zhou/dma-buf-add-new-dma_fence_chain-container-v6/20190320-223607 reproduce: # apt-get install sparse make ARCH=x86_64 allmodconfig make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' sparse warnings: (new ones prefixed by >>) >> drivers/dma-buf/dma-fence-chain.c:73:23: sparse: incorrect type in initializer (different address spaces) @@ expected struct dma_fence [noderef] <asn:4>*__old @@ got dma_fence [noderef] <asn:4>*__old @@ drivers/dma-buf/dma-fence-chain.c:73:23: expected struct dma_fence [noderef] <asn:4>*__old drivers/dma-buf/dma-fence-chain.c:73:23: got struct dma_fence *[assigned] prev >> drivers/dma-buf/dma-fence-chain.c:73:23: sparse: incorrect type in initializer (different address spaces) @@ expected struct dma_fence [noderef] <asn:4>*__new @@ got dma_fence [noderef] <asn:4>*__new @@ drivers/dma-buf/dma-fence-chain.c:73:23: expected struct dma_fence [noderef] <asn:4>*__new drivers/dma-buf/dma-fence-chain.c:73:23: got struct dma_fence *[assigned] replacement >> drivers/dma-buf/dma-fence-chain.c:73:21: sparse: incorrect type in assignment (different address spaces) @@ expected struct dma_fence *tmp @@ got struct dma_fence [noderef] <struct dma_fence *tmp @@ drivers/dma-buf/dma-fence-chain.c:73:21: expected struct dma_fence *tmp drivers/dma-buf/dma-fence-chain.c:73:21: got struct dma_fence [noderef] <asn:4>*[assigned] __ret >> drivers/dma-buf/dma-fence-chain.c:190:28: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct dma_fence *fence @@ got struct dma_fence struct dma_fence *fence @@ drivers/dma-buf/dma-fence-chain.c:190:28: expected struct dma_fence *fence drivers/dma-buf/dma-fence-chain.c:190:28: got struct dma_fence [noderef] <asn:4>*prev >> drivers/dma-buf/dma-fence-chain.c:222:21: sparse: incorrect type in assignment (different address spaces) @@ expected struct dma_fence [noderef] <asn:4>*prev @@ got [noderef] <asn:4>*prev @@ drivers/dma-buf/dma-fence-chain.c:222:21: expected struct dma_fence [noderef] <asn:4>*prev drivers/dma-buf/dma-fence-chain.c:222:21: got struct dma_fence *prev drivers/dma-buf/dma-fence-chain.c:235:33: sparse: expression using sizeof(void) drivers/dma-buf/dma-fence-chain.c:235:33: sparse: expression using sizeof(void) vim +73 drivers/dma-buf/dma-fence-chain.c 38 39 /** 40 * dma_fence_chain_walk - chain walking function 41 * @fence: current chain node 42 * 43 * Walk the chain to the next node. Returns the next fence or NULL if we are at 44 * the end of the chain. Garbage collects chain nodes which are already 45 * signaled. 46 */ 47 struct dma_fence *dma_fence_chain_walk(struct dma_fence *fence) 48 { 49 struct dma_fence_chain *chain, *prev_chain; 50 struct dma_fence *prev, *replacement, *tmp; 51 52 chain = to_dma_fence_chain(fence); 53 if (!chain) { 54 dma_fence_put(fence); 55 return NULL; 56 } 57 58 while ((prev = dma_fence_chain_get_prev(chain))) { 59 60 prev_chain = to_dma_fence_chain(prev); 61 if (prev_chain) { 62 if (!dma_fence_is_signaled(prev_chain->fence)) 63 break; 64 65 replacement = dma_fence_chain_get_prev(prev_chain); 66 } else { 67 if (!dma_fence_is_signaled(prev)) 68 break; 69 70 replacement = NULL; 71 } 72 > 73 tmp = cmpxchg(&chain->prev, prev, replacement); 74 if (tmp == prev) 75 dma_fence_put(tmp); 76 else 77 dma_fence_put(replacement); 78 dma_fence_put(prev); 79 } 80 81 dma_fence_put(fence); 82 return prev; 83 } 84 EXPORT_SYMBOL(dma_fence_chain_walk); 85 86 /** 87 * dma_fence_chain_find_seqno - find fence chain node by seqno 88 * @pfence: pointer to the chain node where to start 89 * @seqno: the sequence number to search for 90 * 91 * Advance the fence pointer to the chain node which will signal this sequence 92 * number. If no sequence number is provided then this is a no-op. 93 * 94 * Returns EINVAL if the fence is not a chain node or the sequence number has 95 * not yet advanced far enough. 96 */ 97 int dma_fence_chain_find_seqno(struct dma_fence **pfence, uint64_t seqno) 98 { 99 struct dma_fence_chain *chain; 100 101 if (!seqno) 102 return 0; 103 104 chain = to_dma_fence_chain(*pfence); 105 if (!chain || chain->base.seqno < seqno) 106 return -EINVAL; 107 108 dma_fence_chain_for_each(*pfence, &chain->base) { 109 if ((*pfence)->context != chain->base.context || 110 to_dma_fence_chain(*pfence)->prev_seqno < seqno) 111 break; 112 } 113 dma_fence_put(&chain->base); 114 115 return 0; 116 } 117 EXPORT_SYMBOL(dma_fence_chain_find_seqno); 118 119 static const char *dma_fence_chain_get_driver_name(struct dma_fence *fence) 120 { 121 return "dma_fence_chain"; 122 } 123 124 static const char *dma_fence_chain_get_timeline_name(struct dma_fence *fence) 125 { 126 return "unbound"; 127 } 128 129 static void dma_fence_chain_irq_work(struct irq_work *work) 130 { 131 struct dma_fence_chain *chain; 132 133 chain = container_of(work, typeof(*chain), work); 134 135 /* Try to rearm the callback */ 136 if (!dma_fence_chain_enable_signaling(&chain->base)) 137 /* Ok, we are done. No more unsignaled fences left */ 138 dma_fence_signal(&chain->base); 139 dma_fence_put(&chain->base); 140 } 141 142 static void dma_fence_chain_cb(struct dma_fence *f, struct dma_fence_cb *cb) 143 { 144 struct dma_fence_chain *chain; 145 146 chain = container_of(cb, typeof(*chain), cb); 147 irq_work_queue(&chain->work); 148 dma_fence_put(f); 149 } 150 151 static bool dma_fence_chain_enable_signaling(struct dma_fence *fence) 152 { 153 struct dma_fence_chain *head = to_dma_fence_chain(fence); 154 155 dma_fence_get(&head->base); 156 dma_fence_chain_for_each(fence, &head->base) { 157 struct dma_fence_chain *chain = to_dma_fence_chain(fence); 158 struct dma_fence *f = chain ? chain->fence : fence; 159 160 dma_fence_get(f); 161 if (!dma_fence_add_callback(f, &head->cb, dma_fence_chain_cb)) { 162 dma_fence_put(fence); 163 return true; 164 } 165 dma_fence_put(f); 166 } 167 dma_fence_put(&head->base); 168 return false; 169 } 170 171 static bool dma_fence_chain_signaled(struct dma_fence *fence) 172 { 173 dma_fence_chain_for_each(fence, fence) { 174 struct dma_fence_chain *chain = to_dma_fence_chain(fence); 175 struct dma_fence *f = chain ? chain->fence : fence; 176 177 if (!dma_fence_is_signaled(f)) { 178 dma_fence_put(fence); 179 return false; 180 } 181 } 182 183 return true; 184 } 185 186 static void dma_fence_chain_release(struct dma_fence *fence) 187 { 188 struct dma_fence_chain *chain = to_dma_fence_chain(fence); 189 > 190 dma_fence_put(chain->prev); 191 dma_fence_put(chain->fence); 192 dma_fence_free(fence); 193 } 194 195 const struct dma_fence_ops dma_fence_chain_ops = { 196 .get_driver_name = dma_fence_chain_get_driver_name, 197 .get_timeline_name = dma_fence_chain_get_timeline_name, 198 .enable_signaling = dma_fence_chain_enable_signaling, 199 .signaled = dma_fence_chain_signaled, 200 .release = dma_fence_chain_release, 201 }; 202 EXPORT_SYMBOL(dma_fence_chain_ops); 203 204 /** 205 * dma_fence_chain_init - initialize a fence chain 206 * @chain: the chain node to initialize 207 * @prev: the previous fence 208 * @fence: the current fence 209 * 210 * Initialize a new chain node and either start a new chain or add the node to 211 * the existing chain of the previous fence. 212 */ 213 void dma_fence_chain_init(struct dma_fence_chain *chain, 214 struct dma_fence *prev, 215 struct dma_fence *fence, 216 uint64_t seqno) 217 { 218 struct dma_fence_chain *prev_chain = to_dma_fence_chain(prev); 219 uint64_t context; 220 221 spin_lock_init(&chain->lock); > 222 chain->prev = prev; --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx