Hi Lionel and Christian,

Below is robot report for chain->prev, which was added __rcu as you suggested.

How to fix this line "tmp = cmpxchg(&chain->prev, prev, replacement); "?
I checked kernel header file, seems it has no cmpxchg for rcu.

Any suggestion to fix this robot report?

Thanks,
-David

On 2019年03月21日 08:24, kbuild test robot wrote:
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

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to