#ifndef _DCCP_LI_HIST_ #define _DCCP_LI_HIST_ /* * Copyright (c) 2007 The University of Aberdeen, Scotland, UK * Copyright (c) 2005-7 The University of Waikato, Hamilton, New Zealand. * Copyright (c) 2005-7 Ian McDonald * Copyright (c) 2005 Arnaldo Carvalho de Melo * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. */ #include #include #include /* * Number of loss intervals (RFC 4342, 8.6.1). The history size is one more than * NINTERVAL, since the `open' interval I_0 is always stored as the first entry. */ #define NINTERVAL 8 #define LIH_SIZE (NINTERVAL + 1) /** * tfrc_loss_interval - Loss history record for TFRC-based protocols * @li_seqno: Highest received seqno before the start of loss * @li_ccval: The CCVal belonging to @li_seqno * @li_is_closed: Whether @li_seqno is older than 1 RTT * @li_length: Loss interval sequence length */ struct tfrc_loss_interval { u64 li_seqno:48, li_ccval:4, li_is_closed:1; u32 li_length; }; /** * tfrc_loss_hist - Loss record database * @ring: Circular queue managed in LIFO manner * @counter: Current count of entries (can be more than %LIH_SIZE) * @i_mean: Current Average Loss Interval [RFC 3448, 5.4] */ struct tfrc_loss_hist { struct tfrc_loss_interval *ring[LIH_SIZE]; u8 counter; u32 i_mean; }; static inline void tfrc_lh_init(struct tfrc_loss_hist *lh) { memset(lh, 0, sizeof(struct tfrc_loss_hist)); } static inline u8 tfrc_lh_is_initialised(struct tfrc_loss_hist *lh) { return lh->counter > 0; } static inline u8 tfrc_lh_length(struct tfrc_loss_hist *lh) { return min(lh->counter, (u8)LIH_SIZE); } struct tfrc_rx_hist; int tfrc_lh_interval_add(struct tfrc_loss_hist *, struct tfrc_rx_hist *, u32 (*first_li)(struct sock *), struct sock *); u8 tfrc_lh_update_i_mean(struct tfrc_loss_hist *lh, struct sk_buff *); void tfrc_lh_cleanup(struct tfrc_loss_hist *lh); #endif /* _DCCP_LI_HIST_ */ ht' method='get' action='/cgit.cgi/linux/net-next.git/log/drivers/usb/gadget/function/u_uac1.h'>
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2017-01-26 16:39:55 +0100
committerIngo Molnar <mingo@kernel.org>2017-01-30 11:41:25 +0100
commita76a82a3e38c8d3fb6499e3dfaeb0949241ab588 (patch)
treeb5bc906278fe1ac66d75de984d26bf59b43b3ed8 /drivers/usb/gadget/function/u_uac1.h
parent566cf877a1fcb6d6dc0126b076aad062054c2637 (diff)
perf/core: Fix use-after-free bug
Dmitry reported a KASAN use-after-free on event->group_leader. It turns out there's a hole in perf_remove_from_context() due to event_function_call() not calling its function when the task associated with the event is already dead. In this case the event will have been detached from the task, but the grouping will have been retained, such that group operations might still work properly while there are live child events etc. This does however mean that we can miss a perf_group_detach() call when the group decomposes, this in turn can then lead to use-after-free. Fix it by explicitly doing the group detach if its still required. Reported-by: Dmitry Vyukov <dvyukov@google.com> Tested-by: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: stable@vger.kernel.org # v4.5+ Cc: syzkaller <syzkaller@googlegroups.com> Fixes: 63b6da39bb38 ("perf: Fix perf_event_exit_task() race") Link: http://lkml.kernel.org/r/20170126153955.GD6515@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/usb/gadget/function/u_uac1.h')