LCOV - code coverage report
Current view: top level - ipc - ipcns_notifier.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 28 0.0 %
Date: 2014-02-18 Functions: 0 5 0.0 %
Branches: 0 6 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * linux/ipc/ipcns_notifier.c
       3                 :            :  * Copyright (C) 2007 BULL SA. Nadia Derbey
       4                 :            :  *
       5                 :            :  * Notification mechanism for ipc namespaces:
       6                 :            :  * The callback routine registered in the memory chain invokes the ipcns
       7                 :            :  * notifier chain with the IPCNS_MEMCHANGED event.
       8                 :            :  * Each callback routine registered in the ipcns namespace recomputes msgmni
       9                 :            :  * for the owning namespace.
      10                 :            :  */
      11                 :            : 
      12                 :            : #include <linux/msg.h>
      13                 :            : #include <linux/rcupdate.h>
      14                 :            : #include <linux/notifier.h>
      15                 :            : #include <linux/nsproxy.h>
      16                 :            : #include <linux/ipc_namespace.h>
      17                 :            : 
      18                 :            : #include "util.h"
      19                 :            : 
      20                 :            : 
      21                 :            : 
      22                 :            : static BLOCKING_NOTIFIER_HEAD(ipcns_chain);
      23                 :            : 
      24                 :            : 
      25                 :          0 : static int ipcns_callback(struct notifier_block *self,
      26                 :            :                                 unsigned long action, void *arg)
      27                 :            : {
      28                 :            :         struct ipc_namespace *ns;
      29                 :            : 
      30         [ #  # ]:          0 :         switch (action) {
      31                 :            :         case IPCNS_MEMCHANGED:   /* amount of lowmem has changed */
      32                 :            :         case IPCNS_CREATED:
      33                 :            :         case IPCNS_REMOVED:
      34                 :            :                 /*
      35                 :            :                  * It's time to recompute msgmni
      36                 :            :                  */
      37                 :          0 :                 ns = container_of(self, struct ipc_namespace, ipcns_nb);
      38                 :            :                 /*
      39                 :            :                  * No need to get a reference on the ns: the 1st job of
      40                 :            :                  * free_ipc_ns() is to unregister the callback routine.
      41                 :            :                  * blocking_notifier_chain_unregister takes the wr lock to do
      42                 :            :                  * it.
      43                 :            :                  * When this callback routine is called the rd lock is held by
      44                 :            :                  * blocking_notifier_call_chain.
      45                 :            :                  * So the ipc ns cannot be freed while we are here.
      46                 :            :                  */
      47                 :          0 :                 recompute_msgmni(ns);
      48                 :          0 :                 break;
      49                 :            :         default:
      50                 :            :                 break;
      51                 :            :         }
      52                 :            : 
      53                 :          0 :         return NOTIFY_OK;
      54                 :            : }
      55                 :            : 
      56                 :          0 : int register_ipcns_notifier(struct ipc_namespace *ns)
      57                 :            : {
      58                 :            :         int rc;
      59                 :            : 
      60                 :          0 :         memset(&ns->ipcns_nb, 0, sizeof(ns->ipcns_nb));
      61                 :          0 :         ns->ipcns_nb.notifier_call = ipcns_callback;
      62                 :          0 :         ns->ipcns_nb.priority = IPCNS_CALLBACK_PRI;
      63                 :          0 :         rc = blocking_notifier_chain_register(&ipcns_chain, &ns->ipcns_nb);
      64         [ #  # ]:          0 :         if (!rc)
      65                 :          0 :                 ns->auto_msgmni = 1;
      66                 :          0 :         return rc;
      67                 :            : }
      68                 :            : 
      69                 :          0 : int cond_register_ipcns_notifier(struct ipc_namespace *ns)
      70                 :            : {
      71                 :            :         int rc;
      72                 :            : 
      73                 :          0 :         memset(&ns->ipcns_nb, 0, sizeof(ns->ipcns_nb));
      74                 :          0 :         ns->ipcns_nb.notifier_call = ipcns_callback;
      75                 :          0 :         ns->ipcns_nb.priority = IPCNS_CALLBACK_PRI;
      76                 :          0 :         rc = blocking_notifier_chain_cond_register(&ipcns_chain,
      77                 :            :                                                         &ns->ipcns_nb);
      78         [ #  # ]:          0 :         if (!rc)
      79                 :          0 :                 ns->auto_msgmni = 1;
      80                 :          0 :         return rc;
      81                 :            : }
      82                 :            : 
      83                 :          0 : void unregister_ipcns_notifier(struct ipc_namespace *ns)
      84                 :            : {
      85                 :          0 :         blocking_notifier_chain_unregister(&ipcns_chain, &ns->ipcns_nb);
      86                 :          0 :         ns->auto_msgmni = 0;
      87                 :          0 : }
      88                 :            : 
      89                 :          0 : int ipcns_notify(unsigned long val)
      90                 :            : {
      91                 :          0 :         return blocking_notifier_call_chain(&ipcns_chain, val, NULL);
      92                 :            : }

Generated by: LCOV version 1.9