~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/tipc/handler.c

Version: ~ [ linux-5.3 ] ~ [ linux-5.2.14 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.72 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.143 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.192 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.192 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.73 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * net/tipc/handler.c: TIPC signal handling
  3  *
  4  * Copyright (c) 2000-2006, Ericsson AB
  5  * Copyright (c) 2005, Wind River Systems
  6  * All rights reserved.
  7  *
  8  * Redistribution and use in source and binary forms, with or without
  9  * modification, are permitted provided that the following conditions are met:
 10  *
 11  * 1. Redistributions of source code must retain the above copyright
 12  *    notice, this list of conditions and the following disclaimer.
 13  * 2. Redistributions in binary form must reproduce the above copyright
 14  *    notice, this list of conditions and the following disclaimer in the
 15  *    documentation and/or other materials provided with the distribution.
 16  * 3. Neither the names of the copyright holders nor the names of its
 17  *    contributors may be used to endorse or promote products derived from
 18  *    this software without specific prior written permission.
 19  *
 20  * Alternatively, this software may be distributed under the terms of the
 21  * GNU General Public License ("GPL") version 2 as published by the Free
 22  * Software Foundation.
 23  *
 24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 25  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 34  * POSSIBILITY OF SUCH DAMAGE.
 35  */
 36 
 37 #include "core.h"
 38 
 39 struct queue_item {
 40         struct list_head next_signal;
 41         void (*handler) (unsigned long);
 42         unsigned long data;
 43 };
 44 
 45 static struct kmem_cache *tipc_queue_item_cache;
 46 static struct list_head signal_queue_head;
 47 static DEFINE_SPINLOCK(qitem_lock);
 48 static int handler_enabled __read_mostly;
 49 
 50 static void process_signal_queue(unsigned long dummy);
 51 
 52 static DECLARE_TASKLET_DISABLED(tipc_tasklet, process_signal_queue, 0);
 53 
 54 
 55 unsigned int tipc_k_signal(Handler routine, unsigned long argument)
 56 {
 57         struct queue_item *item;
 58 
 59         if (!handler_enabled) {
 60                 pr_err("Signal request ignored by handler\n");
 61                 return -ENOPROTOOPT;
 62         }
 63 
 64         spin_lock_bh(&qitem_lock);
 65         item = kmem_cache_alloc(tipc_queue_item_cache, GFP_ATOMIC);
 66         if (!item) {
 67                 pr_err("Signal queue out of memory\n");
 68                 spin_unlock_bh(&qitem_lock);
 69                 return -ENOMEM;
 70         }
 71         item->handler = routine;
 72         item->data = argument;
 73         list_add_tail(&item->next_signal, &signal_queue_head);
 74         spin_unlock_bh(&qitem_lock);
 75         tasklet_schedule(&tipc_tasklet);
 76         return 0;
 77 }
 78 
 79 static void process_signal_queue(unsigned long dummy)
 80 {
 81         struct queue_item *__volatile__ item;
 82         struct list_head *l, *n;
 83 
 84         spin_lock_bh(&qitem_lock);
 85         list_for_each_safe(l, n, &signal_queue_head) {
 86                 item = list_entry(l, struct queue_item, next_signal);
 87                 list_del(&item->next_signal);
 88                 spin_unlock_bh(&qitem_lock);
 89                 item->handler(item->data);
 90                 spin_lock_bh(&qitem_lock);
 91                 kmem_cache_free(tipc_queue_item_cache, item);
 92         }
 93         spin_unlock_bh(&qitem_lock);
 94 }
 95 
 96 int tipc_handler_start(void)
 97 {
 98         tipc_queue_item_cache =
 99                 kmem_cache_create("tipc_queue_items", sizeof(struct queue_item),
100                                   0, SLAB_HWCACHE_ALIGN, NULL);
101         if (!tipc_queue_item_cache)
102                 return -ENOMEM;
103 
104         INIT_LIST_HEAD(&signal_queue_head);
105         tasklet_enable(&tipc_tasklet);
106         handler_enabled = 1;
107         return 0;
108 }
109 
110 void tipc_handler_stop(void)
111 {
112         struct list_head *l, *n;
113         struct queue_item *item;
114 
115         if (!handler_enabled)
116                 return;
117 
118         handler_enabled = 0;
119         tasklet_kill(&tipc_tasklet);
120 
121         spin_lock_bh(&qitem_lock);
122         list_for_each_safe(l, n, &signal_queue_head) {
123                 item = list_entry(l, struct queue_item, next_signal);
124                 list_del(&item->next_signal);
125                 kmem_cache_free(tipc_queue_item_cache, item);
126         }
127         spin_unlock_bh(&qitem_lock);
128 
129         kmem_cache_destroy(tipc_queue_item_cache);
130 }
131 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp