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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to