#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_ */ lass='right' method='get' action='/cgit.cgi/linux/net-next.git/log/drivers'>
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2017-01-11 16:32:15 +0200
committerKalle Valo <kvalo@qca.qualcomm.com>2017-01-12 12:59:50 +0200
commit50f3818196f5d6a87867772b40637af1d51e11f3 (patch)
tree6a6d18b377312fa62f3259f09f53976b9db9c092 /drivers
parentd5a3a76a9cb814b377d12fe4ebe5cff20b63f390 (diff)
ath9k: ar9003_mac: kill off ACCESS_ONCE()
For several reasons, it is desirable to use {READ,WRITE}_ONCE() in preference to ACCESS_ONCE(), and new code is expected to use one of the former. So far, there's been no reason to change most existing uses of ACCESS_ONCE(), as these aren't currently harmful. However, for some new features (e.g. KTSAN / Kernel Thread Sanitizer), it is necessary to instrument reads and writes separately, which is not possible with ACCESS_ONCE(). This distinction is critical to correct operation. It's possible to transform the bulk of kernel code using the Coccinelle script below. However, for some files (including the ath9k ar9003 mac driver), this mangles the formatting. As a preparatory step, this patch converts the driver to use {READ,WRITE}_ONCE() without said mangling. ---- virtual patch @ depends on patch @ expression E1, E2; @@ - ACCESS_ONCE(E1) = E2 + WRITE_ONCE(E1, E2) @ depends on patch @ expression E; @@ - ACCESS_ONCE(E) + READ_ONCE(E) ---- Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: ath9k-devel@qca.qualcomm.com Cc: Kalle Valo <kvalo@codeaurora.org> Cc: linux-wireless@vger.kernel.org Cc: ath9k-devel@lists.ath9k.org Cc: netdev@vger.kernel.org Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers')