Branch data Line data Source code
1 : : /** 2 : : * Copyright (c) 2010-2012 Broadcom. All rights reserved. 3 : : * 4 : : * Redistribution and use in source and binary forms, with or without 5 : : * modification, are permitted provided that the following conditions 6 : : * are met: 7 : : * 1. Redistributions of source code must retain the above copyright 8 : : * notice, this list of conditions, and the following disclaimer, 9 : : * without modification. 10 : : * 2. Redistributions in binary form must reproduce the above copyright 11 : : * notice, this list of conditions and the following disclaimer in the 12 : : * documentation and/or other materials provided with the distribution. 13 : : * 3. The names of the above-listed copyright holders may not be used 14 : : * to endorse or promote products derived from this software without 15 : : * specific prior written permission. 16 : : * 17 : : * ALTERNATIVELY, this software may be distributed under the terms of the 18 : : * GNU General Public License ("GPL") version 2, as published by the Free 19 : : * Software Foundation. 20 : : * 21 : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22 : : * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23 : : * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25 : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 : : * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 : : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 : : * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 : : * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 : : * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 : : * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 : : */ 33 : : 34 : : #ifndef VCHIQ_KILLABLE_H 35 : : #define VCHIQ_KILLABLE_H 36 : : 37 : : #include <linux/mutex.h> 38 : : #include <linux/semaphore.h> 39 : : 40 : : #define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGTRAP) | sigmask(SIGSTOP) | sigmask(SIGCONT)) 41 : : 42 : 0 : static inline int __must_check down_interruptible_killable(struct semaphore *sem) 43 : : { 44 : : /* Allow interception of killable signals only. We don't want to be interrupted by harmless signals like SIGALRM */ 45 : : int ret; 46 : : sigset_t blocked, oldset; 47 : : siginitsetinv(&blocked, SHUTDOWN_SIGS); 48 : 0 : sigprocmask(SIG_SETMASK, &blocked, &oldset); 49 : 0 : ret = down_interruptible(sem); 50 : 0 : sigprocmask(SIG_SETMASK, &oldset, NULL); 51 : 0 : return ret; 52 : : } 53 : : #define down_interruptible down_interruptible_killable 54 : : 55 : : #endif