All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <glisse@freedesktop.org>
To: Dave Airlie <airlied@gmail.com>
Cc: airlied@linux.ie, Jerome Glisse <j.glisse@gmail.com>,
	Luca Barbieri <luca@luca-barbieri.com>,
	dri-devel@lists.sourceforge.net, thellstrom@vmware.com
Subject: Re: [PATCH] drm/ttm: Only try to preserve caching in moves in the same space
Date: Mon, 1 Feb 2010 14:33:17 +0100	[thread overview]
Message-ID: <20100201133317.GH29000@localhost.localdomain> (raw)
In-Reply-To: <21d7e9971001311735q3718ad8dy5298f19175a79a6e@mail.gmail.com>

On Mon, Feb 01, 2010 at 11:35:21AM +1000, Dave Airlie wrote:
> On Thu, Jan 28, 2010 at 7:26 PM, Luca Barbieri <luca@luca-barbieri.com> wrote:
> > Currently TTM tries to preserve the previous caching even for moves
> > between unrelated memory spaces.
> >
> > This results for instance in moves from VRAM to PCIE GART changing
> > system memory to WC state needlessly.
> >
> > This patch changes TTM to only try to preserve caching if moving from
> > system/TT to system/TT.
> >
> > In theory, we should also do that if moving between two device memory
> > spaces that are backend by the same physical memory area.
> > However, I'm not sure how to do that in the current TTM framework and
> > I suspect no card/driver uses memory spaces in that way.
> 
> Thomas or Jerome (since I think placement changes were you), any
> chance of ack or review?
> 
> Dave.
> 

I think i will NACK, the idea to avoid switching to WC is good but i think it
can be achieve with current code by using cleverly the infrastructure.

What happen is that WC is prefered over cached in ttm_tt_set_placement_caching
so to avoid WC taking over cached all you have to do is :
At memory type init you init default caching as :
SYSTEM.default_caching = TTM_PL_MASK_CACHING
if PCI|PCIE
  TT.default_caching = TTM_PL_MASK_CACHED
else
  TT.default_caching = TTM_PL_MASK_UNCACHED
VRAM.default_caching = TTM_PL_FLAG_WC

Now when ever you move a buffer for the proposed placement the flag you
supply for caching are the default_caching of the memory type you want to
use.

So on VRAM->TT (PCIE case) ttm_bo_select_caching get call with :
cur_placement = TTM_PL_FLAG_WC & proposed_placement = TTM_PL_MASK_CACHED
the first if will fail but the second one will pass and so we get:
result = TTM_PL_MASK_CACHED

AGP is special case for the driver, instead of using the default_cahing
from the memory type you are targetting the driver should always ask
for uncached on TT->SYSTEM and VRAM->TT, and WC on SYSTEM|TT->VRAM.
To avoid having if/else you can simply change SYSTEM.default_caching to
UNCACHED for AGP and as before always use default_caching flag of the
type you are moving to in the proposed placement. This way the only
if/else is in driver's ttm initialization.

Radeon is more or less (well more less than more ;)) doing that, i gonna
test with tweaking the default_caching stuff and see how it performs.
Btw maybe we can add a debugfs files to monitor how much page cache flag
transition we are doing.

Cheers,
Jerome

> >
> > Signed-off-by: Luca Barbieri <luca@luca-barbieri.com>
> > ---
> >  drivers/gpu/drm/ttm/ttm_bo.c |   18 ++++++++++++++----
> >  1 files changed, 14 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> > index 2920f9a..27ee1be 100644
> > --- a/drivers/gpu/drm/ttm/ttm_bo.c
> > +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> > @@ -876,6 +876,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> >
> >        mem->mm_node = NULL;
> >        for (i = 0; i < placement->num_placement; ++i) {
> > +               int is_tt_move;
> >                ret = ttm_mem_type_from_flags(placement->placement[i],
> >                                                &mem_type);
> >                if (ret)
> > @@ -891,8 +892,12 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> >                if (!type_ok)
> >                        continue;
> >
> > -               cur_flags = ttm_bo_select_caching(man, bo->mem.placement,
> > -                                                 cur_flags);
> > +               is_tt_move = !(man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
> > +                       !(bdev->man[bo->mem.mem_type].flags & TTM_MEMTYPE_FLAG_FIXED);
> > +
> > +               /* Only try to keep the current flags if we are in the same memory space */
> > +               cur_flags = ttm_bo_select_caching(man, is_tt_move ? bo->mem.placement : 0, cur_flags);
> > +
> >                /*
> >                 * Use the access and other non-mapping-related flag bits from
> >                 * the memory placement flags to the current flags
> > @@ -927,6 +932,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> >                return -EINVAL;
> >
> >        for (i = 0; i < placement->num_busy_placement; ++i) {
> > +               int is_tt_move;
> >                ret = ttm_mem_type_from_flags(placement->busy_placement[i],
> >                                                &mem_type);
> >                if (ret)
> > @@ -941,8 +947,12 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> >                                                &cur_flags))
> >                        continue;
> >
> > -               cur_flags = ttm_bo_select_caching(man, bo->mem.placement,
> > -                                                 cur_flags);
> > +               is_tt_move = !(man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
> > +                       !(bdev->man[bo->mem.mem_type].flags & TTM_MEMTYPE_FLAG_FIXED);
> > +
> > +               /* Only try to keep the current flags if we are in the same memory space */
> > +               cur_flags = ttm_bo_select_caching(man, is_tt_move ? bo->mem.placement : 0, cur_flags);
> > +
> >                /*
> >                 * Use the access and other non-mapping-related flag bits from
> >                 * the memory placement flags to the current flags
> > --
> > 1.6.6.1.476.g01ddb
> >
> >
> > ------------------------------------------------------------------------------
> > The Planet: dedicated and managed hosting, cloud storage, colocation
> > Stay online with enterprise data centers and the best network in the business
> > Choose flexible plans and management services without long-term contracts
> > Personal 24x7 support from experience hosting pros just a phone call away.
> > http://p.sf.net/sfu/theplanet-com
> > --
> > _______________________________________________
> > Dri-devel mailing list
> > Dri-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/dri-devel
> >
> 
> ------------------------------------------------------------------------------
> The Planet: dedicated and managed hosting, cloud storage, colocation
> Stay online with enterprise data centers and the best network in the business
> Choose flexible plans and management services without long-term contracts
> Personal 24x7 support from experience hosting pros just a phone call away.
> http://p.sf.net/sfu/theplanet-com
> --
> _______________________________________________
> Dri-devel mailing list
> Dri-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/dri-devel
> 

------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
--

  reply	other threads:[~2010-02-01 13:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-28  9:26 [PATCH] drm/ttm: Only try to preserve caching in moves in the same space Luca Barbieri
2010-02-01  1:35 ` Dave Airlie
2010-02-01 13:33   ` Jerome Glisse [this message]
2010-02-01 16:18     ` Thomas Hellstrom
2010-02-01 16:26     ` Luca Barbieri
2010-02-01 16:28       ` Luca Barbieri
2010-02-01 17:05       ` Jerome Glisse
2010-02-01 17:46         ` Luca Barbieri
2010-02-01 18:05           ` Jerome Glisse
2010-02-01 18:21             ` Luca Barbieri

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100201133317.GH29000@localhost.localdomain \
    --to=glisse@freedesktop.org \
    --cc=airlied@gmail.com \
    --cc=airlied@linux.ie \
    --cc=dri-devel@lists.sourceforge.net \
    --cc=j.glisse@gmail.com \
    --cc=luca@luca-barbieri.com \
    --cc=thellstrom@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.