All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <deathsimple@vodafone.de>
To: Jerome Glisse <j.glisse@gmail.com>
Cc: airlied@redhat.com, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 09/26] drm/radeon: add biggest hole tracking and wakequeue to the sa v3
Date: Tue, 01 May 2012 14:22:51 +0200	[thread overview]
Message-ID: <4F9FD59B.1050404@vodafone.de> (raw)
In-Reply-To: <CAH3drwY_WCfmn8kDEoV07UCGiDp9D=o6ubErKV99_1qUueRJ3g@mail.gmail.com>

On 30.04.2012 17:45, Jerome Glisse wrote:
> On Mon, Apr 30, 2012 at 10:50 AM, Christian König
> <deathsimple@vodafone.de>  wrote:
>> With that in place clients are automatically blocking
>> until their memory request can be handled.
>>
>> v2: block only if the memory request can't be satisfied
>>     in the first try, the first version actually lacked
>>     a night of sleep.
>>
>> v3: make blocking optional, update comments and fix
>>     another bug with biggest hole tracking.
>>
>> Signed-off-by: Christian König<deathsimple@vodafone.de>
> I would say NAK, the idea of SA allocator is to be like ring buffer, a
> ring allocation. All the allocation made through SA are made for
> object that life are ring related, ie once allocated the object is
> scheduled through one of the ring and once the ring is done consuming
> it the object is free. So the idea behind the SA allocator is to make
> it simple we keep track of the highest offset used and the lowest one
> free, we try to find room above the highest and if we don't have
> enough room we try at the begining of the ring (wrap over), idea is
> that in most scenario we don't have to wait because SA is big enough
> and if we have to wait well it's because GPU is full of things to do
> so waiting a bit won't starve the GPU.
Take a closer look, that's exactly what the new code intends to do.

The biggest_hole is tracking the bottom of the ring allocation algorithm:

In (roughly estimated) 97% of all cases it is pointing after the last 
allocation, so new allocations can be directly served.

In 1% of the cases it is pointing to a free block at the end of the 
buffer that isn't big enough to serve the next allocation, in that case 
we just need to make one step to the beginning of the buffer and 
(assuming that allocations are ring like) there should be enough space 
gathered to serve the allocation.

In 1% of the cases a left over allocation will prevent a new 
biggest_hole to gather together at the beginning of the buffer, but that 
is actually unproblematic, cause all that needs to be done is stepping 
over that unreleased chunk of memory.

And well every algorithm has a worst case and here it happens when there 
isn't enough room to server the allocation, in this case we need to do a 
full cycle around all allocations and then optionally wait for the 
biggest_hole to increase in size.

> That being said current code doesn't exactly reflect that, i can't
> remember why. Anyway i would rather make current looks like intented
> as i believe it make allocation easy and fast in usual case. There is
> also a reason why i intended to have several sa manager. Idea is to
> have one SA manager for the VM (because VM might last longer) and one
> for all the ring object (semaphore, ib, ...) because usual case is
> that all ring sync from time to time and the all progress in //.
Yeah, even with your good intentions the current code just turned out to 
be a linear search over all the allocations and that seemed to be not so 
efficient. Also making the code look like it should from the comments 
description was also part of my intentions.

Anyway, I think it's definitely an improvement, but there obviously is 
also still room for new ideas, e.g. we could track how trustworthy the 
biggest_hole is and then early abort allocations that can never succeed. 
Or we could also keep track of the last allocation and on new 
allocations try once to place them directly behind the last allocation 
first, that would give the whole allocator a even more ring like fashion.

And by the way: Having two allocators, one for VM and another for the 
ring like stuff sounds like the right thing to do, since their 
allocations seems to have different live cycles.

