From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
To: Thomas Hellstrom <thomas@shipmail.org>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 1/3] drm/ttm: add ttm_bo_is_reserved
Date: Tue, 06 Nov 2012 14:48:28 +0100 [thread overview]
Message-ID: <5099152C.1070502@canonical.com> (raw)
In-Reply-To: <5088ED76.7060008@shipmail.org>
Op 25-10-12 09:42, Thomas Hellstrom schreef:
> On 10/12/2012 04:58 PM, Maarten Lankhorst wrote:
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
>> ---
>> drivers/gpu/drm/ttm/ttm_bo.c | 12 ++++++------
>> include/drm/ttm/ttm_bo_api.h | 14 ++++++++++++++
>> 2 files changed, 20 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
>> index be1148e..d9d8541 100644
>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>> @@ -161,9 +161,9 @@ int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible)
>> {
>> if (interruptible) {
>> return wait_event_interruptible(bo->event_queue,
>> - atomic_read(&bo->reserved) == 0);
>> + !ttm_bo_is_reserved(bo));
>> } else {
>> - wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0);
>> + wait_event(bo->event_queue, !ttm_bo_is_reserved(bo));
>> return 0;
>> }
>> }
>> @@ -174,7 +174,7 @@ void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
>> struct ttm_bo_device *bdev = bo->bdev;
>> struct ttm_mem_type_manager *man;
>> - BUG_ON(!atomic_read(&bo->reserved));
>> + BUG_ON(!ttm_bo_is_reserved(bo));
>> if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) {
>> @@ -748,7 +748,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
>> goto out;
>> }
>> - BUG_ON(!atomic_read(&bo->reserved));
>> + BUG_ON(!ttm_bo_is_reserved(bo));
>> evict_mem = bo->mem;
>> evict_mem.mm_node = NULL;
>> @@ -1058,7 +1058,7 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
>> struct ttm_mem_reg mem;
>> struct ttm_bo_device *bdev = bo->bdev;
>> - BUG_ON(!atomic_read(&bo->reserved));
>> + BUG_ON(!ttm_bo_is_reserved(bo));
>> /*
>> * FIXME: It's possible to pipeline buffer moves.
>> @@ -1115,7 +1115,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>> {
>> int ret;
>> - BUG_ON(!atomic_read(&bo->reserved));
>> + BUG_ON(!ttm_bo_is_reserved(bo));
>> /* Check that range is valid */
>> if (placement->lpfn || placement->fpfn)
>> if (placement->fpfn > placement->lpfn ||
>> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
>> index 9654451..1d71f6b 100644
>> --- a/include/drm/ttm/ttm_bo_api.h
>> +++ b/include/drm/ttm/ttm_bo_api.h
>> @@ -705,4 +705,18 @@ extern ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp,
>> extern void ttm_bo_swapout_all(struct ttm_bo_device *bdev);
>> +/**
>> + * ttm_bo_is_reserved - return an indication if a ttm buffer object is reserved
>> + *
>> + * @bo: The buffer object to check.
>> + *
>> + * This function returns an indication if a bo is reserved or not, and should
>> + * only be used to print an error when it is not from incorrect api usage, since
>> + * there's no guarantee that it is the caller that is holding the reservation.
>> + */
>> +static inline bool ttm_bo_is_reserved(struct ttm_buffer_object *bo)
>> +{
>> + return atomic_read(&bo->reserved);
>> +}
>> +
>> #endif
> This looks good, although for clarity we should add in the comments that
> if the caller is holding the reservation, the function is guaranteed to return true.
>
> Otherwise
> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Unless you use lockdep, you can't say with 100% certainty if the CALLER is holding it or not. :-)
But lockdep can actually check if that's the case with lockdep_is_held(&ttm->reservation_lock);
which iterates over all locks held by the current task.
~Maarten
Updated version with a comment about return value in ttm_bo_is_reserved:
drm/ttm: Add ttm_bo_is_reserved function
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 2b3f69b..82e2633 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -162,9 +162,9 @@ int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible)
{
if (interruptible) {
return wait_event_interruptible(bo->event_queue,
- atomic_read(&bo->reserved) == 0);
+ !ttm_bo_is_reserved(bo));
} else {
- wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0);
+ wait_event(bo->event_queue, !ttm_bo_is_reserved(bo));
return 0;
}
}
@@ -175,7 +175,7 @@ void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
struct ttm_bo_device *bdev = bo->bdev;
struct ttm_mem_type_manager *man;
- BUG_ON(!atomic_read(&bo->reserved));
+ BUG_ON(!ttm_bo_is_reserved(bo));
if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) {
@@ -756,7 +756,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
goto out;
}
- BUG_ON(!atomic_read(&bo->reserved));
+ BUG_ON(!ttm_bo_is_reserved(bo));
evict_mem = bo->mem;
evict_mem.mm_node = NULL;
@@ -1063,7 +1063,7 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
struct ttm_mem_reg mem;
struct ttm_bo_device *bdev = bo->bdev;
- BUG_ON(!atomic_read(&bo->reserved));
+ BUG_ON(!ttm_bo_is_reserved(bo));
/*
* FIXME: It's possible to pipeline buffer moves.
@@ -1120,7 +1120,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
{
int ret;
- BUG_ON(!atomic_read(&bo->reserved));
+ BUG_ON(!ttm_bo_is_reserved(bo));
/* Check that range is valid */
if (placement->lpfn || placement->fpfn)
if (placement->fpfn > placement->lpfn ||
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 850424f..7a5b574 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -737,4 +737,20 @@ extern ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp,
extern void ttm_bo_swapout_all(struct ttm_bo_device *bdev);
+/**
+ * ttm_bo_is_reserved - return an indication if a ttm buffer object is reserved
+ *
+ * @bo: The buffer object to check.
+ *
+ * This function returns an indication if a bo is reserved or not, and should
+ * only be used to print an error when it is not from incorrect api usage, since
+ * there's no guarantee that it is the caller that is holding the reservation.
+ *
+ * Returns true if reserved, false if unreserved.
+ */
+static inline bool ttm_bo_is_reserved(struct ttm_buffer_object *bo)
+{
+ return atomic_read(&bo->reserved);
+}
+
#endif
prev parent reply other threads:[~2012-11-06 13:48 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-12 14:58 [PATCH 1/3] drm/ttm: add ttm_bo_is_reserved Maarten Lankhorst
2012-10-25 7:42 ` Thomas Hellstrom
2012-11-06 13:48 ` Maarten Lankhorst [this message]
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=5099152C.1070502@canonical.com \
--to=maarten.lankhorst@canonical.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=thomas@shipmail.org \
/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.