]>
Commit | Line | Data |
---|---|---|
056a1eb7 SF |
1 | /* $Id: initterm-r0drv-linux.c $ */ |
2 | /** @file | |
3 | * IPRT - Initialization & Termination, R0 Driver, Linux. | |
4 | */ | |
5 | ||
6 | /* | |
7 | * Copyright (C) 2006-2016 Oracle Corporation | |
8 | * | |
9 | * This file is part of VirtualBox Open Source Edition (OSE), as | |
10 | * available from http://www.virtualbox.org. This file is free software; | |
11 | * you can redistribute it and/or modify it under the terms of the GNU | |
12 | * General Public License (GPL) as published by the Free Software | |
13 | * Foundation, in version 2 as it comes in the "COPYING" file of the | |
14 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the | |
15 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. | |
16 | * | |
17 | * The contents of this file may alternatively be used under the terms | |
18 | * of the Common Development and Distribution License Version 1.0 | |
19 | * (CDDL) only, as it comes in the "COPYING.CDDL" file of the | |
20 | * VirtualBox OSE distribution, in which case the provisions of the | |
21 | * CDDL are applicable instead of those of the GPL. | |
22 | * | |
23 | * You may elect to license modified versions of this file under the | |
24 | * terms and conditions of either the GPL or the CDDL or both. | |
25 | */ | |
26 | ||
27 | ||
28 | /********************************************************************************************************************************* | |
29 | * Header Files * | |
30 | *********************************************************************************************************************************/ | |
31 | #include "the-linux-kernel.h" | |
32 | #include "internal/iprt.h" | |
33 | #include <iprt/err.h> | |
34 | #include <iprt/assert.h> | |
35 | #include "internal/initterm.h" | |
36 | ||
37 | ||
38 | /********************************************************************************************************************************* | |
39 | * Global Variables * | |
40 | *********************************************************************************************************************************/ | |
41 | /** The IPRT work queue. */ | |
42 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41) | |
43 | static struct workqueue_struct *g_prtR0LnxWorkQueue; | |
44 | #else | |
45 | static DECLARE_TASK_QUEUE(g_rtR0LnxWorkQueue); | |
46 | #endif | |
47 | ||
48 | ||
49 | /********************************************************************************************************************************* | |
50 | * Internal Functions * | |
51 | *********************************************************************************************************************************/ | |
52 | /* in alloc-r0drv0-linux.c */ | |
53 | DECLHIDDEN(void) rtR0MemExecCleanup(void); | |
54 | ||
55 | ||
56 | /** | |
57 | * Pushes an item onto the IPRT work queue. | |
58 | * | |
59 | * @param pWork The work item. | |
60 | * @param pfnWorker The callback function. It will be called back | |
61 | * with @a pWork as argument. | |
62 | */ | |
63 | DECLHIDDEN(void) rtR0LnxWorkqueuePush(RTR0LNXWORKQUEUEITEM *pWork, void (*pfnWorker)(RTR0LNXWORKQUEUEITEM *)) | |
64 | { | |
65 | IPRT_LINUX_SAVE_EFL_AC(); | |
66 | ||
67 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41) | |
68 | # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) | |
69 | INIT_WORK(pWork, pfnWorker); | |
70 | # else | |
71 | INIT_WORK(pWork, pfnWorker, pWork); | |
72 | # endif | |
73 | queue_work(g_prtR0LnxWorkQueue, pWork); | |
74 | #else | |
75 | INIT_TQUEUE(pWork, (void (*)(void *))pfnWorker, pWork); | |
76 | queue_task(pWork, &g_rtR0LnxWorkQueue); | |
77 | #endif | |
78 | ||
79 | IPRT_LINUX_RESTORE_EFL_AC(); | |
80 | } | |
81 | ||
82 | ||
83 | /** | |
84 | * Flushes all items in the IPRT work queue. | |
85 | * | |
86 | * @remarks This is mostly for 2.4.x compatability. Must not be called from | |
87 | * atomic contexts or with unncessary locks held. | |
88 | */ | |
89 | DECLHIDDEN(void) rtR0LnxWorkqueueFlush(void) | |
90 | { | |
91 | IPRT_LINUX_SAVE_EFL_AC(); | |
92 | ||
93 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41) | |
94 | flush_workqueue(g_prtR0LnxWorkQueue); | |
95 | #else | |
96 | run_task_queue(&g_rtR0LnxWorkQueue); | |
97 | #endif | |
98 | ||
99 | IPRT_LINUX_RESTORE_EFL_AC(); | |
100 | } | |
101 | ||
102 | ||
103 | DECLHIDDEN(int) rtR0InitNative(void) | |
104 | { | |
105 | int rc = VINF_SUCCESS; | |
106 | IPRT_LINUX_SAVE_EFL_AC(); | |
107 | ||
108 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41) | |
109 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) | |
110 | g_prtR0LnxWorkQueue = create_workqueue("iprt-VBoxWQueue"); | |
111 | #else | |
112 | g_prtR0LnxWorkQueue = create_workqueue("iprt-VBoxQ"); | |
113 | #endif | |
114 | if (!g_prtR0LnxWorkQueue) | |
115 | rc = VERR_NO_MEMORY; | |
116 | #endif | |
117 | ||
118 | IPRT_LINUX_RESTORE_EFL_AC(); | |
119 | return rc; | |
120 | } | |
121 | ||
122 | ||
123 | DECLHIDDEN(void) rtR0TermNative(void) | |
124 | { | |
125 | IPRT_LINUX_SAVE_EFL_AC(); | |
126 | ||
127 | rtR0LnxWorkqueueFlush(); | |
128 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 41) | |
129 | destroy_workqueue(g_prtR0LnxWorkQueue); | |
130 | g_prtR0LnxWorkQueue = NULL; | |
131 | #endif | |
132 | ||
133 | rtR0MemExecCleanup(); | |
134 | ||
135 | IPRT_LINUX_RESTORE_EFL_AC(); | |
136 | } | |
137 |