Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-03-13 Thread Yong Wu
On Tue, 2019-03-12 at 16:17 -0700, Evan Green wrote:
> On Tue, Mar 12, 2019 at 7:21 AM Matthias Brugger  
> wrote:
> >
> >
> >
> > On 05/03/2019 20:03, Evan Green wrote:
> > > On Wed, Feb 27, 2019 at 6:33 AM Yong Wu  wrote:
> > >>
> > >> On Mon, 2019-02-25 at 15:53 -0800, Evan Green wrote:
> > >>> On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:
> > 
> >  DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
> >  automatically on consumer/supplier driver unbind", that means we should
> >  remove whole the device_link when there is no this driver no matter 
> >  what
> >  the ref_count of the link is.
> > 
> >  CC: Greg Kroah-Hartman 
> >  Signed-off-by: Yong Wu 
> >  ---
> >  The ref_count of our device_link normally is over 1. When the consumer
> >  device driver is removed, whole the device_link should be removed.
> >  Thus, I add this patch.
> >  ---
> > >>>
> > >>> I will admit to reading about device links for the first time while
> > >>> reviewing this patch, but I don't really get this. Why use a kref at
> > >>> all if we're just going to ignore its value? For instance, I see that
> > >>> if you call device_link_add() with the same supplier and consumer, it
> > >>> uses the kref to return the same link. That machinery is broken with
> > >>> your change. Although I don't see any uses of it, you might also
> > >>> expect a supplier or consumer could do a kref_get() on the link it got
> > >>> back from device_link_add(), and have a reasonable expectation that
> > >>> the link wouldn't be freed out from under it. This would also be
> > >>> broken.
> > >>>
> > >>> Can you explain why your device_links normally have a reference count
> >  1,
> > >>
> > >> I use device link between the smi-larb device and the iommu-consumer
> > >> device. Take a example, smi-larb1 have 4 VDEC ports. From 4/13 in this
> > >> patchset, we use device_link to link the VDEC device and the smi-larb1
> > >> device in the function(mtk_iommu_config). since there are 4 ports, it
> > >> will call device_link_add 4 times.
> > >>
> > >>>
> > >>> and why those additional references can't be cleaned up in an
> > >>> orderly fashion?
> > >>
> > >> If the iommu-consume device(like VDEC above) is removed, It should enter
> > >> device_links_driver_cleanup which only ref_put one time. I guess whole
> > >> the link should be removed at that time.
> > >
> > > It seems like Robin had some suggestions about using
> > > mtk_iommu_add_device() rather than the attach_dev() to set the links
> > > up, and then track them for removal in the corresponding
> > > remove_device() callback. Then you wouldn't need this change, right?

Hi Evan,  sorry for reply you so late. I have not got time to try
this(Put it in the add_device), But I guess it works.
At that time the ref_cnt here should be 1, then this patch is
unnecessary.

> > >
> >
> > FYI, Evan the patch is queued for v5.1-rc1 as
> > 0fe6f7874d46 ("driver core: Remove the link if there is no driver with AUTO 
> > flag")
> >
> > So if you think there is something wrong with it, then please provide a fix 
> > or
> > raise awareness :)
> 
> Oh. Thanks for the heads-up Matthias. It's pretty weird that we have
> the kref there whose count we just completely ignore. I'll try to find
> some time to submit a patch.

Thanks very much if you improve this.

> -Evan


