From: "Burakov, Anatoly" <anatoly.burakov@intel.com>
To: Maxime Coquelin <maxime.coquelin@redhat.com>, dev@dpdk.org
Cc: Hemant Agrawal <hemant.agrawal@nxp.com>,
Shreyansh Jain <shreyansh.jain@nxp.com>
Subject: Re: [dpdk-dev] [PATCH 18.05-RC3] mem: add argument to mem event callbacks
Date: Thu, 3 May 2018 09:10:52 +0100 [thread overview]
Message-ID: <45cee0e8-2d5c-46b0-ab71-c237fc6231b4@intel.com> (raw)
In-Reply-To: <8c9c700f-3b2a-b416-e117-ba9d50e1425f@redhat.com>
On 03-May-18 8:51 AM, Maxime Coquelin wrote:
> Hi Anatoly,
>
> On 05/03/2018 09:47 AM, Anatoly Burakov wrote:
>> It may be useful to pass arbitrary data to the callback (such
>> as device pointers), so add this to the mem event callback API.
>>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
>> Suggested-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>> ---
>> drivers/bus/fslmc/fslmc_vfio.c | 5 +++--
>> lib/librte_eal/common/eal_common_memalloc.c | 26
>> +++++++++++++++-----------
>> lib/librte_eal/common/eal_common_memory.c | 9 +++++----
>> lib/librte_eal/common/eal_memalloc.h | 4 ++--
>> lib/librte_eal/common/include/rte_memory.h | 13 ++++++++++---
>> lib/librte_eal/linuxapp/eal/eal_vfio.c | 8 +++++---
>> 6 files changed, 40 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/bus/fslmc/fslmc_vfio.c
>> b/drivers/bus/fslmc/fslmc_vfio.c
>> index 749d92d..56c36a0 100644
>> --- a/drivers/bus/fslmc/fslmc_vfio.c
>> +++ b/drivers/bus/fslmc/fslmc_vfio.c
>> @@ -194,7 +194,8 @@ static int fslmc_map_dma(uint64_t vaddr,
>> rte_iova_t iovaddr, size_t len);
>> static int fslmc_unmap_dma(uint64_t vaddr, rte_iova_t iovaddr,
>> size_t len);
>> static void
>> -fslmc_memevent_cb(enum rte_mem_event type, const void *addr, size_t len)
>> +fslmc_memevent_cb(enum rte_mem_event type, const void *addr, size_t len,
>> + void *arg __rte_unused)
>> {
>> struct rte_memseg_list *msl;
>> struct rte_memseg *ms;
>> @@ -347,7 +348,7 @@ int rte_fslmc_vfio_dmamap(void)
>> }
>> ret = rte_mem_event_callback_register("fslmc_memevent_clb",
>> - fslmc_memevent_cb);
>> + fslmc_memevent_cb, NULL);
>> if (ret && rte_errno == ENOTSUP)
>> DPAA2_BUS_DEBUG("Memory event callbacks not supported");
>> else if (ret)
>> diff --git a/lib/librte_eal/common/eal_common_memalloc.c
>> b/lib/librte_eal/common/eal_common_memalloc.c
>> index e983688..3005ef9 100644
>> --- a/lib/librte_eal/common/eal_common_memalloc.c
>> +++ b/lib/librte_eal/common/eal_common_memalloc.c
>> @@ -21,6 +21,7 @@ struct mem_event_callback_entry {
>> TAILQ_ENTRY(mem_event_callback_entry) next;
>> char name[RTE_MEM_EVENT_CALLBACK_NAME_LEN];
>> rte_mem_event_callback_t clb;
>> + void *arg;
>> };
>> struct mem_alloc_validator_entry {
>> @@ -44,12 +45,12 @@ static struct mem_alloc_validator_entry_list
>> mem_alloc_validator_list =
>> static rte_rwlock_t mem_alloc_validator_rwlock =
>> RTE_RWLOCK_INITIALIZER;
>> static struct mem_event_callback_entry *
>> -find_mem_event_callback(const char *name)
>> +find_mem_event_callback(const char *name, void *arg)
>> {
>> struct mem_event_callback_entry *r;
>> TAILQ_FOREACH(r, &mem_event_callback_list, next) {
>> - if (!strcmp(r->name, name))
>> + if (!strcmp(r->name, name) && r->arg == arg)
>> break;
>> }
>> return r;
>> @@ -146,7 +147,7 @@ eal_memalloc_is_contig(const struct
>> rte_memseg_list *msl, void *start,
>> int
>> eal_memalloc_mem_event_callback_register(const char *name,
>> - rte_mem_event_callback_t clb)
>> + rte_mem_event_callback_t clb, void *arg)
>> {
>> struct mem_event_callback_entry *entry;
>> int ret, len;
>> @@ -164,7 +165,7 @@ eal_memalloc_mem_event_callback_register(const
>> char *name,
>> }
>> rte_rwlock_write_lock(&mem_event_rwlock);
>> - entry = find_mem_event_callback(name);
>> + entry = find_mem_event_callback(name, arg);
>> if (entry != NULL) {
>> rte_errno = EEXIST;
>> ret = -1;
>> @@ -180,12 +181,14 @@ eal_memalloc_mem_event_callback_register(const
>> char *name,
>> /* callback successfully created and is valid, add it to the
>> list */
>> entry->clb = clb;
>> + entry->arg = arg;
>> strlcpy(entry->name, name, RTE_MEM_EVENT_CALLBACK_NAME_LEN);
>> TAILQ_INSERT_TAIL(&mem_event_callback_list, entry, next);
>> ret = 0;
>> - RTE_LOG(DEBUG, EAL, "Mem event callback '%s' registered\n", name);
>> + RTE_LOG(DEBUG, EAL, "Mem event callback '%s:%p' registered\n",
>> + name, arg);
>> unlock:
>> rte_rwlock_write_unlock(&mem_event_rwlock);
>> @@ -193,7 +196,7 @@ eal_memalloc_mem_event_callback_register(const
>> char *name,
>> }
>> int
>> -eal_memalloc_mem_event_callback_unregister(const char *name)
>> +eal_memalloc_mem_event_callback_unregister(const char *name, void *arg)
>> {
>> struct mem_event_callback_entry *entry;
>> int ret, len;
>> @@ -212,7 +215,7 @@ eal_memalloc_mem_event_callback_unregister(const
>> char *name)
>> }
>> rte_rwlock_write_lock(&mem_event_rwlock);
>> - entry = find_mem_event_callback(name);
>> + entry = find_mem_event_callback(name, arg);
>> if (entry == NULL) {
>> rte_errno = ENOENT;
>> ret = -1;
>> @@ -223,7 +226,8 @@ eal_memalloc_mem_event_callback_unregister(const
>> char *name)
>> ret = 0;
>> - RTE_LOG(DEBUG, EAL, "Mem event callback '%s' unregistered\n", name);
>> + RTE_LOG(DEBUG, EAL, "Mem event callback '%s:%p' unregistered\n",
>> + name, arg);
>> unlock:
>> rte_rwlock_write_unlock(&mem_event_rwlock);
>> @@ -239,9 +243,9 @@ eal_memalloc_mem_event_notify(enum rte_mem_event
>> event, const void *start,
>> rte_rwlock_read_lock(&mem_event_rwlock);
>> TAILQ_FOREACH(entry, &mem_event_callback_list, next) {
>> - RTE_LOG(DEBUG, EAL, "Calling mem event callback %s",
>> - entry->name);
>> - entry->clb(event, start, len);
>> + RTE_LOG(DEBUG, EAL, "Calling mem event callback '%s:%p'",
>> + entry->name, entry->arg);
>> + entry->clb(event, start, len, entry->arg);
>> }
>> rte_rwlock_read_unlock(&mem_event_rwlock);
>> diff --git a/lib/librte_eal/common/eal_common_memory.c
>> b/lib/librte_eal/common/eal_common_memory.c
>> index 4c943b0..f080132 100644
>> --- a/lib/librte_eal/common/eal_common_memory.c
>> +++ b/lib/librte_eal/common/eal_common_memory.c
>> @@ -661,7 +661,8 @@ dump_memseg(const struct rte_memseg_list *msl,
>> const struct rte_memseg *ms,
>> * is in eal_common_memalloc.c, like all other memalloc internals.
>> */
>> int __rte_experimental
>> -rte_mem_event_callback_register(const char *name,
>> rte_mem_event_callback_t clb)
>> +rte_mem_event_callback_register(const char *name,
>> rte_mem_event_callback_t clb,
>> + void *arg)
>> {
>> /* FreeBSD boots with legacy mem enabled by default */
>> if (internal_config.legacy_mem) {
>> @@ -669,11 +670,11 @@ rte_mem_event_callback_register(const char
>> *name, rte_mem_event_callback_t clb)
>> rte_errno = ENOTSUP;
>> return -1;
>> }
>> - return eal_memalloc_mem_event_callback_register(name, clb);
>> + return eal_memalloc_mem_event_callback_register(name, clb, arg);
>> }
>> int __rte_experimental
>> -rte_mem_event_callback_unregister(const char *name)
>> +rte_mem_event_callback_unregister(const char *name, void *arg)
>> {
>> /* FreeBSD boots with legacy mem enabled by default */
>> if (internal_config.legacy_mem) {
>> @@ -681,7 +682,7 @@ rte_mem_event_callback_unregister(const char *name)
>> rte_errno = ENOTSUP;
>> return -1;
>> }
>> - return eal_memalloc_mem_event_callback_unregister(name);
>> + return eal_memalloc_mem_event_callback_unregister(name, arg);
>> }
>> int __rte_experimental
>> diff --git a/lib/librte_eal/common/eal_memalloc.h
>> b/lib/librte_eal/common/eal_memalloc.h
>> index 662b3b5..36bb1a0 100644
>> --- a/lib/librte_eal/common/eal_memalloc.h
>> +++ b/lib/librte_eal/common/eal_memalloc.h
>> @@ -57,10 +57,10 @@ eal_memalloc_sync_with_primary(void);
>> int
>> eal_memalloc_mem_event_callback_register(const char *name,
>> - rte_mem_event_callback_t clb);
>> + rte_mem_event_callback_t clb, void *arg);
>> int
>> -eal_memalloc_mem_event_callback_unregister(const char *name);
>> +eal_memalloc_mem_event_callback_unregister(const char *name, void *arg);
>> void
>> eal_memalloc_mem_event_notify(enum rte_mem_event event, const void
>> *start,
>> diff --git a/lib/librte_eal/common/include/rte_memory.h
>> b/lib/librte_eal/common/include/rte_memory.h
>> index 1e35cb2..857773c 100644
>> --- a/lib/librte_eal/common/include/rte_memory.h
>> +++ b/lib/librte_eal/common/include/rte_memory.h
>> @@ -330,7 +330,7 @@ enum rte_mem_event {
>> * Function typedef used to register callbacks for memory events.
>> */
>> typedef void (*rte_mem_event_callback_t)(enum rte_mem_event event_type,
>> - const void *addr, size_t len);
>> + const void *addr, size_t len, void *arg);
>> /**
>> * Function used to register callbacks for memory events.
>> @@ -345,13 +345,17 @@ typedef void (*rte_mem_event_callback_t)(enum
>> rte_mem_event event_type,
>> * @param clb
>> * Callback function pointer.
>> *
>> + * @param arg
>> + * Argument to pass to the callback.
>> + *
>> * @return
>> * 0 on successful callback register
>> * -1 on unsuccessful callback register, with rte_errno value
>> indicating
>> * reason for failure.
>> */
>> int __rte_experimental
>> -rte_mem_event_callback_register(const char *name,
>> rte_mem_event_callback_t clb);
>> +rte_mem_event_callback_register(const char *name,
>> rte_mem_event_callback_t clb,
>> + void *arg);
>> /**
>> * Function used to unregister callbacks for memory events.
>> @@ -359,13 +363,16 @@ rte_mem_event_callback_register(const char
>> *name, rte_mem_event_callback_t clb);
>> * @param name
>> * Name associated with specified callback to be removed from the
>> list.
>> *
>> + * @param arg
>> + * Argument to look for among callbacks with specified callback name.
>> + *
>> * @return
>> * 0 on successful callback unregister
>> * -1 on unsuccessful callback unregister, with rte_errno value
>> indicating
>> * reason for failure.
>> */
>> int __rte_experimental
>> -rte_mem_event_callback_unregister(const char *name);
>> +rte_mem_event_callback_unregister(const char *name, void *arg);
>> #define RTE_MEM_ALLOC_VALIDATOR_NAME_LEN 64
>> diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c
>> b/lib/librte_eal/linuxapp/eal/eal_vfio.c
>> index 7afa33d..db2a111 100644
>> --- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
>> +++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
>> @@ -535,7 +535,8 @@ vfio_group_device_count(int vfio_group_fd)
>> }
>> static void
>> -vfio_mem_event_callback(enum rte_mem_event type, const void *addr,
>> size_t len)
>> +vfio_mem_event_callback(enum rte_mem_event type, const void *addr,
>> size_t len,
>> + void *arg)
>
> You need to tag arg as unused:
> lib/librte_eal/linuxapp/eal/eal_vfio.c: In function
> ‘vfio_mem_event_callback’:
> lib/librte_eal/linuxapp/eal/eal_vfio.c:539:9: error: unused parameter
> ‘arg’ [-Werror=unused-parameter]
> void *arg)
> ^~~
>
Yep, thanks!
> Thanks,
> Maxime
>> {
>> struct rte_memseg_list *msl;
>> struct rte_memseg *ms;
>> @@ -780,7 +781,7 @@ rte_vfio_setup_device(const char *sysfs_base,
>> const char *dev_addr,
>> if (vfio_cfg == default_vfio_cfg)
>> ret = rte_mem_event_callback_register(
>> VFIO_MEM_EVENT_CLB_NAME,
>> - vfio_mem_event_callback);
>> + vfio_mem_event_callback, NULL);
>> else
>> ret = 0;
>> /* unlock memory hotplug */
>> @@ -908,7 +909,8 @@ rte_vfio_release_device(const char *sysfs_base,
>> const char *dev_addr,
>> * avoid spurious attempts to map/unmap memory from VFIO.
>> */
>> if (vfio_cfg == default_vfio_cfg && vfio_cfg->vfio_active_groups
>> == 0)
>> - rte_mem_event_callback_unregister(VFIO_MEM_EVENT_CLB_NAME);
>> + rte_mem_event_callback_unregister(VFIO_MEM_EVENT_CLB_NAME,
>> + NULL);
>> /* success */
>> ret = 0;
>>
>
--
Thanks,
Anatoly
next prev parent reply other threads:[~2018-05-03 8:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-03 7:47 Anatoly Burakov
2018-05-03 7:51 ` Maxime Coquelin
2018-05-03 8:10 ` Burakov, Anatoly [this message]
2018-05-03 8:28 ` [dpdk-dev] [PATCH 18.05-RC3 v2] " Anatoly Burakov
2018-05-04 7:35 ` Maxime Coquelin
2018-05-08 20:18 ` Thomas Monjalon
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=45cee0e8-2d5c-46b0-ab71-c237fc6231b4@intel.com \
--to=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
--cc=hemant.agrawal@nxp.com \
--cc=maxime.coquelin@redhat.com \
--cc=shreyansh.jain@nxp.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 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).