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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).