From: "Das, Nirmoy" <nirmoy.das@linux.intel.com>
To: Andi Shyti <andi.shyti@linux.intel.com>,
Nirmoy Das <nirmoy.das@intel.com>
Cc: Chris Wilson <chris.p.wilson@intel.com>,
Daniel Vetter <daniel@ffwll.ch>,
intel-gfx@lists.freedesktop.org,
Maxime Ripard <mripard@kernel.org>,
dri-devel@lists.freedesktop.org,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>
Subject: Re: [Intel-gfx] [PATCH 1/2] drm/drm_vma_manager: Add drm_vma_node_allow_once()
Date: Wed, 18 Jan 2023 10:45:19 +0100 [thread overview]
Message-ID: <cfbc4dd5-88d2-9727-ef9d-2434da7c2352@linux.intel.com> (raw)
In-Reply-To: <Y8e+Ab4vmm2jZdVd@ashyti-mobl2.lan>
On 1/18/2023 10:38 AM, Andi Shyti wrote:
> On Tue, Jan 17, 2023 at 06:52:35PM +0100, Nirmoy Das wrote:
>> Currently there is no easy way for a drm driver to safely check and allow
>> drm_vma_offset_node for a drm file just once. Allow drm drivers to call
>> non-refcounted version of drm_vma_node_allow() so that a driver doesn't
>> need to keep track of each drm_vma_node_allow() to call subsequent
>> drm_vma_node_revoke() to prevent memory leak.
>>
>> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> Cc: Maxime Ripard <mripard@kernel.org>
>> Cc: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: David Airlie <airlied@gmail.com>
>> Cc: Daniel Vetter <daniel@ffwll.ch>
>> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>> Cc: Andi Shyti <andi.shyti@linux.intel.com>
>>
> Next time, please, don't leave any spaces between tags.
I will keep that in my mind.
>
>> Suggested-by: Chris Wilson <chris.p.wilson@intel.com>
>> Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Thanks,
Nirmoy
>
> Thanks,
> Andi
>
>> ---
>> drivers/gpu/drm/drm_vma_manager.c | 76 ++++++++++++++++++++++---------
>> include/drm/drm_vma_manager.h | 1 +
>> 2 files changed, 55 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_vma_manager.c b/drivers/gpu/drm/drm_vma_manager.c
>> index 7de37f8c68fd..83229a031af0 100644
>> --- a/drivers/gpu/drm/drm_vma_manager.c
>> +++ b/drivers/gpu/drm/drm_vma_manager.c
>> @@ -240,27 +240,8 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
>> }
>> EXPORT_SYMBOL(drm_vma_offset_remove);
>>
>> -/**
>> - * drm_vma_node_allow - Add open-file to list of allowed users
>> - * @node: Node to modify
>> - * @tag: Tag of file to remove
>> - *
>> - * Add @tag to the list of allowed open-files for this node. If @tag is
>> - * already on this list, the ref-count is incremented.
>> - *
>> - * The list of allowed-users is preserved across drm_vma_offset_add() and
>> - * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> - * not added to any offset-manager.
>> - *
>> - * You must remove all open-files the same number of times as you added them
>> - * before destroying the node. Otherwise, you will leak memory.
>> - *
>> - * This is locked against concurrent access internally.
>> - *
>> - * RETURNS:
>> - * 0 on success, negative error code on internal failure (out-of-mem)
>> - */
>> -int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +static int vma_node_allow(struct drm_vma_offset_node *node,
>> + struct drm_file *tag, bool ref_counted)
>> {
>> struct rb_node **iter;
>> struct rb_node *parent = NULL;
>> @@ -282,7 +263,8 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> entry = rb_entry(*iter, struct drm_vma_offset_file, vm_rb);
>>
>> if (tag == entry->vm_tag) {
>> - entry->vm_count++;
>> + if (ref_counted)
>> + entry->vm_count++;
>> goto unlock;
>> } else if (tag > entry->vm_tag) {
>> iter = &(*iter)->rb_right;
>> @@ -307,8 +289,58 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> kfree(new);
>> return ret;
>> }
>> +
>> +/**
>> + * drm_vma_node_allow - Add open-file to list of allowed users
>> + * @node: Node to modify
>> + * @tag: Tag of file to remove
>> + *
>> + * Add @tag to the list of allowed open-files for this node. If @tag is
>> + * already on this list, the ref-count is incremented.
>> + *
>> + * The list of allowed-users is preserved across drm_vma_offset_add() and
>> + * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> + * not added to any offset-manager.
>> + *
>> + * You must remove all open-files the same number of times as you added them
>> + * before destroying the node. Otherwise, you will leak memory.
>> + *
>> + * This is locked against concurrent access internally.
>> + *
>> + * RETURNS:
>> + * 0 on success, negative error code on internal failure (out-of-mem)
>> + */
>> +int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +{
>> + return vma_node_allow(node, tag, true);
>> +}
>> EXPORT_SYMBOL(drm_vma_node_allow);
>>
>> +/**
>> + * drm_vma_node_allow_once - Add open-file to list of allowed users
>> + * @node: Node to modify
>> + * @tag: Tag of file to remove
>> + *
>> + * Add @tag to the list of allowed open-files for this node.
>> + *
>> + * The list of allowed-users is preserved across drm_vma_offset_add() and
>> + * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> + * not added to any offset-manager.
>> + *
>> + * This is not ref-counted unlike drm_vma_node_allow() hence drm_vma_node_revoke()
>> + * should only be called once after this.
>> + *
>> + * This is locked against concurrent access internally.
>> + *
>> + * RETURNS:
>> + * 0 on success, negative error code on internal failure (out-of-mem)
>> + */
>> +int drm_vma_node_allow_once(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +{
>> + return vma_node_allow(node, tag, false);
>> +}
>> +EXPORT_SYMBOL(drm_vma_node_allow_once);
>> +
>> /**
>> * drm_vma_node_revoke - Remove open-file from list of allowed users
>> * @node: Node to modify
>> diff --git a/include/drm/drm_vma_manager.h b/include/drm/drm_vma_manager.h
>> index 4f8c35206f7c..6c2a2f21dbf0 100644
>> --- a/include/drm/drm_vma_manager.h
>> +++ b/include/drm/drm_vma_manager.h
>> @@ -74,6 +74,7 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
>> struct drm_vma_offset_node *node);
>>
>> int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag);
>> +int drm_vma_node_allow_once(struct drm_vma_offset_node *node, struct drm_file *tag);
>> void drm_vma_node_revoke(struct drm_vma_offset_node *node,
>> struct drm_file *tag);
>> bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node,
>> --
>> 2.39.0
WARNING: multiple messages have this Message-ID (diff)
From: "Das, Nirmoy" <nirmoy.das@linux.intel.com>
To: Andi Shyti <andi.shyti@linux.intel.com>,
Nirmoy Das <nirmoy.das@intel.com>
Cc: Chris Wilson <chris.p.wilson@intel.com>,
intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
Thomas Zimmermann <tzimmermann@suse.de>
Subject: Re: [Intel-gfx] [PATCH 1/2] drm/drm_vma_manager: Add drm_vma_node_allow_once()
Date: Wed, 18 Jan 2023 10:45:19 +0100 [thread overview]
Message-ID: <cfbc4dd5-88d2-9727-ef9d-2434da7c2352@linux.intel.com> (raw)
In-Reply-To: <Y8e+Ab4vmm2jZdVd@ashyti-mobl2.lan>
On 1/18/2023 10:38 AM, Andi Shyti wrote:
> On Tue, Jan 17, 2023 at 06:52:35PM +0100, Nirmoy Das wrote:
>> Currently there is no easy way for a drm driver to safely check and allow
>> drm_vma_offset_node for a drm file just once. Allow drm drivers to call
>> non-refcounted version of drm_vma_node_allow() so that a driver doesn't
>> need to keep track of each drm_vma_node_allow() to call subsequent
>> drm_vma_node_revoke() to prevent memory leak.
>>
>> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> Cc: Maxime Ripard <mripard@kernel.org>
>> Cc: Thomas Zimmermann <tzimmermann@suse.de>
>> Cc: David Airlie <airlied@gmail.com>
>> Cc: Daniel Vetter <daniel@ffwll.ch>
>> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>> Cc: Andi Shyti <andi.shyti@linux.intel.com>
>>
> Next time, please, don't leave any spaces between tags.
I will keep that in my mind.
>
>> Suggested-by: Chris Wilson <chris.p.wilson@intel.com>
>> Signed-off-by: Nirmoy Das <nirmoy.das@intel.com>
> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Thanks,
Nirmoy
>
> Thanks,
> Andi
>
>> ---
>> drivers/gpu/drm/drm_vma_manager.c | 76 ++++++++++++++++++++++---------
>> include/drm/drm_vma_manager.h | 1 +
>> 2 files changed, 55 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_vma_manager.c b/drivers/gpu/drm/drm_vma_manager.c
>> index 7de37f8c68fd..83229a031af0 100644
>> --- a/drivers/gpu/drm/drm_vma_manager.c
>> +++ b/drivers/gpu/drm/drm_vma_manager.c
>> @@ -240,27 +240,8 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
>> }
>> EXPORT_SYMBOL(drm_vma_offset_remove);
>>
>> -/**
>> - * drm_vma_node_allow - Add open-file to list of allowed users
>> - * @node: Node to modify
>> - * @tag: Tag of file to remove
>> - *
>> - * Add @tag to the list of allowed open-files for this node. If @tag is
>> - * already on this list, the ref-count is incremented.
>> - *
>> - * The list of allowed-users is preserved across drm_vma_offset_add() and
>> - * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> - * not added to any offset-manager.
>> - *
>> - * You must remove all open-files the same number of times as you added them
>> - * before destroying the node. Otherwise, you will leak memory.
>> - *
>> - * This is locked against concurrent access internally.
>> - *
>> - * RETURNS:
>> - * 0 on success, negative error code on internal failure (out-of-mem)
>> - */
>> -int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +static int vma_node_allow(struct drm_vma_offset_node *node,
>> + struct drm_file *tag, bool ref_counted)
>> {
>> struct rb_node **iter;
>> struct rb_node *parent = NULL;
>> @@ -282,7 +263,8 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> entry = rb_entry(*iter, struct drm_vma_offset_file, vm_rb);
>>
>> if (tag == entry->vm_tag) {
>> - entry->vm_count++;
>> + if (ref_counted)
>> + entry->vm_count++;
>> goto unlock;
>> } else if (tag > entry->vm_tag) {
>> iter = &(*iter)->rb_right;
>> @@ -307,8 +289,58 @@ int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> kfree(new);
>> return ret;
>> }
>> +
>> +/**
>> + * drm_vma_node_allow - Add open-file to list of allowed users
>> + * @node: Node to modify
>> + * @tag: Tag of file to remove
>> + *
>> + * Add @tag to the list of allowed open-files for this node. If @tag is
>> + * already on this list, the ref-count is incremented.
>> + *
>> + * The list of allowed-users is preserved across drm_vma_offset_add() and
>> + * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> + * not added to any offset-manager.
>> + *
>> + * You must remove all open-files the same number of times as you added them
>> + * before destroying the node. Otherwise, you will leak memory.
>> + *
>> + * This is locked against concurrent access internally.
>> + *
>> + * RETURNS:
>> + * 0 on success, negative error code on internal failure (out-of-mem)
>> + */
>> +int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +{
>> + return vma_node_allow(node, tag, true);
>> +}
>> EXPORT_SYMBOL(drm_vma_node_allow);
>>
>> +/**
>> + * drm_vma_node_allow_once - Add open-file to list of allowed users
>> + * @node: Node to modify
>> + * @tag: Tag of file to remove
>> + *
>> + * Add @tag to the list of allowed open-files for this node.
>> + *
>> + * The list of allowed-users is preserved across drm_vma_offset_add() and
>> + * drm_vma_offset_remove() calls. You may even call it if the node is currently
>> + * not added to any offset-manager.
>> + *
>> + * This is not ref-counted unlike drm_vma_node_allow() hence drm_vma_node_revoke()
>> + * should only be called once after this.
>> + *
>> + * This is locked against concurrent access internally.
>> + *
>> + * RETURNS:
>> + * 0 on success, negative error code on internal failure (out-of-mem)
>> + */
>> +int drm_vma_node_allow_once(struct drm_vma_offset_node *node, struct drm_file *tag)
>> +{
>> + return vma_node_allow(node, tag, false);
>> +}
>> +EXPORT_SYMBOL(drm_vma_node_allow_once);
>> +
>> /**
>> * drm_vma_node_revoke - Remove open-file from list of allowed users
>> * @node: Node to modify
>> diff --git a/include/drm/drm_vma_manager.h b/include/drm/drm_vma_manager.h
>> index 4f8c35206f7c..6c2a2f21dbf0 100644
>> --- a/include/drm/drm_vma_manager.h
>> +++ b/include/drm/drm_vma_manager.h
>> @@ -74,6 +74,7 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
>> struct drm_vma_offset_node *node);
>>
>> int drm_vma_node_allow(struct drm_vma_offset_node *node, struct drm_file *tag);
>> +int drm_vma_node_allow_once(struct drm_vma_offset_node *node, struct drm_file *tag);
>> void drm_vma_node_revoke(struct drm_vma_offset_node *node,
>> struct drm_file *tag);
>> bool drm_vma_node_is_allowed(struct drm_vma_offset_node *node,
>> --
>> 2.39.0
next prev parent reply other threads:[~2023-01-18 9:45 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-17 17:52 [Intel-gfx] [PATCH 1/2] drm/drm_vma_manager: Add drm_vma_node_allow_once() Nirmoy Das
2023-01-17 17:52 ` Nirmoy Das
2023-01-17 17:52 ` [Intel-gfx] [PATCH 2/2] drm/i915: Fix a memory leak with reused mmap_offset Nirmoy Das
2023-01-17 17:52 ` Nirmoy Das
2023-01-18 9:19 ` [Intel-gfx] " Tvrtko Ursulin
2023-01-18 9:19 ` Tvrtko Ursulin
2023-01-18 9:27 ` [Intel-gfx] " Das, Nirmoy
2023-01-18 9:27 ` Das, Nirmoy
2023-01-18 9:40 ` [Intel-gfx] " Andi Shyti
2023-01-18 9:40 ` Andi Shyti
2023-01-18 10:26 ` [Intel-gfx] " Mirsad Todorovac
2023-01-18 10:26 ` Mirsad Todorovac
2023-01-18 10:39 ` [Intel-gfx] " Das, Nirmoy
2023-01-18 10:53 ` Mirsad Todorovac
2023-01-18 22:27 ` Mirsad Goran Todorovac
2023-01-17 21:56 ` [Intel-gfx] ✓ Fi.CI.BAT: success for series starting with [1/2] drm/drm_vma_manager: Add drm_vma_node_allow_once() Patchwork
2023-01-18 9:22 ` [Intel-gfx] [PATCH 1/2] " Tvrtko Ursulin
2023-01-18 9:22 ` Tvrtko Ursulin
2023-01-18 9:38 ` [Intel-gfx] " Andi Shyti
2023-01-18 9:38 ` Andi Shyti
2023-01-18 9:45 ` Das, Nirmoy [this message]
2023-01-18 9:45 ` [Intel-gfx] " Das, Nirmoy
2023-01-18 11:07 ` [Intel-gfx] ✓ Fi.CI.IGT: success for series starting with [1/2] " Patchwork
2023-01-18 13:19 ` [Intel-gfx] [PATCH 1/2] " Tvrtko Ursulin
2023-01-18 13:19 ` Tvrtko Ursulin
2023-01-18 13:34 ` [Intel-gfx] " Tvrtko Ursulin
2023-01-18 13:34 ` Tvrtko Ursulin
2023-01-19 13:25 ` [Intel-gfx] " Maxime Ripard
2023-01-19 13:25 ` Maxime Ripard
2023-01-19 13:27 ` Das, Nirmoy
2023-01-19 13:27 ` Das, Nirmoy
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=cfbc4dd5-88d2-9727-ef9d-2434da7c2352@linux.intel.com \
--to=nirmoy.das@linux.intel.com \
--cc=airlied@gmail.com \
--cc=andi.shyti@linux.intel.com \
--cc=chris.p.wilson@intel.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=mripard@kernel.org \
--cc=nirmoy.das@intel.com \
--cc=tzimmermann@suse.de \
/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.