Deleted Added
sdiff udiff text old ( 251732 ) new ( 251752 )
full compact
1/*-
2 * Copyright (c) 2010 Lawrence Stewart <lstewart@freebsd.org>
3 * Copyright (c) 2010 The FreeBSD Foundation
4 * All rights reserved.
5 *
6 * This software was developed by Lawrence Stewart while studying at the Centre
7 * for Advanced Internet Architectures, Swinburne University of Technology,
8 * made possible in part by grants from the FreeBSD Foundation and Cisco

--- 21 unchanged lines hidden (view full) ---

30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/sys/kern/kern_hhook.c 251732 2013-06-14 04:10:34Z lstewart $");
39
40#include <sys/param.h>
41#include <sys/kernel.h>
42#include <sys/hhook.h>
43#include <sys/khelp.h>
44#include <sys/malloc.h>
45#include <sys/module.h>
46#include <sys/module_khelp.h>

--- 215 unchanged lines hidden (view full) ---

262 refcount_init(&tmphhh->hhh_refcount, 1);
263 *hhh = tmphhh;
264 } else
265 refcount_init(&tmphhh->hhh_refcount, 0);
266
267 HHHLIST_LOCK();
268 if (flags & HHOOK_HEADISINVNET) {
269 tmphhh->hhh_flags |= HHH_ISINVNET;
270 KASSERT(curvnet != NULL, ("curvnet is NULL"));
271 tmphhh->hhh_vid = (uintptr_t)curvnet;
272 LIST_INSERT_HEAD(&V_hhook_vhead_list, tmphhh, hhh_vnext);
273 }
274 LIST_INSERT_HEAD(&hhook_head_list, tmphhh, hhh_next);
275 HHHLIST_UNLOCK();
276
277 return (0);
278}
279
280static void
281hhook_head_destroy(struct hhook_head *hhh)
282{
283 struct hhook *tmp, *tmp2;
284
285 HHHLIST_LOCK_ASSERT();
286
287 LIST_REMOVE(hhh, hhh_next);
288 if (hhook_head_is_virtualised(hhh) == HHOOK_HEADISINVNET)
289 LIST_REMOVE(hhh, hhh_vnext);
290 HHH_WLOCK(hhh);
291 STAILQ_FOREACH_SAFE(tmp, &hhh->hhh_hooks, hhk_next, tmp2)
292 free(tmp, M_HHOOK);
293 HHH_WUNLOCK(hhh);
294 HHH_LOCK_DESTROY(hhh);
295 free(hhh, M_HHOOK);
296}
297

--- 44 unchanged lines hidden (view full) ---

342struct hhook_head *
343hhook_head_get(int32_t hhook_type, int32_t hhook_id)
344{
345 struct hhook_head *hhh;
346
347 HHHLIST_LOCK();
348 LIST_FOREACH(hhh, &hhook_head_list, hhh_next) {
349 if (hhh->hhh_type == hhook_type && hhh->hhh_id == hhook_id) {
350 if (hhook_head_is_virtualised(hhh) ==
351 HHOOK_HEADISINVNET) {
352 KASSERT(curvnet != NULL, ("curvnet is NULL"));
353 if (hhh->hhh_vid != (uintptr_t)curvnet)
354 continue;
355 }
356 refcount_acquire(&hhh->hhh_refcount);
357 break;
358 }
359 }
360 HHHLIST_UNLOCK();
361
362 return (hhh);
363}

--- 92 unchanged lines hidden ---