Thread (10 messages) flat view 10 messages, 3 authors, 2018-06-28

Re: [PATCH 2/3] drivers/base: reorder consumer and its children behind suppliers

From: Pingfan Liu <hidden>
Date: 2018-06-27 02:35:09
Also in: linux-pci, lkml

Hi Dan,

Thanks for your hints, see the comment in lines.

On Tue, Jun 26, 2018 at 3:44 PM Dan Carpenter [off-list ref] wrote:
[ There is a bug with kbuild where it's not showing the Smatch warnings
  but I can probably guess...  - dan ]

Hi Pingfan,

Thank you for the patch! Perhaps something to improve:

url:    https://github.com/0day-ci/linux/commits/Pingfan-Liu/drivers-base-bugfix-for-supplier-consumer-ordering-in-device_kset/20180625-132702


# https://github.com/0day-ci/linux/commit/1b2a1e63898baf80e8e830991284e1534bc54766
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 1b2a1e63898baf80e8e830991284e1534bc54766
vim +/ret +245 drivers/base/core.c

1b2a1e63 Pingfan Liu 2018-06-25  216
1b2a1e63 Pingfan Liu 2018-06-25  217  /* When reodering, take care of the range of (old_pos(dev), new_pos(dev)),
1b2a1e63 Pingfan Liu 2018-06-25  218   * there may be requirement to recursively move item.
1b2a1e63 Pingfan Liu 2018-06-25  219   */
1b2a1e63 Pingfan Liu 2018-06-25  220  int device_reorder_consumer(struct device *dev)
1b2a1e63 Pingfan Liu 2018-06-25  221  {
1b2a1e63 Pingfan Liu 2018-06-25  222    struct list_head *iter, *left, *right;
1b2a1e63 Pingfan Liu 2018-06-25  223    struct device *cur_dev;
1b2a1e63 Pingfan Liu 2018-06-25  224    struct pos_info info;
1b2a1e63 Pingfan Liu 2018-06-25  225    int ret, idx;
1b2a1e63 Pingfan Liu 2018-06-25  226
1b2a1e63 Pingfan Liu 2018-06-25  227    idx = device_links_read_lock();
1b2a1e63 Pingfan Liu 2018-06-25  228    if (list_empty(&dev->links.suppliers)) {
1b2a1e63 Pingfan Liu 2018-06-25  229            device_links_read_unlock(idx);
1b2a1e63 Pingfan Liu 2018-06-25  230            return 0;
1b2a1e63 Pingfan Liu 2018-06-25  231    }
1b2a1e63 Pingfan Liu 2018-06-25  232    spin_lock(&devices_kset->list_lock);
1b2a1e63 Pingfan Liu 2018-06-25  233    list_for_each_prev(iter, &devices_kset->list) {
1b2a1e63 Pingfan Liu 2018-06-25  234            cur_dev = list_entry(iter, struct device, kobj.entry);
1b2a1e63 Pingfan Liu 2018-06-25  235            ret = find_last_supplier(dev, cur_dev);
1b2a1e63 Pingfan Liu 2018-06-25  236            switch (ret) {
1b2a1e63 Pingfan Liu 2018-06-25  237            case -1:
1b2a1e63 Pingfan Liu 2018-06-25  238                    goto unlock;
1b2a1e63 Pingfan Liu 2018-06-25  239            case 1:
1b2a1e63 Pingfan Liu 2018-06-25  240                    break;
1b2a1e63 Pingfan Liu 2018-06-25  241            case 0:
1b2a1e63 Pingfan Liu 2018-06-25  242                    continue;

The break breaks from the switch and the continue continues the loop so
they're equivalent.  Perhaps you intended to break from the loop?
Yes, you are right.
1b2a1e63 Pingfan Liu 2018-06-25  243            }
1b2a1e63 Pingfan Liu 2018-06-25  244    }
1b2a1e63 Pingfan Liu 2018-06-25 @245    BUG_ON(!ret);

If the list is empty then "ret" can be unitialized.  We test a different
list "dev->links.suppliers" to see if that's empty.  I wrote a bunch of
code to make Smatch try to understand about empty lists, but I don't
think it works...
Yes, if list_empty, then the code can not touch ret. But ret is
useless in this scene. Does it matter?

Thanks and regards,
Pingfan
1b2a1e63 Pingfan Liu 2018-06-25  246
1b2a1e63 Pingfan Liu 2018-06-25  247    /* record the affected open section */
1b2a1e63 Pingfan Liu 2018-06-25  248    left = dev->kobj.entry.prev;
1b2a1e63 Pingfan Liu 2018-06-25  249    right = iter;
1b2a1e63 Pingfan Liu 2018-06-25  250    info.pos = list_entry(iter, struct device, kobj.entry);
1b2a1e63 Pingfan Liu 2018-06-25  251    info.tail = NULL;
1b2a1e63 Pingfan Liu 2018-06-25  252    /* dry out the consumers in (left,right) */
1b2a1e63 Pingfan Liu 2018-06-25  253    __device_reorder_consumer(dev, left, right, &info);
1b2a1e63 Pingfan Liu 2018-06-25  254
1b2a1e63 Pingfan Liu 2018-06-25  255  unlock:
1b2a1e63 Pingfan Liu 2018-06-25  256    spin_unlock(&devices_kset->list_lock);
1b2a1e63 Pingfan Liu 2018-06-25  257    device_links_read_unlock(idx);
1b2a1e63 Pingfan Liu 2018-06-25  258    return 0;
1b2a1e63 Pingfan Liu 2018-06-25  259  }
1b2a1e63 Pingfan Liu 2018-06-25  260

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help