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
alloc_netdev_etherdev [2018/08/28 07:12] – [alloc_netdev_mqs] rpjdayalloc_netdev_etherdev [2018/08/28 08:00] (current) – [netdev private data] rpjday
Line 5: Line 5:
 ===== netdev private data ===== ===== netdev private data =====
  
-From ''netdevice.h'', private data is stored (aligned) after the end of the structure:+From ''include/linux/netdevice.h'', optional private data is stored (aligned) after the end of the structure:
  
 <code> <code>
Line 18: Line 18:
 </code> </code>
  
-===== The variations of allocating net devices =====+Explanation of ''NETDEV_ALIGN'' [[https://stackoverflow.com/questions/31459565/memory-alignment-in-the-alloc-netdev-mqs|here]].
  
-==== 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 75: 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 84: 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.1535440329.txt.gz
  • Last modified: 2018/08/28 07:12
  • by rpjday