From: j.glisse@gmail.com
To: dri-devel@lists.freedesktop.org
Cc: "Jerome Glisse" <jglisse@redhat.com>,
"Christian König" <deathsimple@vodafone.de>
Subject: [PATCH 10/27] drm/radeon: sa allocator add wakequeue
Date: Tue, 1 May 2012 13:19:20 -0400 [thread overview]
Message-ID: <1335892777-7357-11-git-send-email-j.glisse@gmail.com> (raw)
In-Reply-To: <1335892777-7357-1-git-send-email-j.glisse@gmail.com>
From: Jerome Glisse <jglisse@redhat.com>
wakequeue is use in case we want to wait until we got something
that allow to allocate the object.
Signed-off-by: Christian König <deathsimple@vodafone.de>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
---
drivers/gpu/drm/radeon/radeon.h | 1 +
drivers/gpu/drm/radeon/radeon_gart.c | 2 +-
drivers/gpu/drm/radeon/radeon_object.h | 2 +-
drivers/gpu/drm/radeon/radeon_ring.c | 6 +++++-
drivers/gpu/drm/radeon/radeon_sa.c | 32 ++++++++++++++++++++++++++++++--
5 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index ad12ef8..8a6dd46 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -382,6 +382,7 @@ struct radeon_bo_list {
*/
struct radeon_sa_manager {
struct mutex mutex;
+ wait_queue_head_t queue;
struct radeon_bo *bo;
struct list_head sa_bo;
unsigned size;
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index c58a036..7af4ff9 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -395,7 +395,7 @@ int radeon_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm)
retry:
r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager, &vm->sa_bo,
RADEON_GPU_PAGE_ALIGN(vm->last_pfn * 8),
- RADEON_GPU_PAGE_SIZE);
+ RADEON_GPU_PAGE_SIZE, false);
if (r) {
if (list_empty(&rdev->vm_manager.lru_vm)) {
return r;
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index d9b9333..85f33d9 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -158,7 +158,7 @@ extern int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
extern int radeon_sa_bo_new(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager,
struct radeon_sa_bo *sa_bo,
- unsigned size, unsigned align);
+ unsigned size, unsigned align, bool block);
extern void radeon_sa_bo_free(struct radeon_device *rdev,
struct radeon_sa_bo *sa_bo);
#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 1d9bce9..f8ecb3e 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -124,7 +124,7 @@ retry:
if (rdev->ib_pool.ibs[idx].fence == NULL) {
r = radeon_sa_bo_new(rdev, &rdev->ib_pool.sa_manager,
&rdev->ib_pool.ibs[idx].sa_bo,
- size, 256);
+ size, 256, false);
if (!r) {
*ib = &rdev->ib_pool.ibs[idx];
(*ib)->ptr = rdev->ib_pool.sa_manager.cpu_ptr;
@@ -222,6 +222,10 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
return 0;
}
+ /* copy over the sa_manager we have to do this to silence
+ * kernel possible deadlock detection code to complain about
+ * a false positive
+ */
rdev->ib_pool.sa_manager = tmp;
INIT_LIST_HEAD(&rdev->ib_pool.sa_manager.sa_bo);
for (i = 0; i < RADEON_IB_POOL_SIZE; i++) {
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index 8c0b3e6..f7b20b1 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -38,6 +38,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
int r;
mutex_init(&sa_manager->mutex);
+ init_waitqueue_head(&sa_manager->queue);
sa_manager->bo = NULL;
sa_manager->size = size;
sa_manager->shole_size = 0;
@@ -61,6 +62,8 @@ void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
{
struct radeon_sa_bo *sa_bo, *tmp;
+ wake_up_all(&sa_manager->queue);
+ mutex_lock(&sa_manager->mutex);
if (!list_empty(&sa_manager->sa_bo)) {
dev_err(rdev->dev, "sa_manager is not empty, clearing anyway\n");
}
@@ -69,6 +72,7 @@ void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
}
radeon_bo_unref(&sa_manager->bo);
sa_manager->size = 0;
+ mutex_unlock(&sa_manager->mutex);
}
int radeon_sa_bo_manager_start(struct radeon_device *rdev,
@@ -117,6 +121,17 @@ int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
return r;
}
+static inline unsigned radeon_sa_bo_max_free(struct radeon_sa_manager *m,
+ unsigned align)
+{
+ unsigned start, end, wasted;
+
+ wasted = (align - (sa_manager->ehole_offset % align)) % align;
+ end = wasted > sa_manager->ehole_size ? 0 : sa_manager->ehole_size - wasted;
+ start = sa_manager->shole_size;
+ return start < end ? end : start;
+}
+
/*
* Principe is simple, we keep a list of sub allocation in offset
* order (first entry has offset == 0, last entry has the highest
@@ -135,13 +150,14 @@ int radeon_sa_bo_manager_suspend(struct radeon_device *rdev,
int radeon_sa_bo_new(struct radeon_device *rdev,
struct radeon_sa_manager *sa_manager,
struct radeon_sa_bo *sa_bo,
- unsigned size, unsigned align)
+ unsigned size, unsigned align, bool block)
{
unsigned offset = 0, wasted = 0;
BUG_ON(align > RADEON_GPU_PAGE_SIZE);
BUG_ON(size > sa_manager->size);
+retry:
mutex_lock(&sa_manager->mutex);
wasted = (align - (sa_manager->ehole_offset % align)) % align;
@@ -161,8 +177,20 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
offset = 0;
goto out;
}
-
mutex_unlock(&sa_manager->mutex);
+
+ if (block) {
+ /* failed to find something big enough, wait
+ * for the biggest hole to increase in size
+ */
+ r = wait_event_interruptible(sa_manager->queue,
+ radeon_sa_bo_max_free(sa_manager, align) >= size);
+ if (r) {
+ return r;
+ }
+ goto retry;
+ }
+
return -ENOMEM;
out:
--
1.7.7.6
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2012-05-01 17:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <·>
2012-05-01 17:19 ` Include request for reset-rework branch v2 j.glisse
2012-05-01 17:19 ` [PATCH 01/27] drm/radeon: make radeon_gpu_is_lockup a per ring function j.glisse
2012-05-01 17:19 ` [PATCH 02/27] drm/radeon: replace gpu_lockup with ring->ready flag j.glisse
2012-05-01 17:19 ` [PATCH 03/27] drm/radeon: register ring debugfs handlers on init j.glisse
2012-05-01 17:19 ` [PATCH 04/27] drm/radeon: use central function for IB testing j.glisse
2012-05-01 17:19 ` [PATCH 05/27] drm/radeon: rework gpu lockup detection and processing j.glisse
2012-05-01 17:19 ` [PATCH 06/27] drm/radeon: fix a bug in the SA code j.glisse
2012-05-01 17:19 ` [PATCH 07/27] drm/radeon: add proper locking to the SA v3 j.glisse
2012-05-02 8:21 ` Christian König
2012-05-01 17:19 ` [PATCH 08/27] drm/radeon: add sub allocator debugfs file v2 j.glisse
2012-05-01 17:19 ` [PATCH 09/27] drm/radeon: improve sa allocator j.glisse
2012-05-01 17:19 ` j.glisse [this message]
2012-05-01 17:19 ` [PATCH 11/27] drm/radeon: use inline functions to calc sa_bo addr j.glisse
2012-05-01 17:19 ` [PATCH 12/27] drm/radeon: simplify semaphore handling j.glisse
2012-05-01 17:19 ` [PATCH 13/27] drm/radeon: return -ENOENT in fence_wait_next v2 j.glisse
2012-05-01 17:19 ` [PATCH 14/27] drm/radeon: rename fence_wait_last to fence_wait_empty j.glisse
2012-05-01 17:19 ` [PATCH 15/27] drm/radeon: add general purpose fence signaled callback j.glisse
2012-05-01 17:19 ` [PATCH 16/27] drm/radeon: don't keep list of created fences j.glisse
2012-05-01 17:19 ` [PATCH 17/27] drm/radeon: add try_free callback to the SA v2 j.glisse
2012-05-01 17:19 ` [PATCH 18/27] drm/radeon: rip out the ib pool v3 j.glisse
2012-05-01 17:19 ` [PATCH 19/27] drm/radeon: fix a bug with the ring syncing code j.glisse
2012-05-01 17:19 ` [PATCH 20/27] drm/radeon: rework recursive gpu reset handling j.glisse
2012-05-01 17:19 ` [PATCH 21/27] drm/radeon: remove recursive mutex implementation j.glisse
2012-05-01 17:19 ` [PATCH 22/27] drm/radeon: move lockup detection code into radeon_ring.c j.glisse
2012-05-01 17:19 ` [PATCH 23/27] drm/radeon: make lockup timeout a module param j.glisse
2012-05-01 17:19 ` [PATCH 24/27] drm/radeon: unlock the ring mutex while waiting for the next fence j.glisse
2012-05-01 17:19 ` [PATCH 25/27] drm/radeon: make forcing ring activity a common function j.glisse
2012-05-01 17:19 ` [PATCH 26/27] drm/radeon: remove r300_gpu_is_lockup j.glisse
2012-05-01 17:19 ` [PATCH 27/27] drm/radeon: remove cayman_gpu_is_lockup j.glisse
2012-05-01 17:28 ` Include request for reset-rework branch v2 Jerome Glisse
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=1335892777-7357-11-git-send-email-j.glisse@gmail.com \
--to=j.glisse@gmail.com \
--cc=deathsimple@vodafone.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=jglisse@redhat.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.