diff mbox

drm/ttm: Use ttm_bo_default_io_mem_pfn if io_mem_pfn is NULL

Message ID 20171129152001.29669-1-msrb@suse.com (mailing list archive)
State New, archived
Headers show

Commit Message

Michal Srb Nov. 29, 2017, 3:20 p.m. UTC
The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
and is called unconditionally. However, not all drivers were updated to set it.

Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.

Signed-off-by: Michal Srb <msrb@suse.com>
---
 drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Christian König Nov. 29, 2017, 3:24 p.m. UTC | #1
Am 29.11.2017 um 16:20 schrieb Michal Srb:
> The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
> and is called unconditionally. However, not all drivers were updated to set it.
>
> Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
>
> Signed-off-by: Michal Srb <msrb@suse.com>

NAK, when we have drivers missing this we should set this in the driver 
and not add the workaround here.

Which driver is missing this? I thought I fixed all of them.

Regards,
Christian.

> ---
>   drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> index c8ebb757e36b..e25a99bc519d 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
>   		if (bo->mem.bus.is_iomem) {
>   			/* Iomem should not be marked encrypted */
>   			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
> -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> +			if (bdev->driver->io_mem_pfn)
> +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> +			else
> +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
>   		} else {
>   			page = ttm->pages[page_offset];
>   			if (unlikely(!page && i == 0)) {
Michal Srb Nov. 29, 2017, 3:29 p.m. UTC | #2
On Wednesday 29th November 2017 16:24:21 CET Christian König  wrote:
> Am 29.11.2017 um 16:20 schrieb Michal Srb:
> > The io_mem_pfn field was added in commit
> > ea642c3216cb2a60d1c0e760ae47ee85c9c16447 and is called unconditionally.
> > However, not all drivers were updated to set it.
> > 
> > Use the ttm_bo_default_io_mem_pfn function if a driver did not set its
> > own.
> > 
> > Signed-off-by: Michal Srb <msrb@suse.com>
> 
> NAK, when we have drivers missing this we should set this in the driver
> and not add the workaround here.
> 
> Which driver is missing this? I thought I fixed all of them.

The one where I ran into the problem is hibmc. I've sent patch fixing it, but 
reportedly there is more drivers with the same issue, so this fix was 
suggested instead:

On Wednesday 29th November 2017 15:47:30 CET Sean Paul wrote:
> Instead of just doing the same cargo cult in this driver, lets just call the
> default function when io_mem_pfn is NULL. Looks like 9 other drivers are
> affected as well.

> Sean

Michal
Sean Paul Nov. 29, 2017, 3:36 p.m. UTC | #3
On Wed, Nov 29, 2017 at 04:24:21PM +0100, Christian König wrote:
> Am 29.11.2017 um 16:20 schrieb Michal Srb:
> > The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
> > and is called unconditionally. However, not all drivers were updated to set it.
> > 
> > Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
> > 
> > Signed-off-by: Michal Srb <msrb@suse.com>
> 
> NAK, when we have drivers missing this we should set this in the driver and
> not add the workaround here.

Why? What's the benefit in adding the same hook in 10 drivers (I was hoping
Michal would also remove the token .io_mem_pfn = ttm_bo_default_io_mem_pfn from
those as well)?

Sean

> 
> Which driver is missing this? I thought I fixed all of them.
> 
> Regards,
> Christian.
> 
> > ---
> >   drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
> >   1 file changed, 4 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > index c8ebb757e36b..e25a99bc519d 100644
> > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
> >   		if (bo->mem.bus.is_iomem) {
> >   			/* Iomem should not be marked encrypted */
> >   			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
> > -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > +			if (bdev->driver->io_mem_pfn)
> > +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > +			else
> > +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
> >   		} else {
> >   			page = ttm->pages[page_offset];
> >   			if (unlikely(!page && i == 0)) {
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Christian König Nov. 29, 2017, 3:40 p.m. UTC | #4
Am 29.11.2017 um 16:36 schrieb Sean Paul:
> On Wed, Nov 29, 2017 at 04:24:21PM +0100, Christian König wrote:
>> Am 29.11.2017 um 16:20 schrieb Michal Srb:
>>> The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
>>> and is called unconditionally. However, not all drivers were updated to set it.
>>>
>>> Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
>>>
>>> Signed-off-by: Michal Srb <msrb@suse.com>
>> NAK, when we have drivers missing this we should set this in the driver and
>> not add the workaround here.
> Why? What's the benefit in adding the same hook in 10 drivers (I was hoping
> Michal would also remove the token .io_mem_pfn = ttm_bo_default_io_mem_pfn from
> those as well)?

Not have this extra check in common TTM code? That is seriously bad 
coding style.

We have tons of fallbacks like this and I unfortunately even created new 
one without realizing that this is a problem.

But this really clutters the TTM code and makes it harder to understand.

Christian.

>
> Sean
>
>> Which driver is missing this? I thought I fixed all of them.
>>
>> Regards,
>> Christian.
>>
>>> ---
>>>    drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
>>>    1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>> index c8ebb757e36b..e25a99bc519d 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>> @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
>>>    		if (bo->mem.bus.is_iomem) {
>>>    			/* Iomem should not be marked encrypted */
>>>    			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
>>> -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
>>> +			if (bdev->driver->io_mem_pfn)
>>> +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
>>> +			else
>>> +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
>>>    		} else {
>>>    			page = ttm->pages[page_offset];
>>>    			if (unlikely(!page && i == 0)) {
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Sean Paul Nov. 29, 2017, 3:44 p.m. UTC | #5
On Wed, Nov 29, 2017 at 04:40:18PM +0100, Christian König wrote:
> Am 29.11.2017 um 16:36 schrieb Sean Paul:
> > On Wed, Nov 29, 2017 at 04:24:21PM +0100, Christian König wrote:
> > > Am 29.11.2017 um 16:20 schrieb Michal Srb:
> > > > The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
> > > > and is called unconditionally. However, not all drivers were updated to set it.
> > > > 
> > > > Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
> > > > 
> > > > Signed-off-by: Michal Srb <msrb@suse.com>
> > > NAK, when we have drivers missing this we should set this in the driver and
> > > not add the workaround here.
> > Why? What's the benefit in adding the same hook in 10 drivers (I was hoping
> > Michal would also remove the token .io_mem_pfn = ttm_bo_default_io_mem_pfn from
> > those as well)?
> 
> Not have this extra check in common TTM code? That is seriously bad coding
> style.
> 

[citation neeeded]

I'd argue it's bad form to require everyone add a copypasta hook to their driver
everytime an unrelated driver needs more control than the default gives :-)

I think your point would hold if we were talking about a couple of drivers, but
once you scale to 10+, it's no longer a trivial amount of code. If the null check
is too distracting, you could always pull it out into an inline.

Sean


> We have tons of fallbacks like this and I unfortunately even created new one
> without realizing that this is a problem.
> 
> But this really clutters the TTM code and makes it harder to understand.
> 
> Christian.
> 
> > 
> > Sean
> > 
> > > Which driver is missing this? I thought I fixed all of them.
> > > 
> > > Regards,
> > > Christian.
> > > 
> > > > ---
> > > >    drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
> > > >    1 file changed, 4 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > index c8ebb757e36b..e25a99bc519d 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
> > > >    		if (bo->mem.bus.is_iomem) {
> > > >    			/* Iomem should not be marked encrypted */
> > > >    			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
> > > > -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > > > +			if (bdev->driver->io_mem_pfn)
> > > > +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > > > +			else
> > > > +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
> > > >    		} else {
> > > >    			page = ttm->pages[page_offset];
> > > >    			if (unlikely(!page && i == 0)) {
> > > _______________________________________________
> > > dri-devel mailing list
> > > dri-devel@lists.freedesktop.org
> > > https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
Christian König Nov. 29, 2017, 3:59 p.m. UTC | #6
Am 29.11.2017 um 16:44 schrieb Sean Paul:
> On Wed, Nov 29, 2017 at 04:40:18PM +0100, Christian König wrote:
>> Am 29.11.2017 um 16:36 schrieb Sean Paul:
>>> On Wed, Nov 29, 2017 at 04:24:21PM +0100, Christian König wrote:
>>>> Am 29.11.2017 um 16:20 schrieb Michal Srb:
>>>>> The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
>>>>> and is called unconditionally. However, not all drivers were updated to set it.
>>>>>
>>>>> Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
>>>>>
>>>>> Signed-off-by: Michal Srb <msrb@suse.com>
>>>> NAK, when we have drivers missing this we should set this in the driver and
>>>> not add the workaround here.
>>> Why? What's the benefit in adding the same hook in 10 drivers (I was hoping
>>> Michal would also remove the token .io_mem_pfn = ttm_bo_default_io_mem_pfn from
>>> those as well)?
>> Not have this extra check in common TTM code? That is seriously bad coding
>> style.
>>
> [citation neeeded]
>
> I'd argue it's bad form to require everyone add a copypasta hook to their driver
> everytime an unrelated driver needs more control than the default gives :-)

Well that is another design problem of TTM that it works like a middle 
layer instead of a tool. But I'm seriously not going to fix this anytime 
soon.

> I think your point would hold if we were talking about a couple of drivers, but
> once you scale to 10+, it's no longer a trivial amount of code. If the null check
> is too distracting, you could always pull it out into an inline.
Yeah, that is one possibility that would work for me as well.

TTM has patterns like the following:

First occasion:
if (a_is_available)
     do_a();
else
     do_b();

Same code a bit lower:
if (a_is_available)
     do_a()
/* Else is missing here */

I'm seriously favoring updating a dozen drivers just to avoid more of this.

If you want to fix that with adding wrapper functions to call the driver 
callback and give a consistent operation when the callback isn't 
available then I'm perfectly fine with that as well. Patches are always 
welcome.

Christian.

>
> Sean
>
>
>> We have tons of fallbacks like this and I unfortunately even created new one
>> without realizing that this is a problem.
>>
>> But this really clutters the TTM code and makes it harder to understand.
>>
>> Christian.
>>
>>> Sean
>>>
>>>> Which driver is missing this? I thought I fixed all of them.
>>>>
>>>> Regards,
>>>> Christian.
>>>>
>>>>> ---
>>>>>     drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
>>>>>     1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>>>> index c8ebb757e36b..e25a99bc519d 100644
>>>>> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>>>> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
>>>>> @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
>>>>>     		if (bo->mem.bus.is_iomem) {
>>>>>     			/* Iomem should not be marked encrypted */
>>>>>     			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
>>>>> -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
>>>>> +			if (bdev->driver->io_mem_pfn)
>>>>> +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
>>>>> +			else
>>>>> +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
>>>>>     		} else {
>>>>>     			page = ttm->pages[page_offset];
>>>>>     			if (unlikely(!page && i == 0)) {
>>>> _______________________________________________
>>>> dri-devel mailing list
>>>> dri-devel@lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
Sean Paul Nov. 29, 2017, 4:13 p.m. UTC | #7
On Wed, Nov 29, 2017 at 04:59:29PM +0100, Christian König wrote:
> Am 29.11.2017 um 16:44 schrieb Sean Paul:
> > On Wed, Nov 29, 2017 at 04:40:18PM +0100, Christian König wrote:
> > > Am 29.11.2017 um 16:36 schrieb Sean Paul:
> > > > On Wed, Nov 29, 2017 at 04:24:21PM +0100, Christian König wrote:
> > > > > Am 29.11.2017 um 16:20 schrieb Michal Srb:
> > > > > > The io_mem_pfn field was added in commit ea642c3216cb2a60d1c0e760ae47ee85c9c16447
> > > > > > and is called unconditionally. However, not all drivers were updated to set it.
> > > > > > 
> > > > > > Use the ttm_bo_default_io_mem_pfn function if a driver did not set its own.
> > > > > > 
> > > > > > Signed-off-by: Michal Srb <msrb@suse.com>
> > > > > NAK, when we have drivers missing this we should set this in the driver and
> > > > > not add the workaround here.
> > > > Why? What's the benefit in adding the same hook in 10 drivers (I was hoping
> > > > Michal would also remove the token .io_mem_pfn = ttm_bo_default_io_mem_pfn from
> > > > those as well)?
> > > Not have this extra check in common TTM code? That is seriously bad coding
> > > style.
> > > 
> > [citation neeeded]
> > 
> > I'd argue it's bad form to require everyone add a copypasta hook to their driver
> > everytime an unrelated driver needs more control than the default gives :-)
> 
> Well that is another design problem of TTM that it works like a middle layer
> instead of a tool. But I'm seriously not going to fix this anytime soon.
> 
> > I think your point would hold if we were talking about a couple of drivers, but
> > once you scale to 10+, it's no longer a trivial amount of code. If the null check
> > is too distracting, you could always pull it out into an inline.
> Yeah, that is one possibility that would work for me as well.
> 
> TTM has patterns like the following:
> 
> First occasion:
> if (a_is_available)
>     do_a();
> else
>     do_b();
> 
> Same code a bit lower:
> if (a_is_available)
>     do_a()
> /* Else is missing here */
> 
> I'm seriously favoring updating a dozen drivers just to avoid more of this.
> 
> If you want to fix that with adding wrapper functions to call the driver
> callback and give a consistent operation when the callback isn't available
> then I'm perfectly fine with that as well. Patches are always welcome.

Yeah, that's what I was asking Michal for. I'd like a patch series where:

[0/N] adds the inline to call the default if io_mem_pfn is NULL
[1..N-1/N] remove all .io_mem_pfn = ttm_bo_default_io_mem_pfn from drivers
[N/N] unexport ttm_bo_default_io_mem_pfn and make it static

Sean


> 
> Christian.
> 
> > 
> > Sean
> > 
> > 
> > > We have tons of fallbacks like this and I unfortunately even created new one
> > > without realizing that this is a problem.
> > > 
> > > But this really clutters the TTM code and makes it harder to understand.
> > > 
> > > Christian.
> > > 
> > > > Sean
> > > > 
> > > > > Which driver is missing this? I thought I fixed all of them.
> > > > > 
> > > > > Regards,
> > > > > Christian.
> > > > > 
> > > > > > ---
> > > > > >     drivers/gpu/drm/ttm/ttm_bo_vm.c | 5 ++++-
> > > > > >     1 file changed, 4 insertions(+), 1 deletion(-)
> > > > > > 
> > > > > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > > > index c8ebb757e36b..e25a99bc519d 100644
> > > > > > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > > > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> > > > > > @@ -234,7 +234,10 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
> > > > > >     		if (bo->mem.bus.is_iomem) {
> > > > > >     			/* Iomem should not be marked encrypted */
> > > > > >     			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
> > > > > > -			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > > > > > +			if (bdev->driver->io_mem_pfn)
> > > > > > +				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
> > > > > > +			else
> > > > > > +				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
> > > > > >     		} else {
> > > > > >     			page = ttm->pages[page_offset];
> > > > > >     			if (unlikely(!page && i == 0)) {
> > > > > _______________________________________________
> > > > > dri-devel mailing list
> > > > > dri-devel@lists.freedesktop.org
> > > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index c8ebb757e36b..e25a99bc519d 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -234,7 +234,10 @@  static int ttm_bo_vm_fault(struct vm_fault *vmf)
 		if (bo->mem.bus.is_iomem) {
 			/* Iomem should not be marked encrypted */
 			cvma.vm_page_prot = pgprot_decrypted(cvma.vm_page_prot);
-			pfn = bdev->driver->io_mem_pfn(bo, page_offset);
+			if (bdev->driver->io_mem_pfn)
+				pfn = bdev->driver->io_mem_pfn(bo, page_offset);
+			else
+				pfn = ttm_bo_default_io_mem_pfn(bo, page_offset);
 		} else {
 			page = ttm->pages[page_offset];
 			if (unlikely(!page && i == 0)) {