___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-03-12 Thread Evan Green
On Tue, Mar 12, 2019 at 7:21 AM Matthias Brugger  wrote:
>
>
>
> On 05/03/2019 20:03, Evan Green wrote:
> > On Wed, Feb 27, 2019 at 6:33 AM Yong Wu  wrote:
> >>
> >> On Mon, 2019-02-25 at 15:53 -0800, Evan Green wrote:
> >>> On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:
> 
>  DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
>  automatically on consumer/supplier driver unbind", that means we should
>  remove whole the device_link when there is no this driver no matter what
>  the ref_count of the link is.
> 
>  CC: Greg Kroah-Hartman 
>  Signed-off-by: Yong Wu 
>  ---
>  The ref_count of our device_link normally is over 1. When the consumer
>  device driver is removed, whole the device_link should be removed.
>  Thus, I add this patch.
>  ---
> >>>
> >>> I will admit to reading about device links for the first time while
> >>> reviewing this patch, but I don't really get this. Why use a kref at
> >>> all if we're just going to ignore its value? For instance, I see that
> >>> if you call device_link_add() with the same supplier and consumer, it
> >>> uses the kref to return the same link. That machinery is broken with
> >>> your change. Although I don't see any uses of it, you might also
> >>> expect a supplier or consumer could do a kref_get() on the link it got
> >>> back from device_link_add(), and have a reasonable expectation that
> >>> the link wouldn't be freed out from under it. This would also be
> >>> broken.
> >>>
> >>> Can you explain why your device_links normally have a reference count
>  1,
> >>
> >> I use device link between the smi-larb device and the iommu-consumer
> >> device. Take a example, smi-larb1 have 4 VDEC ports. From 4/13 in this
> >> patchset, we use device_link to link the VDEC device and the smi-larb1
> >> device in the function(mtk_iommu_config). since there are 4 ports, it
> >> will call device_link_add 4 times.
> >>
> >>>
> >>> and why those additional references can't be cleaned up in an
> >>> orderly fashion?
> >>
> >> If the iommu-consume device(like VDEC above) is removed, It should enter
> >> device_links_driver_cleanup which only ref_put one time. I guess whole
> >> the link should be removed at that time.
> >
> > It seems like Robin had some suggestions about using
> > mtk_iommu_add_device() rather than the attach_dev() to set the links
> > up, and then track them for removal in the corresponding
> > remove_device() callback. Then you wouldn't need this change, right?
> >
>
> FYI, Evan the patch is queued for v5.1-rc1 as
> 0fe6f7874d46 ("driver core: Remove the link if there is no driver with AUTO 
> flag")
>
> So if you think there is something wrong with it, then please provide a fix or
> raise awareness :)

Oh. Thanks for the heads-up Matthias. It's pretty weird that we have
the kref there whose count we just completely ignore. I'll try to find
some time to submit a patch.
-Evan
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-03-12 Thread Matthias Brugger



On 05/03/2019 20:03, Evan Green wrote:
> On Wed, Feb 27, 2019 at 6:33 AM Yong Wu  wrote:
>>
>> On Mon, 2019-02-25 at 15:53 -0800, Evan Green wrote:
>>> On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:

 DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
 automatically on consumer/supplier driver unbind", that means we should
 remove whole the device_link when there is no this driver no matter what
 the ref_count of the link is.

 CC: Greg Kroah-Hartman 
 Signed-off-by: Yong Wu 
 ---
 The ref_count of our device_link normally is over 1. When the consumer
 device driver is removed, whole the device_link should be removed.
 Thus, I add this patch.
 ---
>>>
>>> I will admit to reading about device links for the first time while
>>> reviewing this patch, but I don't really get this. Why use a kref at
>>> all if we're just going to ignore its value? For instance, I see that
>>> if you call device_link_add() with the same supplier and consumer, it
>>> uses the kref to return the same link. That machinery is broken with
>>> your change. Although I don't see any uses of it, you might also
>>> expect a supplier or consumer could do a kref_get() on the link it got
>>> back from device_link_add(), and have a reasonable expectation that
>>> the link wouldn't be freed out from under it. This would also be
>>> broken.
>>>
>>> Can you explain why your device_links normally have a reference count
 1,
