lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:  <20080129124259.7c502d13@deepthought>
Date:	Tue, 29 Jan 2008 12:42:59 -0800
From:	Stephen Hemminger <shemminger@...ux-foundation.org>
To:	netdev@...r.kernel.org
Subject:  Re: netdev->priv and netdev_priv(dev)

On Tue, 29 Jan 2008 21:10:00 +0100
Krzysztof Halasa <khc@...waw.pl> wrote:

> A commit few months ago introduced a change:
> 
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
>  
>  static inline void *netdev_priv(const struct net_device *dev)
>  {
> -       return (char *)dev + ((sizeof(struct net_device)
> -                                       + NETDEV_ALIGN_CONST)
> -                               & ~NETDEV_ALIGN_CONST);
> +       return dev->priv;
>  }
>  
> This change caused some problems for drivers which used
> netdev_priv(dev) and dev->priv for different purposes.
> 

Those drivers were making a incorrect assumption and should be fixed.
The in-tree drivers were fixed when this was done. If you have an out
of tree driver, then too bad for you.

> 
> The following patch restores previous behaviour.
> 
> Signed-off-by: Krzysztof Halasa <khc@...waw.pl>
> 
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -584,7 +584,10 @@ struct net_device
>  
>  static inline void *netdev_priv(const struct net_device *dev)
>  {
> -	return dev->priv;
> +	return (char *)dev + ((sizeof(struct net_device) +
> +			       sizeof(struct net_device_subqueue) *
> +			       (dev->egress_subqueue_count - 1) +
> +			       NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
>  }
>  
>  #define SET_MODULE_OWNER(dev) do { } while (0)
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -3693,13 +3693,8 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
>  		(((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
>  	dev->padded = (char *)dev - (char *)p;
>  
> -	if (sizeof_priv) {
> -		dev->priv = ((char *)dev +
> -			     ((sizeof(struct net_device) +
> -			       (sizeof(struct net_device_subqueue) *
> -				(queue_count - 1)) + NETDEV_ALIGN_CONST)
> -			      & ~NETDEV_ALIGN_CONST));
> -	}
> +	if (sizeof_priv)
> +		dev->priv = netdev_priv(dev);
>  
>  	dev->egress_subqueue_count = queue_count;
>  

The additional overhead of the address calculation would slow down the
well behaved drivers.  There was discussion of alternative layouts of
the network device allocation or limiting the number of subqueue's so
that netdev_priv could be a simple addition again, but nothing came of
it.



-- 
Stephen Hemminger <stephen.hemminger@...tta.com>


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