Christian.

  reply	other threads:[~2012-05-01 12:22 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-30 14:50 Include request for reset-rework branch Christian König
2012-04-30 14:50 ` [PATCH 01/26] drm/radeon: make radeon_gpu_is_lockup a per ring function Christian König
2012-04-30 14:50 ` [PATCH 02/26] drm/radeon: replace gpu_lockup with ring->ready flag Christian König
2012-04-30 14:50 ` [PATCH 03/26] drm/radeon: register ring debugfs handlers on init Christian König
2012-04-30 14:50 ` [PATCH 04/26] drm/radeon: use central function for IB testing Christian König
2012-04-30 14:50 ` [PATCH 05/26] drm/radeon: rework gpu lockup detection and processing Christian König
2012-04-30 14:50 ` [PATCH 06/26] drm/radeon: fix a bug in the SA code Christian König
2012-04-30 14:50 ` [PATCH 07/26] drm/radeon: add proper locking to the SA v2 Christian König
2012-04-30 15:58   ` Jerome Glisse
2012-05-01 12:31     ` Christian König
2012-04-30 14:50 ` [PATCH 08/26] drm/radeon: add sub allocator debugfs file Christian König
2012-04-30 14:50 ` [PATCH 09/26] drm/radeon: add biggest hole tracking and wakequeue to the sa v3 Christian König
2012-04-30 15:45   ` Jerome Glisse
2012-05-01 12:22     ` Christian König [this message]
2012-05-01 15:24       ` Jerome Glisse
2012-04-30 14:50 ` [PATCH 10/26] drm/radeon: add try_free callback to the SA Christian König
2012-04-30 14:50 ` [PATCH 11/26] drm/radeon: use inline functions to calc sa_bo addr Christian König
2012-04-30 14:50 ` [PATCH 12/26] drm/radeon: simplify semaphore handling Christian König
2012-04-30 14:50 ` [PATCH 13/26] drm/radeon: return -ENOENT in fence_wait_next v2 Christian König
2012-04-30 14:50 ` [PATCH 14/26] drm/radeon: rename fence_wait_last to fence_wait_empty Christian König
2012-04-30 14:50 ` [PATCH 15/26] drm/radeon: add general purpose fence signaled callback Christian König
2012-04-30 14:50 ` [PATCH 16/26] drm/radeon: don't keep list of created fences Christian König
2012-04-30 14:50 ` [PATCH 17/26] drm/radeon: rip out the ib pool v2 Christian König
2012-04-30 14:50 ` [PATCH 18/26] drm/radeon: fix a bug with the ring syncing code Christian König
2012-04-30 14:50 ` [PATCH 19/26] drm/radeon: rework recursive gpu reset handling Christian König
2012-04-30 14:50 ` [PATCH 20/26] drm/radeon: remove recursive mutex implementation Christian König
2012-04-30 14:50 ` [PATCH 21/26] drm/radeon: move lockup detection code into radeon_ring.c Christian König
2012-04-30 14:51 ` [PATCH 22/26] drm/radeon: make lockup timeout a module param Christian König
2012-04-30 14:51 ` [PATCH 23/26] drm/radeon: unlock the ring mutex while waiting for the next fence Christian König
2012-04-30 14:51 ` [PATCH 24/26] drm/radeon: make forcing ring activity a common function Christian König
2012-04-30 14:51 ` [PATCH 25/26] drm/radeon: remove r300_gpu_is_lockup Christian König
2012-04-30 14:51 ` [PATCH 26/26] drm/radeon: remove cayman_gpu_is_lockup Christian König
2012-04-30 15:12 ` Include request for reset-rework branch Jerome Glisse
2012-04-30 15:12   ` Jerome Glisse
2012-04-30 15:37     ` Christian König
2012-04-30 16:26       ` Jerome Glisse
2012-05-01 13:38         ` Christian König
2012-05-01 13:37 ` Alex Deucher
  -- strict thread matches above, loose matches on Subject: below --
2012-04-25 12:46 Reworking of GPU reset logic Christian König
2012-04-25 12:46 ` [PATCH 09/26] drm/radeon: add biggest hole tracking and wakequeue to the sa v3 Christian König

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=4F9FD59B.1050404@vodafone.de \
    --to=deathsimple@vodafone.de \
    --cc=airlied@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=j.glisse@gmail.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.