>>
>> I use device link between the smi-larb device and the iommu-consumer
>> device. Take a example, smi-larb1 have 4 VDEC ports. From 4/13 in this
>> patchset, we use device_link to link the VDEC device and the smi-larb1
>> device in the function(mtk_iommu_config). since there are 4 ports, it
>> will call device_link_add 4 times.
>>
>>>
>>> and why those additional references can't be cleaned up in an
>>> orderly fashion?
>>
>> If the iommu-consume device(like VDEC above) is removed, It should enter
>> device_links_driver_cleanup which only ref_put one time. I guess whole
>> the link should be removed at that time.
> 
> It seems like Robin had some suggestions about using
> mtk_iommu_add_device() rather than the attach_dev() to set the links
> up, and then track them for removal in the corresponding
> remove_device() callback. Then you wouldn't need this change, right?
> 

FYI, Evan the patch is queued for v5.1-rc1 as
0fe6f7874d46 ("driver core: Remove the link if there is no driver with AUTO 
flag")

So if you think there is something wrong with it, then please provide a fix or
raise awareness :)
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-03-05 Thread Evan Green
On Wed, Feb 27, 2019 at 6:33 AM Yong Wu  wrote:
>
> On Mon, 2019-02-25 at 15:53 -0800, Evan Green wrote:
> > On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:
> > >
> > > DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
> > > automatically on consumer/supplier driver unbind", that means we should
> > > remove whole the device_link when there is no this driver no matter what
> > > the ref_count of the link is.
> > >
> > > CC: Greg Kroah-Hartman 
> > > Signed-off-by: Yong Wu 
> > > ---
> > > The ref_count of our device_link normally is over 1. When the consumer
> > > device driver is removed, whole the device_link should be removed.
> > > Thus, I add this patch.
> > > ---
> >
> > I will admit to reading about device links for the first time while
> > reviewing this patch, but I don't really get this. Why use a kref at
> > all if we're just going to ignore its value? For instance, I see that
> > if you call device_link_add() with the same supplier and consumer, it
> > uses the kref to return the same link. That machinery is broken with
> > your change. Although I don't see any uses of it, you might also
> > expect a supplier or consumer could do a kref_get() on the link it got
> > back from device_link_add(), and have a reasonable expectation that
> > the link wouldn't be freed out from under it. This would also be
> > broken.
> >
> > Can you explain why your device_links normally have a reference count
> > >1,
>
> I use device link between the smi-larb device and the iommu-consumer
> device. Take a example, smi-larb1 have 4 VDEC ports. From 4/13 in this
> patchset, we use device_link to link the VDEC device and the smi-larb1
> device in the function(mtk_iommu_config). since there are 4 ports, it
> will call device_link_add 4 times.
>
> >
> > and why those additional references can't be cleaned up in an
> > orderly fashion?
>
> If the iommu-consume device(like VDEC above) is removed, It should enter
> device_links_driver_cleanup which only ref_put one time. I guess whole
> the link should be removed at that time.

It seems like Robin had some suggestions about using
mtk_iommu_add_device() rather than the attach_dev() to set the links
up, and then track them for removal in the corresponding
remove_device() callback. Then you wouldn't need this change, right?
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-02-27 Thread Yong Wu
On Mon, 2019-02-25 at 15:53 -0800, Evan Green wrote:
> On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:
> >
> > DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
> > automatically on consumer/supplier driver unbind", that means we should
> > remove whole the device_link when there is no this driver no matter what
> > the ref_count of the link is.
> >
> > CC: Greg Kroah-Hartman 
> > Signed-off-by: Yong Wu 
> > ---
> > The ref_count of our device_link normally is over 1. When the consumer
> > device driver is removed, whole the device_link should be removed.
> > Thus, I add this patch.
> > ---
> 
> I will admit to reading about device links for the first time while
> reviewing this patch, but I don't really get this. Why use a kref at
> all if we're just going to ignore its value? For instance, I see that
> if you call device_link_add() with the same supplier and consumer, it
> uses the kref to return the same link. That machinery is broken with
> your change. Although I don't see any uses of it, you might also
> expect a supplier or consumer could do a kref_get() on the link it got
> back from device_link_add(), and have a reasonable expectation that
> the link wouldn't be freed out from under it. This would also be
> broken.
> 
> Can you explain why your device_links normally have a reference count
> >1, 

