User Tools

Site Tools


alloc_netdev_etherdev

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
alloc_netdev_etherdev [2018/08/28 07:26]
rpjday [netdev private data]
alloc_netdev_etherdev [2018/08/28 07:58]
rpjday [alloc_etherdev(),alloc_etherdev_mq()]
Line 19: Line 19:
  
 Explanation of ''​NETDEV_ALIGN''​ [[https://​stackoverflow.com/​questions/​31459565/​memory-alignment-in-the-alloc-netdev-mqs|here]]. Explanation of ''​NETDEV_ALIGN''​ [[https://​stackoverflow.com/​questions/​31459565/​memory-alignment-in-the-alloc-netdev-mqs|here]].
-===== The variations of allocating net devices ===== 
  
-==== alloc_netdev_mqs ==== 
  
-The base allocation routine from ''​net/​core/​dev.c''​ for allocating a single device:+===== alloc_netdev_mqs ===== 
 + 
 +The base allocation routine from ''​net/​core/​dev.c''​ for allocating a //single// device:
  
 <​code>​ <​code>​
Line 76: Line 76:
 </​code>​ </​code>​
  
 +Not a lot of drivers call this routine directly given that you can call more convenient wrappers (see below).
  
-==== More ====+===== Wrappers/​variations ​===== 
 + 
 +==== alloc_netdev()/​alloc_netdev_mq() ==== 
 + 
 +From ''​include/​linux/​netdevice.h'':​ 
 + 
 +<​code>​ 
 + 
 +#define alloc_netdev(sizeof_priv,​ name, name_assign_type,​ setup) \ 
 + alloc_netdev_mqs(sizeof_priv,​ name, name_assign_type,​ setup, 1, 1) 
 + 
 +#define alloc_netdev_mq(sizeof_priv,​ name, name_assign_type,​ setup, count) \ 
 + alloc_netdev_mqs(sizeof_priv,​ name, name_assign_type,​ setup, count, \ 
 + count) 
 +</​code>​ 
 + 
 +==== alloc_etherdev(),​alloc_etherdev_mq(),​alloc_etherdev_mqs() ==== 
 + 
 +From ''​include/​linux/​etherdevice.h'':​ 
 + 
 +<​code>​ 
 +struct net_device *alloc_etherdev_mqs(int sizeof_priv,​ unsigned int txqs, 
 +     unsigned int rxqs); 
 +#define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv,​ 1) 
 +#define alloc_etherdev_mq(sizeof_priv,​ count) alloc_etherdev_mqs(sizeof_priv,​ count, count) 
 +</​code>​ 
 + 
 +From ''​net/​ethernet/​net.c'':​
  
 <​code>​ <​code>​
Line 85: Line 113:
  return alloc_netdev_mqs(sizeof_priv,​ "​eth%d",​ NET_NAME_UNKNOWN,​  return alloc_netdev_mqs(sizeof_priv,​ "​eth%d",​ NET_NAME_UNKNOWN,​
  ether_setup,​ txqs, rxqs);  ether_setup,​ txqs, rxqs);
 +}
 +</​code>​
 +
 +==== devm_alloc_etherdev*() ====
 +
 +From ''​include/​linux/​etherdevice.h'':​
 +
 +<​code>​
 +struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,​
 +    ​unsigned int txqs,
 +    ​unsigned int rxqs);
 +#define devm_alloc_etherdev(dev,​ sizeof_priv) devm_alloc_etherdev_mqs(dev,​ sizeof_priv,​ 1, 1)
 +</​code>​
 +
 +From ''​net/​ethernet/​net.c'':​
 +
 +<​code>​
 +struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,​
 +    ​unsigned int txqs, unsigned int rxqs)
 +{
 + struct net_device **dr;
 + struct net_device *netdev;
 +
 + dr = devres_alloc(devm_free_netdev,​ sizeof(*dr),​ GFP_KERNEL);​
 + if (!dr)
 + return NULL;
 +
 + netdev = alloc_etherdev_mqs(sizeof_priv,​ txqs, rxqs);
 + if (!netdev) {
 + devres_free(dr);​
 + return NULL;
 + }
 +
 + *dr = netdev;
 + devres_add(dev,​ dr);
 +
 + return netdev;
 } }
 </​code>​ </​code>​
alloc_netdev_etherdev.txt · Last modified: 2018/08/28 08:00 by rpjday