From: Declan Doherty <declan.doherty@intel.com>
To: "Richardson, Bruce" <bruce.richardson@intel.com>,
Adrien Mazarguil <adrien.mazarguil@6wind.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [PATCH v3 2/4] ethdev: move error checking macros to header
Date: Tue, 10 Nov 2015 10:31:17 +0000 [thread overview]
Message-ID: <5641C775.5050006@intel.com> (raw)
In-Reply-To: <59AF69C657FD0841A61C55336867B5B03598018B@IRSMSX103.ger.corp.intel.com>
On 09/11/15 14:02, Richardson, Bruce wrote:
>
>
>> -----Original Message-----
>> From: Adrien Mazarguil [mailto:adrien.mazarguil@6wind.com]
>> Sent: Monday, November 9, 2015 1:39 PM
>> To: Richardson, Bruce <bruce.richardson@intel.com>
>> Cc: Stephen Hemminger <stephen@networkplumber.org>; Thomas Monjalon
>> <thomas.monjalon@6wind.com>; dev@dpdk.org
>> Subject: Re: [dpdk-dev] [PATCH v3 2/4] ethdev: move error checking macros
>> to header
>>
>> On Fri, Nov 06, 2015 at 05:22:27PM +0000, Bruce Richardson wrote:
>>> On Fri, Nov 06, 2015 at 05:10:07PM +0000, Bruce Richardson wrote:
>>>> On Thu, Nov 05, 2015 at 04:09:18PM +0100, Adrien Mazarguil wrote:
>>>>>
>>>>> I won't argue against this as it's obviously more complex than the
>> original
>>>>> method, however note that users of the RTE_PMD_DEBUG_TRACE() macro
>> do not
>>>>> have to modify their code. They shouldn't care about the
>> implementation.
>>>>>
>>>>> Also note that we can do much cleaner code if we drop the all macros
>>>>> implementation using a (much easier to debug) static inline
>> function,
>>>>> only perhaps with a wrapper macro that provides __LINE__, __func__
>> and
>>>>> __FILE__ as arguments. Nontrival code shouldn't be done in macros
>> anyway.
>>>>>
>>>> Getting something working with __FILE__ and probably __LINE__ would be
>> easy enough
>>>> with a helper macro, but __func__ is not so easy as it's not a
>> preprocessor symbol
>>>> [since the pre-processor has no idea what function you are in].
>>>>
>>>> However, using func, here is the best I've come up with so far. It's
>> not that
>>>> pretty, but it's probably easier to work with than the macro version.
>>>>
>>>> #ifdef RTE_LIBRTE_ETHDEV_DEBUG
>>>> -#define RTE_PMD_DEBUG_TRACE(fmt, args...) \
>>>> - RTE_LOG(ERR, PMD, "%s: " fmt, __func__, ## args)
>>>> +#define RTE_PMD_DEBUG_TRACE(...) \
>>>> + rte_pmd_debug_trace(__func__, __VA_ARGS__)
>>>> +
>>>> +static inline void
>>>> +rte_pmd_debug_trace(const char *func_name, const char *fmt, ...)
>>>> +{
>>>> + static __thread char buffer[128];
>>>> + char *out_buf = buffer;
>>>> + unsigned count;
>>>> + va_list ap;
>>>> +
>>>> + count = snprintf(buffer, sizeof(buffer), "%s: %s", func_name,
>> fmt);
>>>> + if (count >= sizeof(buffer)) { // truncated output
>>>> + char *new_buf = malloc(count + 1);
>>>> + if (new_buf == NULL) // no memory, just print 128
>> chars
>>>> + goto print_buffer;
>>>> + snprintf(new_buf, count + 1, "%s: %s", func_name,
>> fmt);
>>>> + va_start(ap, fmt);
>>>> + rte_vlog(RTE_LOG_ERR, RTE_LOGTYPE_PMD, buffer, ap);
>>>> + va_end(ap);
>>>> + free(new_buf);
>>>> + return;
>>>> + }
>>>> +
>>>> +print_buffer:
>>>> + va_start(ap, fmt);
>>>> + rte_vlog(RTE_LOG_ERR, RTE_LOGTYPE_PMD, out_buf, ap);
>>>> + va_end(ap);
>>>> +}
>>>> #else
>>>> #define RTE_PMD_DEBUG_TRACE(fmt, args...)
>>>> #endif
>>>>
>>>> Comments or improvements?
>>
>> Such a function shouldn't malloc() anything. The entire line should fit on
>> the stack (crashing is fine if it does not, then it's probably a bug). We
>> did something in two passes along these lines in mlx5_defs.h (not pretty
>> but
>> quite useful):
>>
>> /* Allocate a buffer on the stack and fill it with a printf format
>> string. */
>> #define MKSTR(name, ...) \
>> char name[snprintf(NULL, 0, __VA_ARGS__) + 1]; \
>> \
>> snprintf(name, sizeof(name), __VA_ARGS__)
>>
>> Untested but I guess modifying that function accordingly would look like:
>>
>> static inline void
>> rte_pmd_debug_trace(const char *func_name, const char *fmt, ...)
>> {
>> va_list ap;
>> va_start(ap, fmt);
>>
>> static __thread char buffer[vsnprintf(NULL, 0, fmt, ap)];
>>
>> va_end(ap);
>> va_start(ap, fmt);
>> vsnprintf(buffer, sizeof(buffer), fmt, ap);
>> va_end(ap);
>> rte_log(RTE_LOG_ERR, RTE_LOGTYPE_PMD, "%s: %s", func_name,
>> buffer);
>> }
>>
>
> Looks a much better option.
>
> From this, though, I assume then that we are only looking to support the -pedantic flag in conjuction with c99 mode or above. Supporting -pedantic with the pre-gcc-5 versions won't allow that to work though, as variably sized arrays only came in with c99, and were gnu extensions before that.
>
> Regards,
> /Bruce
>
I had made some similar changes in the cryptodev patch set to allow
these macros to be shared between the ethdev and cryptodev, but I wasn't
aware of the -pedantic build issues. I've incorporate the changes from
patch 1 & 2 discussed here into the cryptodev patch set. See patch 2/10
(http://dpdk.org/ml/archives/dev/2015-November/027888.html) for the
implementation of the rte_pmf_debug_trace function. Any comments or
ack's are welcome :)
Declan
next prev parent reply other threads:[~2015-11-10 10:26 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-12 11:28 [PATCH 0/4] ethdev: Add checks for function support in driver Bruce Richardson
2015-06-12 11:28 ` [PATCH 1/4] ethdev: rename macros to have RTE_ETH prefix Bruce Richardson
2015-06-12 11:28 ` [PATCH 2/4] ethdev: move RTE_ETH_FPTR_OR_ERR macros to header Bruce Richardson
2015-06-12 11:28 ` [PATCH 3/4] ethdev: remove duplicated debug functions Bruce Richardson
2015-06-12 11:28 ` [PATCH 4/4] ethdev: check support for rx_queue_count and descriptor_done fns Bruce Richardson
2015-06-12 17:32 ` Roger B. Melton
2015-06-15 10:14 ` Bruce Richardson
2015-07-06 15:11 ` Thomas Monjalon
2015-07-26 20:44 ` Thomas Monjalon
2015-09-09 15:09 ` [PATCH v2 0/4] ethdev: minor cleanup Bruce Richardson
2015-09-09 15:09 ` [PATCH v2 1/4] ethdev: rename macros to have RTE_ETH prefix Bruce Richardson
2015-09-09 15:09 ` [PATCH v2 2/4] ethdev: move error checking macros to header Bruce Richardson
2015-09-09 15:09 ` [PATCH v2 3/4] ethdev: remove duplicated debug functions Bruce Richardson
2015-09-09 15:09 ` [PATCH v2 4/4] ethdev: check driver support for functions Bruce Richardson
2015-09-28 10:23 ` [PATCH v2 0/4] ethdev: minor cleanup Bruce Richardson
2015-11-03 1:11 ` Thomas Monjalon
2015-11-03 10:06 ` Bruce Richardson
2015-11-03 12:00 ` [PATCH v3 " Bruce Richardson
2015-11-03 12:00 ` [PATCH v3 1/4] ethdev: rename macros to have RTE_ETH prefix Bruce Richardson
2015-11-03 12:00 ` [PATCH v3 2/4] ethdev: move error checking macros to header Bruce Richardson
2015-11-04 1:19 ` Thomas Monjalon
2015-11-04 10:24 ` Adrien Mazarguil
2015-11-04 14:10 ` Bruce Richardson
2015-11-04 15:25 ` Adrien Mazarguil
2015-11-04 18:39 ` Stephen Hemminger
2015-11-05 15:09 ` Adrien Mazarguil
2015-11-05 15:17 ` Bruce Richardson
2015-11-06 11:49 ` Bruce Richardson
2015-11-06 17:10 ` Bruce Richardson
2015-11-06 17:22 ` Bruce Richardson
2015-11-09 13:39 ` Adrien Mazarguil
2015-11-09 13:50 ` Adrien Mazarguil
2015-11-09 14:02 ` Richardson, Bruce
2015-11-10 10:31 ` Declan Doherty [this message]
2015-11-10 16:08 ` Adrien Mazarguil
2015-11-10 16:21 ` Richardson, Bruce
2015-11-10 17:12 ` Adrien Mazarguil
2015-11-11 10:51 ` Bruce Richardson
2015-11-03 12:00 ` [PATCH v3 3/4] ethdev: remove duplicated debug functions Bruce Richardson
2015-11-03 12:00 ` [PATCH v3 4/4] ethdev: check driver support for functions Bruce Richardson
2015-11-03 22:00 ` Stephen Hemminger
2015-11-04 14:15 ` Bruce Richardson
2015-11-17 12:21 ` [PATCH v4 0/2] ethdev: debug code cleanup Bruce Richardson
2015-11-17 12:21 ` [PATCH v4 1/2] ethdev: remove duplicated debug functions Bruce Richardson
2015-11-17 12:21 ` [PATCH v4 2/2] ethdev: add sanity checks to functions Bruce Richardson
2015-11-17 15:53 ` Stephen Hemminger
2015-11-24 14:56 ` Bruce Richardson
2015-11-24 15:29 ` Thomas Monjalon
2015-11-24 15:45 ` Bruce Richardson
2015-11-24 15:48 ` Thomas Monjalon
2015-11-24 17:37 ` [PATCH v5 0/2] ethdev: debug code cleanup Bruce Richardson
2015-11-24 17:37 ` [PATCH v5 1/2] ethdev: remove duplicated debug functions Bruce Richardson
2015-11-25 18:14 ` Thomas Monjalon
2015-11-24 17:37 ` [PATCH v5 2/2] ethdev: add sanity checks to functions Bruce Richardson
2015-11-25 18:21 ` [PATCH v5 0/2] ethdev: debug code cleanup Thomas Monjalon
-- strict thread matches above, loose matches on Subject: below --
2015-11-06 11:52 [PATCH v3 2/4] ethdev: move error checking macros to header Bruce Richardson
2015-11-06 12:25 ` Adrien Mazarguil
2015-11-06 14:39 ` Richardson, Bruce
2015-11-06 14:54 ` Adrien Mazarguil
2015-11-06 15:30 ` Richardson, Bruce
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=5641C775.5050006@intel.com \
--to=declan.doherty@intel.com \
--cc=adrien.mazarguil@6wind.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.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.