LCOV - code coverage report
Current view: top level - include/net/netns - generic.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 8 8 100.0 %
Date: 2021-04-22 12:43:58 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * generic net pointers
       4             :  */
       5             : 
       6             : #ifndef __NET_GENERIC_H__
       7             : #define __NET_GENERIC_H__
       8             : 
       9             : #include <linux/bug.h>
      10             : #include <linux/rcupdate.h>
      11             : 
      12             : /*
      13             :  * Generic net pointers are to be used by modules to put some private
      14             :  * stuff on the struct net without explicit struct net modification
      15             :  *
      16             :  * The rules are simple:
      17             :  * 1. set pernet_operations->id.  After register_pernet_device you
      18             :  *    will have the id of your private pointer.
      19             :  * 2. set pernet_operations->size to have the code allocate and free
      20             :  *    a private structure pointed to from struct net.
      21             :  * 3. do not change this pointer while the net is alive;
      22             :  * 4. do not try to have any private reference on the net_generic object.
      23             :  *
      24             :  * After accomplishing all of the above, the private pointer can be
      25             :  * accessed with the net_generic() call.
      26             :  */
      27             : 
      28             : struct net_generic {
      29             :         union {
      30             :                 struct {
      31             :                         unsigned int len;
      32             :                         struct rcu_head rcu;
      33             :                 } s;
      34             : 
      35             :                 void *ptr[0];
      36             :         };
      37             : };
      38             : 
      39         695 : static inline void *net_generic(const struct net *net, unsigned int id)
      40             : {
      41         695 :         struct net_generic *ng;
      42         695 :         void *ptr;
      43             : 
      44         695 :         rcu_read_lock();
      45         695 :         ng = rcu_dereference(net->gen);
      46         695 :         ptr = ng->ptr[id];
      47         695 :         rcu_read_unlock();
      48             : 
      49         695 :         return ptr;
      50             : }
      51             : #endif

Generated by: LCOV version 1.14