I use device link between the smi-larb device and the iommu-consumer
device. Take a example, smi-larb1 have 4 VDEC ports. From 4/13 in this
patchset, we use device_link to link the VDEC device and the smi-larb1
device in the function(mtk_iommu_config). since there are 4 ports, it
will call device_link_add 4 times.

>
> and why those additional references can't be cleaned up in an
> orderly fashion?

If the iommu-consume device(like VDEC above) is removed, It should enter
device_links_driver_cleanup which only ref_put one time. I guess whole
the link should be removed at that time.

> 
> (To be honest, I don't really understand the case for the AUTOREMOVE
> flags at all. Is there some case where the party that set up the link
> can't tear it down? Or is this a way to devm_ify the link, where devm
> itself doesn't work because the links themselves stall out that
> mechanism?)

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2019-02-25 Thread Evan Green
On Mon, Dec 31, 2018 at 8:52 PM Yong Wu  wrote:
>
> DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
> automatically on consumer/supplier driver unbind", that means we should
> remove whole the device_link when there is no this driver no matter what
> the ref_count of the link is.
>
> CC: Greg Kroah-Hartman 
> Signed-off-by: Yong Wu 
> ---
> The ref_count of our device_link normally is over 1. When the consumer
> device driver is removed, whole the device_link should be removed.
> Thus, I add this patch.
> ---

I will admit to reading about device links for the first time while
reviewing this patch, but I don't really get this. Why use a kref at
all if we're just going to ignore its value? For instance, I see that
if you call device_link_add() with the same supplier and consumer, it
uses the kref to return the same link. That machinery is broken with
your change. Although I don't see any uses of it, you might also
expect a supplier or consumer could do a kref_get() on the link it got
back from device_link_add(), and have a reasonable expectation that
the link wouldn't be freed out from under it. This would also be
broken.

Can you explain why your device_links normally have a reference count
>1, and why those additional references can't be cleaned up in an
orderly fashion?

(To be honest, I don't really understand the case for the AUTOREMOVE
flags at all. Is there some case where the party that set up the link
can't tear it down? Or is this a way to devm_ify the link, where devm
itself doesn't work because the links themselves stall out that
mechanism?)
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH 02/13] driver core: Remove the link if there is no driver with AUTO flag

2018-12-31 Thread Yong Wu
DL_FLAG_AUTOREMOVE_CONSUMER/SUPPLIER means "Remove the link
automatically on consumer/supplier driver unbind", that means we should
remove whole the device_link when there is no this driver no matter what
the ref_count of the link is.

CC: Greg Kroah-Hartman 
Signed-off-by: Yong Wu 
---
The ref_count of our device_link normally is over 1. When the consumer
device driver is removed, whole the device_link should be removed.
Thus, I add this patch.
---
 drivers/base/core.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 04bbcd7..4f3c5bc 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -511,7 +511,7 @@ static void __device_links_no_driver(struct device *dev)
continue;
 
if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER)
-   kref_put(>kref, __device_link_del);
+   __device_link_del(>kref);
else if (link->status != DL_STATE_SUPPLIER_UNBIND)
WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
}
@@ -556,7 +556,7 @@ void device_links_driver_cleanup(struct device *dev)
 */
if (link->status == DL_STATE_SUPPLIER_UNBIND &&
link->flags & DL_FLAG_AUTOREMOVE_SUPPLIER)
-   kref_put(>kref, __device_link_del);
+   __device_link_del(>kref);
 
WRITE_ONCE(link->status, DL_STATE_DORMANT);
}
-- 
1.9.1

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu