[dpdk-dev] [PATCH 03/15] pmd: Add PMD_REGISTER_DRIVER macro

Neil Horman nhorman at tuxdriver.com
Wed Apr 16 19:29:24 CEST 2014


On Wed, Apr 16, 2014 at 06:11:32PM +0200, Olivier MATZ wrote:
> Hi Neil,
> 
> On 04/16/2014 03:08 PM, Neil Horman wrote:
> >On Wed, Apr 16, 2014 at 01:52:49PM +0200, Thomas Monjalon wrote:
> >>2014-04-15 14:05, Neil Horman:
> >>>Rather than have each driver have to remember to add a constructor to it to
> >>>make sure its gets registered properly, wrap that process up in a macro to
> >>>make registration a one line affair.  This also sets the stage for us to
> >>>make registration of vdev pmds and physical pmds a uniform process
> >>>
> >>>Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
> >>
> >>Could you explain why having a macro is better than an explicit constructor
> >>function?
> >>
> >Because its a one line declaration inside a driver function that points to the
> >structure used to initilze the pmd?  Having to append ((__constructor__)) to
> >each initalization function is both error prone during entry and exposes the
> >possibiilty of developers doing "too much" in their constructor.  It also allows
> >for easy updating to all drivers, if additional boilerplate work needs to be
> >done in the future for all pmds.
> 
> Even if it's not critical, in my opinion, the following code is easier
> to understand:
> 
> 	__attribute__((constructor))
> 	static void
> 	rte_pmd_ring_init(void)
> 	{
> 		rte_eal_dev_driver_register(&pmd_ring_drv);
> 	}
> 
> Than:
> 
> 	PMD_REGISTER_DRIVER(pmd_ring_drv);
> 
> 
> The first version explicitly shows what you are doing: defining a
> static function called at initialization that registers a driver
> structure.
> 
> With the second, we're tempted to check what this macro does...
> 
Ok, so look it up.  DPDK is open source and cscope is easy to use.  A
module initilization macro is a common method for doing init time binding in
modular programming (the best examples are the module_init() and module_exit()
macros in the linux kernel).  It wraps up what you need to do to tie a modular
piece of your software into the larger main component, without having to know
all the boilerplate behind it.

Also, if you expose the use of the constructor, then you've
broken out the initalization phase to every pmd you implement, and as a result,
if you ever need to add code to the initilization step, you have to add it in
every pmd, instead of just updating the macro.


The bottom line is, your method is 5 lines of boilerplate code thats going to
have to get repeated as nauseum for every pmd that gets written giving every PMD
author the opportunity to miscode the constructor, vs my one line that, if it
compiles, will be correct every time.

Neil


More information about the dev mailing list