mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-01-30 14:52:17 +00:00
Is there a moose on the loose?!
Yes! There is a moose on the loose!!!!! His name is Seany ! -_-
This commit is contained in:
parent
2660311c2b
commit
a76922ad39
6
Makefile
6
Makefile
@ -1,8 +1,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Older dsat code has been merged with NXT
|
||||
# QortalOS NXT central by Scare Crowe
|
||||
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 16
|
||||
SUBLEVEL = 40
|
||||
PATCHLEVEL = 17
|
||||
SUBLEVEL = 10
|
||||
EXTRAVERSION = -LTS
|
||||
NAME = BrooklynR NXT
|
||||
|
||||
|
@ -593,7 +593,6 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)
|
||||
spin_lock(&hash_lock);
|
||||
}
|
||||
spin_unlock(&hash_lock);
|
||||
put_tree(victim);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -602,6 +601,7 @@ static void prune_tree_chunks(struct audit_tree *victim, bool tagged)
|
||||
static void prune_one(struct audit_tree *victim)
|
||||
{
|
||||
prune_tree_chunks(victim, false);
|
||||
put_tree(victim);
|
||||
}
|
||||
|
||||
/* trim the uncommitted chunks from tree */
|
||||
|
@ -72,7 +72,7 @@ void bpf_inode_storage_free(struct inode *inode)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Netiher the bpf_prog nor the bpf-map's syscall
|
||||
/* Neither the bpf_prog nor the bpf-map's syscall
|
||||
* could be modifying the local_storage->list now.
|
||||
* Thus, no elem can be added-to or deleted-from the
|
||||
* local_storage->list by the bpf_prog or by the bpf-map's syscall.
|
||||
|
@ -286,13 +286,13 @@ struct cred *prepare_creds(void)
|
||||
new->security = NULL;
|
||||
#endif
|
||||
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
new->ucounts = get_ucounts(new->ucounts);
|
||||
if (!new->ucounts)
|
||||
goto error;
|
||||
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
validate_creds(new);
|
||||
return new;
|
||||
|
||||
@ -753,13 +753,13 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
|
||||
#ifdef CONFIG_SECURITY
|
||||
new->security = NULL;
|
||||
#endif
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
new->ucounts = get_ucounts(new->ucounts);
|
||||
if (!new->ucounts)
|
||||
goto error;
|
||||
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
put_cred(old);
|
||||
validate_creds(new);
|
||||
return new;
|
||||
|
@ -1045,8 +1045,8 @@ int gdb_serial_stub(struct kgdb_state *ks)
|
||||
gdb_cmd_detachkill(ks);
|
||||
return DBG_PASS_EVENT;
|
||||
}
|
||||
#endif
|
||||
fallthrough;
|
||||
#endif
|
||||
case 'C': /* Exception passing */
|
||||
tmp = gdb_cmd_exception_pass(ks);
|
||||
if (tmp > 0)
|
||||
|
@ -135,7 +135,7 @@ bool osq_lock(struct optimistic_spin_queue *lock)
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wait to acquire the lock or cancelation. Note that need_resched()
|
||||
* Wait to acquire the lock or cancellation. Note that need_resched()
|
||||
* will come with an IPI, which will wake smp_cond_load_relaxed() if it
|
||||
* is implemented with a monitor-wait. vcpu_is_preempted() relies on
|
||||
* polling, be careful.
|
||||
@ -164,7 +164,7 @@ bool osq_lock(struct optimistic_spin_queue *lock)
|
||||
|
||||
/*
|
||||
* We can only fail the cmpxchg() racing against an unlock(),
|
||||
* in which case we should observe @node->locked becomming
|
||||
* in which case we should observe @node->locked becoming
|
||||
* true.
|
||||
*/
|
||||
if (smp_load_acquire(&node->locked))
|
||||
|
@ -94,9 +94,9 @@ static void rcu_sync_func(struct rcu_head *rhp)
|
||||
rcu_sync_call(rsp);
|
||||
} else {
|
||||
/*
|
||||
* We're at least a GP after the last rcu_sync_exit(); eveybody
|
||||
* We're at least a GP after the last rcu_sync_exit(); everybody
|
||||
* will now have observed the write side critical section.
|
||||
* Let 'em rip!.
|
||||
* Let 'em rip!
|
||||
*/
|
||||
WRITE_ONCE(rsp->gp_state, GP_IDLE);
|
||||
}
|
||||
|
@ -41,7 +41,7 @@
|
||||
* Otherwise it tries to create a semi stable clock from a mixture of other
|
||||
* clocks, including:
|
||||
*
|
||||
* - GTOD (clock monotomic)
|
||||
* - GTOD (clock monotonic)
|
||||
* - sched_clock()
|
||||
* - explicit idle events
|
||||
*
|
||||
|
@ -77,7 +77,7 @@ static inline int __cpupri_find(struct cpupri *cp, struct task_struct *p,
|
||||
* When looking at the vector, we need to read the counter,
|
||||
* do a memory barrier, then read the mask.
|
||||
*
|
||||
* Note: This is still all racey, but we can deal with it.
|
||||
* Note: This is still all racy, but we can deal with it.
|
||||
* Ideally, we only want to look at masks that are set.
|
||||
*
|
||||
* If a mask is not set, then the only thing wrong is that we
|
||||
@ -186,7 +186,7 @@ int cpupri_find_fitness(struct cpupri *cp, struct task_struct *p,
|
||||
* The cost of this trade-off is not entirely clear and will probably
|
||||
* be good for some workloads and bad for others.
|
||||
*
|
||||
* The main idea here is that if some CPUs were overcommitted, we try
|
||||
* The main idea here is that if some CPUs were over-committed, we try
|
||||
* to spread which is what the scheduler traditionally did. Sys admins
|
||||
* must do proper RT planning to avoid overloading the system if they
|
||||
* really care.
|
||||
|
@ -133,7 +133,7 @@ accumulate_sum(u64 delta, struct sched_avg *sa,
|
||||
* runnable = running = 0;
|
||||
*
|
||||
* clause from ___update_load_sum(); this results in
|
||||
* the below usage of @contrib to dissapear entirely,
|
||||
* the below usage of @contrib to disappear entirely,
|
||||
* so no point in calculating it.
|
||||
*/
|
||||
contrib = __accumulate_pelt_segments(periods,
|
||||
|
@ -602,7 +602,7 @@ static inline void seccomp_sync_threads(unsigned long flags)
|
||||
smp_store_release(&thread->seccomp.filter,
|
||||
caller->seccomp.filter);
|
||||
atomic_set(&thread->seccomp.filter_count,
|
||||
atomic_read(&thread->seccomp.filter_count));
|
||||
atomic_read(&caller->seccomp.filter_count));
|
||||
|
||||
/*
|
||||
* Don't let an unprivileged task work around
|
||||
|
@ -764,7 +764,7 @@ print_graph_prologue(struct trace_iterator *iter, struct trace_seq *s,
|
||||
* - we are inside irq code
|
||||
* - we just entered irq code
|
||||
*
|
||||
* retunns 0 if
|
||||
* returns 0 if
|
||||
* - funcgraph-interrupts option is set
|
||||
* - we are not inside irq code
|
||||
*/
|
||||
|
@ -1748,7 +1748,7 @@ kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs)
|
||||
if (trace_probe_test_flag(&tk->tp, TP_FLAG_PROFILE))
|
||||
kretprobe_perf_func(tk, ri, regs);
|
||||
#endif
|
||||
return 0; /* We don't tweek kernel, so just return 0 */
|
||||
return 0; /* We don't tweak kernel, so just return 0 */
|
||||
}
|
||||
NOKPROBE_SYMBOL(kretprobe_dispatcher);
|
||||
|
||||
|
@ -134,7 +134,7 @@ struct fetch_type {
|
||||
size_t size; /* Byte size of type */
|
||||
int is_signed; /* Signed flag */
|
||||
print_type_func_t print; /* Print functions */
|
||||
const char *fmt; /* Fromat string */
|
||||
const char *fmt; /* Format string */
|
||||
const char *fmttype; /* Name in format file */
|
||||
};
|
||||
|
||||
|
@ -878,7 +878,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Now that the big kernel lock is no longer preemptable,
|
||||
* Now that the big kernel lock is no longer preemptible,
|
||||
* and this is called with the BKL held, it will always
|
||||
* fail. If preemption is already disabled, simply
|
||||
* pass the test. When the BKL is removed, or becomes
|
||||
@ -940,7 +940,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Now that the big kernel lock is no longer preemptable,
|
||||
* Now that the big kernel lock is no longer preemptible,
|
||||
* and this is called with the BKL held, it will always
|
||||
* fail. If preemption is already disabled, simply
|
||||
* pass the test. When the BKL is removed, or becomes
|
||||
|
@ -3,7 +3,7 @@
|
||||
/* */
|
||||
/* Font file generated by cpi2fnt */
|
||||
/* ------------------------------ */
|
||||
/* Combined with the alpha-numeric */
|
||||
/* Combined with the alphanumeric */
|
||||
/* portion of Greg Harp's old PEARL */
|
||||
/* font (from earlier versions of */
|
||||
/* linux-m86k) by John Shifflett */
|
||||
|
@ -398,12 +398,12 @@ static void cgwb_release_workfn(struct work_struct *work)
|
||||
blkcg_unpin_online(blkcg);
|
||||
|
||||
fprop_local_destroy_percpu(&wb->memcg_completions);
|
||||
percpu_ref_exit(&wb->refcnt);
|
||||
|
||||
spin_lock_irq(&cgwb_lock);
|
||||
list_del(&wb->offline_node);
|
||||
spin_unlock_irq(&cgwb_lock);
|
||||
|
||||
percpu_ref_exit(&wb->refcnt);
|
||||
wb_exit(wb);
|
||||
WARN_ON_ONCE(!list_empty(&wb->b_attached));
|
||||
kfree_rcu(wb, rcu);
|
||||
|
@ -60,16 +60,20 @@ static u64 frontswap_succ_stores;
|
||||
static u64 frontswap_failed_stores;
|
||||
static u64 frontswap_invalidates;
|
||||
|
||||
static inline void inc_frontswap_loads(void) {
|
||||
static inline void inc_frontswap_loads(void)
|
||||
{
|
||||
data_race(frontswap_loads++);
|
||||
}
|
||||
static inline void inc_frontswap_succ_stores(void) {
|
||||
static inline void inc_frontswap_succ_stores(void)
|
||||
{
|
||||
data_race(frontswap_succ_stores++);
|
||||
}
|
||||
static inline void inc_frontswap_failed_stores(void) {
|
||||
static inline void inc_frontswap_failed_stores(void)
|
||||
{
|
||||
data_race(frontswap_failed_stores++);
|
||||
}
|
||||
static inline void inc_frontswap_invalidates(void) {
|
||||
static inline void inc_frontswap_invalidates(void)
|
||||
{
|
||||
data_race(frontswap_invalidates++);
|
||||
}
|
||||
#else
|
||||
|
@ -148,7 +148,7 @@ static bool __must_check tokenize_frame_descr(const char **frame_descr,
|
||||
}
|
||||
|
||||
/* Copy token (+ 1 byte for '\0'). */
|
||||
strlcpy(token, *frame_descr, tok_len + 1);
|
||||
strscpy(token, *frame_descr, tok_len + 1);
|
||||
}
|
||||
|
||||
/* Advance frame_descr past separator. */
|
||||
|
@ -156,14 +156,14 @@ static inline void put_memcg_path_buf(void)
|
||||
#define TRACE_MMAP_LOCK_EVENT(type, mm, ...) \
|
||||
do { \
|
||||
const char *memcg_path; \
|
||||
preempt_disable(); \
|
||||
local_lock(&memcg_paths.lock); \
|
||||
memcg_path = get_mm_memcg_path(mm); \
|
||||
trace_mmap_lock_##type(mm, \
|
||||
memcg_path != NULL ? memcg_path : "", \
|
||||
##__VA_ARGS__); \
|
||||
if (likely(memcg_path != NULL)) \
|
||||
put_memcg_path_buf(); \
|
||||
preempt_enable(); \
|
||||
local_unlock(&memcg_paths.lock); \
|
||||
} while (0)
|
||||
|
||||
#else /* !CONFIG_MEMCG */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_PGALLLC_TRACK_H
|
||||
#define _LINUX_PGALLLC_TRACK_H
|
||||
#ifndef _LINUX_PGALLOC_TRACK_H
|
||||
#define _LINUX_PGALLOC_TRACK_H
|
||||
|
||||
#if defined(CONFIG_MMU)
|
||||
static inline p4d_t *p4d_alloc_track(struct mm_struct *mm, pgd_t *pgd,
|
||||
@ -48,4 +48,4 @@ static inline pmd_t *pmd_alloc_track(struct mm_struct *mm, pud_t *pud,
|
||||
(__pte_alloc_kernel(pmd) || ({*(mask)|=PGTBL_PMD_MODIFIED;0;})))?\
|
||||
NULL: pte_offset_kernel(pmd, address))
|
||||
|
||||
#endif /* _LINUX_PGALLLC_TRACK_H */
|
||||
#endif /* _LINUX_PGALLOC_TRACK_H */
|
||||
|
@ -1659,19 +1659,19 @@ struct batadv_priv {
|
||||
/** @tp_list: list of tp sessions */
|
||||
struct hlist_head tp_list;
|
||||
|
||||
/** @tp_num: number of currently active tp sessions */
|
||||
/** @orig_hash: hash table containing mesh participants (orig nodes) */
|
||||
struct batadv_hashtable *orig_hash;
|
||||
|
||||
/** @orig_hash: hash table containing mesh participants (orig nodes) */
|
||||
/** @forw_bat_list_lock: lock protecting forw_bat_list */
|
||||
spinlock_t forw_bat_list_lock;
|
||||
|
||||
/** @forw_bat_list_lock: lock protecting forw_bat_list */
|
||||
/** @forw_bcast_list_lock: lock protecting forw_bcast_list */
|
||||
spinlock_t forw_bcast_list_lock;
|
||||
|
||||
/** @forw_bcast_list_lock: lock protecting forw_bcast_list */
|
||||
/** @tp_list_lock: spinlock protecting @tp_list */
|
||||
spinlock_t tp_list_lock;
|
||||
|
||||
/** @tp_list_lock: spinlock protecting @tp_list */
|
||||
/** @tp_num: number of currently active tp sessions */
|
||||
atomic_t tp_num;
|
||||
|
||||
/** @orig_work: work queue callback item for orig node purging */
|
||||
|
@ -120,7 +120,7 @@ static int a2mp_command_rej(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*rej))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("ident %d reason %d", hdr->ident, le16_to_cpu(rej->reason));
|
||||
BT_DBG("ident %u reason %d", hdr->ident, le16_to_cpu(rej->reason));
|
||||
|
||||
skb_pull(skb, sizeof(*rej));
|
||||
|
||||
@ -219,7 +219,7 @@ static int a2mp_discover_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
|
||||
cl = (void *) skb->data;
|
||||
while (len >= sizeof(*cl)) {
|
||||
BT_DBG("Remote AMP id %d type %d status %d", cl->id, cl->type,
|
||||
BT_DBG("Remote AMP id %u type %u status %u", cl->id, cl->type,
|
||||
cl->status);
|
||||
|
||||
if (cl->id != AMP_ID_BREDR && cl->type != AMP_TYPE_BREDR) {
|
||||
@ -273,7 +273,7 @@ static int a2mp_change_notify(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
struct a2mp_cl *cl = (void *) skb->data;
|
||||
|
||||
while (skb->len >= sizeof(*cl)) {
|
||||
BT_DBG("Controller id %d type %d status %d", cl->id, cl->type,
|
||||
BT_DBG("Controller id %u type %u status %u", cl->id, cl->type,
|
||||
cl->status);
|
||||
cl = skb_pull(skb, sizeof(*cl));
|
||||
}
|
||||
@ -302,7 +302,7 @@ static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d", req->id);
|
||||
BT_DBG("id %u", req->id);
|
||||
|
||||
hdev = hci_dev_get(req->id);
|
||||
if (!hdev || hdev->dev_type != HCI_AMP) {
|
||||
@ -344,7 +344,7 @@ static int a2mp_getinfo_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*rsp))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d status 0x%2.2x", rsp->id, rsp->status);
|
||||
BT_DBG("id %u status 0x%2.2x", rsp->id, rsp->status);
|
||||
|
||||
if (rsp->status)
|
||||
return -EINVAL;
|
||||
@ -373,7 +373,7 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d", req->id);
|
||||
BT_DBG("id %u", req->id);
|
||||
|
||||
/* Make sure that other request is not processed */
|
||||
tmp = amp_mgr_lookup_by_state(READ_LOC_AMP_ASSOC);
|
||||
@ -423,7 +423,7 @@ static int a2mp_getampassoc_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
|
||||
assoc_len = len - sizeof(*rsp);
|
||||
|
||||
BT_DBG("id %d status 0x%2.2x assoc len %zu", rsp->id, rsp->status,
|
||||
BT_DBG("id %u status 0x%2.2x assoc len %zu", rsp->id, rsp->status,
|
||||
assoc_len);
|
||||
|
||||
if (rsp->status)
|
||||
@ -457,7 +457,7 @@ static int a2mp_getampassoc_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (!hcon)
|
||||
goto done;
|
||||
|
||||
BT_DBG("Created hcon %p: loc:%d -> rem:%d", hcon, hdev->id, rsp->id);
|
||||
BT_DBG("Created hcon %p: loc:%u -> rem:%u", hcon, hdev->id, rsp->id);
|
||||
|
||||
mgr->bredr_chan->remote_amp_id = rsp->id;
|
||||
|
||||
@ -481,7 +481,7 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("local_id %d, remote_id %d", req->local_id, req->remote_id);
|
||||
BT_DBG("local_id %u, remote_id %u", req->local_id, req->remote_id);
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
@ -562,7 +562,7 @@ static int a2mp_discphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("local_id %d remote_id %d", req->local_id, req->remote_id);
|
||||
BT_DBG("local_id %u remote_id %u", req->local_id, req->remote_id);
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
@ -599,7 +599,7 @@ static int a2mp_discphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
static inline int a2mp_cmd_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
struct a2mp_cmd *hdr)
|
||||
{
|
||||
BT_DBG("ident %d code 0x%2.2x", hdr->ident, hdr->code);
|
||||
BT_DBG("ident %u code 0x%2.2x", hdr->ident, hdr->code);
|
||||
|
||||
skb_pull(skb, le16_to_cpu(hdr->len));
|
||||
return 0;
|
||||
@ -620,7 +620,7 @@ static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
|
||||
hdr = (void *) skb->data;
|
||||
len = le16_to_cpu(hdr->len);
|
||||
|
||||
BT_DBG("code 0x%2.2x id %d len %u", hdr->code, hdr->ident, len);
|
||||
BT_DBG("code 0x%2.2x id %u len %u", hdr->code, hdr->ident, len);
|
||||
|
||||
skb_pull(skb, sizeof(*hdr));
|
||||
|
||||
|
@ -78,7 +78,7 @@ struct amp_ctrl *amp_ctrl_lookup(struct amp_mgr *mgr, u8 id)
|
||||
{
|
||||
struct amp_ctrl *ctrl;
|
||||
|
||||
BT_DBG("mgr %p id %d", mgr, id);
|
||||
BT_DBG("mgr %p id %u", mgr, id);
|
||||
|
||||
mutex_lock(&mgr->amp_ctrls_lock);
|
||||
list_for_each_entry(ctrl, &mgr->amp_ctrls, list) {
|
||||
@ -179,7 +179,7 @@ int phylink_gen_key(struct hci_conn *conn, u8 *data, u8 *len, u8 *type)
|
||||
|
||||
/* Legacy key */
|
||||
if (conn->key_type < 3) {
|
||||
bt_dev_err(hdev, "legacy key type %d", conn->key_type);
|
||||
bt_dev_err(hdev, "legacy key type %u", conn->key_type);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@ -257,7 +257,7 @@ void amp_read_loc_assoc_frag(struct hci_dev *hdev, u8 phy_handle)
|
||||
struct hci_request req;
|
||||
int err;
|
||||
|
||||
BT_DBG("%s handle %d", hdev->name, phy_handle);
|
||||
BT_DBG("%s handle %u", hdev->name, phy_handle);
|
||||
|
||||
cp.phy_handle = phy_handle;
|
||||
cp.max_len = cpu_to_le16(hdev->amp_assoc_size);
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
|
||||
#define BTNAMSIZ 18
|
||||
#define BTNAMSIZ 21
|
||||
|
||||
/* CMTP ioctl defines */
|
||||
#define CMTPCONNADD _IOW('C', 200, int)
|
||||
|
@ -7725,7 +7725,7 @@ static int add_advertising(struct sock *sk, struct hci_dev *hdev,
|
||||
* advertising.
|
||||
*/
|
||||
if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
|
||||
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
|
||||
return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
|
||||
MGMT_STATUS_NOT_SUPPORTED);
|
||||
|
||||
if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets)
|
||||
|
@ -146,7 +146,7 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
const u16 type = le16_to_cpu(TO_TLV(buffer)->type);
|
||||
|
||||
if (buffer_left < exp_len) {
|
||||
bt_dev_warn(hdev, "invalid len left %d, exp >= %d",
|
||||
bt_dev_warn(hdev, "invalid len left %u, exp >= %u",
|
||||
buffer_left, exp_len);
|
||||
|
||||
return mgmt_cmd_status(sk, hdev->id,
|
||||
@ -198,7 +198,7 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
}
|
||||
|
||||
if (exp_type_len && len != exp_type_len) {
|
||||
bt_dev_warn(hdev, "invalid length %d, exp %zu for type %d",
|
||||
bt_dev_warn(hdev, "invalid length %d, exp %zu for type %u",
|
||||
len, exp_type_len, type);
|
||||
|
||||
return mgmt_cmd_status(sk, hdev->id,
|
||||
|
@ -1309,7 +1309,7 @@ static int get_osdmap_client_data_v(void **p, void *end,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* old osdmap enconding */
|
||||
/* old osdmap encoding */
|
||||
struct_v = 0;
|
||||
}
|
||||
|
||||
@ -3010,7 +3010,7 @@ static bool is_valid_crush_name(const char *name)
|
||||
* parent, returns 0.
|
||||
*
|
||||
* Does a linear search, as there are no parent pointers of any
|
||||
* kind. Note that the result is ambigous for items that occur
|
||||
* kind. Note that the result is ambiguous for items that occur
|
||||
* multiple times in the map.
|
||||
*/
|
||||
static int get_immediate_parent(struct crush_map *c, int id,
|
||||
|
@ -1754,7 +1754,7 @@ static void exit_net_drop_monitor(void)
|
||||
|
||||
/*
|
||||
* Because of the module_get/put we do in the trace state change path
|
||||
* we are guarnateed not to have any current users when we get here
|
||||
* we are guaranteed not to have any current users when we get here
|
||||
*/
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
|
@ -32,7 +32,7 @@ int register_netevent_notifier(struct notifier_block *nb)
|
||||
EXPORT_SYMBOL_GPL(register_netevent_notifier);
|
||||
|
||||
/**
|
||||
* netevent_unregister_notifier - unregister a netevent notifier block
|
||||
* unregister_netevent_notifier - unregister a netevent notifier block
|
||||
* @nb: notifier
|
||||
*
|
||||
* Unregister a notifier previously registered by
|
||||
|
@ -870,7 +870,7 @@ int dn_nsp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
/*
|
||||
* Read out ack data here, this applies equally
|
||||
* to data, other data, link serivce and both
|
||||
* to data, other data, link service and both
|
||||
* ack data and ack otherdata.
|
||||
*/
|
||||
dn_process_ack(sk, skb, other);
|
||||
|
@ -179,7 +179,7 @@ static void dn_nsp_rtt(struct sock *sk, long rtt)
|
||||
scp->nsp_srtt = 1;
|
||||
|
||||
/*
|
||||
* Add new rtt varience to smoothed varience
|
||||
* Add new rtt variance to smoothed varience
|
||||
*/
|
||||
delta >>= 1;
|
||||
rttvar += ((((delta>0)?(delta):(-delta)) - rttvar) >> 2);
|
||||
|
@ -503,7 +503,7 @@ static int __init tcp_bpf_v4_build_proto(void)
|
||||
tcp_bpf_rebuild_protos(tcp_bpf_prots[TCP_BPF_IPV4], &tcp_prot);
|
||||
return 0;
|
||||
}
|
||||
core_initcall(tcp_bpf_v4_build_proto);
|
||||
late_initcall(tcp_bpf_v4_build_proto);
|
||||
|
||||
static int tcp_bpf_assert_proto_ops(struct proto *ops)
|
||||
{
|
||||
|
@ -63,7 +63,7 @@ enum tcp_lp_state {
|
||||
* @sowd: smoothed OWD << 3
|
||||
* @owd_min: min OWD
|
||||
* @owd_max: max OWD
|
||||
* @owd_max_rsv: resrved max owd
|
||||
* @owd_max_rsv: reserved max owd
|
||||
* @remote_hz: estimated remote HZ
|
||||
* @remote_ref_time: remote reference time
|
||||
* @local_ref_time: local reference time
|
||||
@ -305,7 +305,7 @@ static void tcp_lp_pkts_acked(struct sock *sk, const struct ack_sample *sample)
|
||||
|
||||
/* FIXME: try to reset owd_min and owd_max here
|
||||
* so decrease the chance the min/max is no longer suitable
|
||||
* and will usually within threshold when whithin inference */
|
||||
* and will usually within threshold when within inference */
|
||||
lp->owd_min = lp->sowd >> 3;
|
||||
lp->owd_max = lp->sowd >> 2;
|
||||
lp->owd_max_rsv = lp->sowd >> 2;
|
||||
|
@ -134,7 +134,7 @@ static int __init udp_bpf_v4_build_proto(void)
|
||||
udp_bpf_rebuild_protos(&udp_bpf_prots[UDP_BPF_IPV4], &udp_prot);
|
||||
return 0;
|
||||
}
|
||||
core_initcall(udp_bpf_v4_build_proto);
|
||||
late_initcall(udp_bpf_v4_build_proto);
|
||||
|
||||
int udp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
|
||||
{
|
||||
|
@ -51,7 +51,7 @@ ip6_packet_match(const struct sk_buff *skb,
|
||||
const char *outdev,
|
||||
const struct ip6t_ip6 *ip6info,
|
||||
unsigned int *protoff,
|
||||
int *fragoff, bool *hotdrop)
|
||||
u16 *fragoff, bool *hotdrop)
|
||||
{
|
||||
unsigned long ret;
|
||||
const struct ipv6hdr *ipv6 = ipv6_hdr(skb);
|
||||
|
@ -226,7 +226,7 @@ static void pppol2tp_recv(struct l2tp_session *session, struct sk_buff *skb, int
|
||||
/* If the first two bytes are 0xFF03, consider that it is the PPP's
|
||||
* Address and Control fields and skip them. The L2TP module has always
|
||||
* worked this way, although, in theory, the use of these fields should
|
||||
* be negociated and handled at the PPP layer. These fields are
|
||||
* be negotiated and handled at the PPP layer. These fields are
|
||||
* constant: 0xFF is the All-Stations Address and 0x03 the Unnumbered
|
||||
* Information command with Poll/Final bit set to zero (RFC 1662).
|
||||
*/
|
||||
|
@ -1,159 +1,93 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* TTL modification target for IP tables
|
||||
* (C) 2000,2005 by Harald Welte <laforge@netfilter.org>
|
||||
* IP tables module for matching the value of the TTL
|
||||
* (C) 2000,2001 by Harald Welte <laforge@netfilter.org>
|
||||
*
|
||||
* Hop Limit modification target for ip6tables
|
||||
* Maciej Soltysiak <solt@dns.toxicfilms.tv>
|
||||
* Hop Limit matching module
|
||||
* (C) 2001-2002 Maciej Soltysiak <solt@dns.toxicfilms.tv>
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/checksum.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter_ipv4/ipt_TTL.h>
|
||||
#include <linux/netfilter_ipv6/ip6t_HL.h>
|
||||
#include <linux/netfilter_ipv4/ipt_ttl.h>
|
||||
#include <linux/netfilter_ipv6/ip6t_hl.h>
|
||||
|
||||
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
|
||||
MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>");
|
||||
MODULE_DESCRIPTION("Xtables: Hoplimit/TTL Limit field modification target");
|
||||
MODULE_DESCRIPTION("Xtables: Hoplimit/TTL field match");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("ipt_ttl");
|
||||
MODULE_ALIAS("ip6t_hl");
|
||||
|
||||
static unsigned int
|
||||
ttl_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
static bool ttl_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
struct iphdr *iph;
|
||||
const struct ipt_TTL_info *info = par->targinfo;
|
||||
int new_ttl;
|
||||
|
||||
if (skb_ensure_writable(skb, sizeof(*iph)))
|
||||
return NF_DROP;
|
||||
|
||||
iph = ip_hdr(skb);
|
||||
const struct ipt_ttl_info *info = par->matchinfo;
|
||||
const u8 ttl = ip_hdr(skb)->ttl;
|
||||
|
||||
switch (info->mode) {
|
||||
case IPT_TTL_SET:
|
||||
new_ttl = info->ttl;
|
||||
break;
|
||||
case IPT_TTL_INC:
|
||||
new_ttl = iph->ttl + info->ttl;
|
||||
if (new_ttl > 255)
|
||||
new_ttl = 255;
|
||||
break;
|
||||
case IPT_TTL_DEC:
|
||||
new_ttl = iph->ttl - info->ttl;
|
||||
if (new_ttl < 0)
|
||||
new_ttl = 0;
|
||||
break;
|
||||
default:
|
||||
new_ttl = iph->ttl;
|
||||
break;
|
||||
case IPT_TTL_EQ:
|
||||
return ttl == info->ttl;
|
||||
case IPT_TTL_NE:
|
||||
return ttl != info->ttl;
|
||||
case IPT_TTL_LT:
|
||||
return ttl < info->ttl;
|
||||
case IPT_TTL_GT:
|
||||
return ttl > info->ttl;
|
||||
}
|
||||
|
||||
if (new_ttl != iph->ttl) {
|
||||
csum_replace2(&iph->check, htons(iph->ttl << 8),
|
||||
htons(new_ttl << 8));
|
||||
iph->ttl = new_ttl;
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
return false;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
hl_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
static bool hl_mt6(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
struct ipv6hdr *ip6h;
|
||||
const struct ip6t_HL_info *info = par->targinfo;
|
||||
int new_hl;
|
||||
|
||||
if (skb_ensure_writable(skb, sizeof(*ip6h)))
|
||||
return NF_DROP;
|
||||
|
||||
ip6h = ipv6_hdr(skb);
|
||||
const struct ip6t_hl_info *info = par->matchinfo;
|
||||
const struct ipv6hdr *ip6h = ipv6_hdr(skb);
|
||||
|
||||
switch (info->mode) {
|
||||
case IP6T_HL_SET:
|
||||
new_hl = info->hop_limit;
|
||||
break;
|
||||
case IP6T_HL_INC:
|
||||
new_hl = ip6h->hop_limit + info->hop_limit;
|
||||
if (new_hl > 255)
|
||||
new_hl = 255;
|
||||
break;
|
||||
case IP6T_HL_DEC:
|
||||
new_hl = ip6h->hop_limit - info->hop_limit;
|
||||
if (new_hl < 0)
|
||||
new_hl = 0;
|
||||
break;
|
||||
default:
|
||||
new_hl = ip6h->hop_limit;
|
||||
break;
|
||||
case IP6T_HL_EQ:
|
||||
return ip6h->hop_limit == info->hop_limit;
|
||||
case IP6T_HL_NE:
|
||||
return ip6h->hop_limit != info->hop_limit;
|
||||
case IP6T_HL_LT:
|
||||
return ip6h->hop_limit < info->hop_limit;
|
||||
case IP6T_HL_GT:
|
||||
return ip6h->hop_limit > info->hop_limit;
|
||||
}
|
||||
|
||||
ip6h->hop_limit = new_hl;
|
||||
|
||||
return XT_CONTINUE;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int ttl_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ipt_TTL_info *info = par->targinfo;
|
||||
|
||||
if (info->mode > IPT_TTL_MAXMODE)
|
||||
return -EINVAL;
|
||||
if (info->mode != IPT_TTL_SET && info->ttl == 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hl_tg6_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct ip6t_HL_info *info = par->targinfo;
|
||||
|
||||
if (info->mode > IP6T_HL_MAXMODE)
|
||||
return -EINVAL;
|
||||
if (info->mode != IP6T_HL_SET && info->hop_limit == 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xt_target hl_tg_reg[] __read_mostly = {
|
||||
static struct xt_match hl_mt_reg[] __read_mostly = {
|
||||
{
|
||||
.name = "TTL",
|
||||
.name = "ttl",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_IPV4,
|
||||
.target = ttl_tg,
|
||||
.targetsize = sizeof(struct ipt_TTL_info),
|
||||
.table = "mangle",
|
||||
.checkentry = ttl_tg_check,
|
||||
.match = ttl_mt,
|
||||
.matchsize = sizeof(struct ipt_ttl_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "HL",
|
||||
.name = "hl",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_IPV6,
|
||||
.target = hl_tg6,
|
||||
.targetsize = sizeof(struct ip6t_HL_info),
|
||||
.table = "mangle",
|
||||
.checkentry = hl_tg6_check,
|
||||
.match = hl_mt6,
|
||||
.matchsize = sizeof(struct ip6t_hl_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init hl_tg_init(void)
|
||||
static int __init hl_mt_init(void)
|
||||
{
|
||||
return xt_register_targets(hl_tg_reg, ARRAY_SIZE(hl_tg_reg));
|
||||
return xt_register_matches(hl_mt_reg, ARRAY_SIZE(hl_mt_reg));
|
||||
}
|
||||
|
||||
static void __exit hl_tg_exit(void)
|
||||
static void __exit hl_mt_exit(void)
|
||||
{
|
||||
xt_unregister_targets(hl_tg_reg, ARRAY_SIZE(hl_tg_reg));
|
||||
xt_unregister_matches(hl_mt_reg, ARRAY_SIZE(hl_mt_reg));
|
||||
}
|
||||
|
||||
module_init(hl_tg_init);
|
||||
module_exit(hl_tg_exit);
|
||||
MODULE_ALIAS("ipt_TTL");
|
||||
MODULE_ALIAS("ip6t_HL");
|
||||
module_init(hl_mt_init);
|
||||
module_exit(hl_mt_exit);
|
||||
|
@ -1,345 +1,107 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* This is a module which is used for setting the MSS option in TCP packets.
|
||||
*
|
||||
* Copyright (C) 2000 Marc Boucher <marc@mbsi.ca>
|
||||
* Copyright (C) 2007 Patrick McHardy <kaber@trash.net>
|
||||
/* Kernel module to match TCP MSS values. */
|
||||
|
||||
/* Copyright (C) 2000 Marc Boucher <marc@mbsi.ca>
|
||||
* Portions (C) 2005 by Harald Welte <laforge@netfilter.org>
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/flow.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/route.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
#include <linux/netfilter/xt_tcpmss.h>
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
|
||||
#include <linux/netfilter_ipv4/ip_tables.h>
|
||||
#include <linux/netfilter_ipv6/ip6_tables.h>
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_tcpudp.h>
|
||||
#include <linux/netfilter/xt_TCPMSS.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
|
||||
MODULE_DESCRIPTION("Xtables: TCP Maximum Segment Size (MSS) adjustment");
|
||||
MODULE_ALIAS("ipt_TCPMSS");
|
||||
MODULE_ALIAS("ip6t_TCPMSS");
|
||||
MODULE_DESCRIPTION("Xtables: TCP MSS match");
|
||||
MODULE_ALIAS("ipt_tcpmss");
|
||||
MODULE_ALIAS("ip6t_tcpmss");
|
||||
|
||||
static inline unsigned int
|
||||
optlen(const u_int8_t *opt, unsigned int offset)
|
||||
static bool
|
||||
tcpmss_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
/* Beware zero-length options: make finite progress */
|
||||
if (opt[offset] <= TCPOPT_NOP || opt[offset+1] == 0)
|
||||
return 1;
|
||||
else
|
||||
return opt[offset+1];
|
||||
}
|
||||
const struct xt_tcpmss_match_info *info = par->matchinfo;
|
||||
const struct tcphdr *th;
|
||||
struct tcphdr _tcph;
|
||||
/* tcp.doff is only 4 bits, ie. max 15 * 4 bytes */
|
||||
const u_int8_t *op;
|
||||
u8 _opt[15 * 4 - sizeof(_tcph)];
|
||||
unsigned int i, optlen;
|
||||
|
||||
static u_int32_t tcpmss_reverse_mtu(struct net *net,
|
||||
const struct sk_buff *skb,
|
||||
unsigned int family)
|
||||
{
|
||||
struct flowi fl;
|
||||
struct rtable *rt = NULL;
|
||||
u_int32_t mtu = ~0U;
|
||||
/* If we don't have the whole header, drop packet. */
|
||||
th = skb_header_pointer(skb, par->thoff, sizeof(_tcph), &_tcph);
|
||||
if (th == NULL)
|
||||
goto dropit;
|
||||
|
||||
if (family == PF_INET) {
|
||||
struct flowi4 *fl4 = &fl.u.ip4;
|
||||
memset(fl4, 0, sizeof(*fl4));
|
||||
fl4->daddr = ip_hdr(skb)->saddr;
|
||||
} else {
|
||||
struct flowi6 *fl6 = &fl.u.ip6;
|
||||
/* Malformed. */
|
||||
if (th->doff*4 < sizeof(*th))
|
||||
goto dropit;
|
||||
|
||||
memset(fl6, 0, sizeof(*fl6));
|
||||
fl6->daddr = ipv6_hdr(skb)->saddr;
|
||||
}
|
||||
optlen = th->doff*4 - sizeof(*th);
|
||||
if (!optlen)
|
||||
goto out;
|
||||
|
||||
nf_route(net, (struct dst_entry **)&rt, &fl, false, family);
|
||||
if (rt != NULL) {
|
||||
mtu = dst_mtu(&rt->dst);
|
||||
dst_release(&rt->dst);
|
||||
}
|
||||
return mtu;
|
||||
}
|
||||
/* Truncated options. */
|
||||
op = skb_header_pointer(skb, par->thoff + sizeof(*th), optlen, _opt);
|
||||
if (op == NULL)
|
||||
goto dropit;
|
||||
|
||||
static int
|
||||
tcpmss_mangle_packet(struct sk_buff *skb,
|
||||
const struct xt_action_param *par,
|
||||
unsigned int family,
|
||||
unsigned int tcphoff,
|
||||
unsigned int minlen)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
struct tcphdr *tcph;
|
||||
int len, tcp_hdrlen;
|
||||
unsigned int i;
|
||||
__be16 oldval;
|
||||
u16 newmss;
|
||||
u8 *opt;
|
||||
for (i = 0; i < optlen; ) {
|
||||
if (op[i] == TCPOPT_MSS
|
||||
&& (optlen - i) >= TCPOLEN_MSS
|
||||
&& op[i+1] == TCPOLEN_MSS) {
|
||||
u_int16_t mssval;
|
||||
|
||||
/* This is a fragment, no TCP header is available */
|
||||
if (par->fragoff != 0)
|
||||
return 0;
|
||||
mssval = (op[i+2] << 8) | op[i+3];
|
||||
|
||||
if (skb_ensure_writable(skb, skb->len))
|
||||
return -1;
|
||||
|
||||
len = skb->len - tcphoff;
|
||||
if (len < (int)sizeof(struct tcphdr))
|
||||
return -1;
|
||||
|
||||
tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
|
||||
tcp_hdrlen = tcph->doff * 4;
|
||||
|
||||
if (len < tcp_hdrlen || tcp_hdrlen < sizeof(struct tcphdr))
|
||||
return -1;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU) {
|
||||
struct net *net = xt_net(par);
|
||||
unsigned int in_mtu = tcpmss_reverse_mtu(net, skb, family);
|
||||
unsigned int min_mtu = min(dst_mtu(skb_dst(skb)), in_mtu);
|
||||
|
||||
if (min_mtu <= minlen) {
|
||||
net_err_ratelimited("unknown or invalid path-MTU (%u)\n",
|
||||
min_mtu);
|
||||
return -1;
|
||||
}
|
||||
newmss = min_mtu - minlen;
|
||||
} else
|
||||
newmss = info->mss;
|
||||
|
||||
opt = (u_int8_t *)tcph;
|
||||
for (i = sizeof(struct tcphdr); i <= tcp_hdrlen - TCPOLEN_MSS; i += optlen(opt, i)) {
|
||||
if (opt[i] == TCPOPT_MSS && opt[i+1] == TCPOLEN_MSS) {
|
||||
u_int16_t oldmss;
|
||||
|
||||
oldmss = (opt[i+2] << 8) | opt[i+3];
|
||||
|
||||
/* Never increase MSS, even when setting it, as
|
||||
* doing so results in problems for hosts that rely
|
||||
* on MSS being set correctly.
|
||||
*/
|
||||
if (oldmss <= newmss)
|
||||
return 0;
|
||||
|
||||
opt[i+2] = (newmss & 0xff00) >> 8;
|
||||
opt[i+3] = newmss & 0x00ff;
|
||||
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
htons(oldmss), htons(newmss),
|
||||
false);
|
||||
return 0;
|
||||
return (mssval >= info->mss_min &&
|
||||
mssval <= info->mss_max) ^ info->invert;
|
||||
}
|
||||
if (op[i] < 2)
|
||||
i++;
|
||||
else
|
||||
i += op[i+1] ? : 1;
|
||||
}
|
||||
out:
|
||||
return info->invert;
|
||||
|
||||
/* There is data after the header so the option can't be added
|
||||
* without moving it, and doing so may make the SYN packet
|
||||
* itself too large. Accept the packet unmodified instead.
|
||||
*/
|
||||
if (len > tcp_hdrlen)
|
||||
return 0;
|
||||
|
||||
/* tcph->doff has 4 bits, do not wrap it to 0 */
|
||||
if (tcp_hdrlen >= 15 * 4)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* MSS Option not found ?! add it..
|
||||
*/
|
||||
if (skb_tailroom(skb) < TCPOLEN_MSS) {
|
||||
if (pskb_expand_head(skb, 0,
|
||||
TCPOLEN_MSS - skb_tailroom(skb),
|
||||
GFP_ATOMIC))
|
||||
return -1;
|
||||
tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff);
|
||||
}
|
||||
|
||||
skb_put(skb, TCPOLEN_MSS);
|
||||
|
||||
/*
|
||||
* IPv4: RFC 1122 states "If an MSS option is not received at
|
||||
* connection setup, TCP MUST assume a default send MSS of 536".
|
||||
* IPv6: RFC 2460 states IPv6 has a minimum MTU of 1280 and a minimum
|
||||
* length IPv6 header of 60, ergo the default MSS value is 1220
|
||||
* Since no MSS was provided, we must use the default values
|
||||
*/
|
||||
if (xt_family(par) == NFPROTO_IPV4)
|
||||
newmss = min(newmss, (u16)536);
|
||||
else
|
||||
newmss = min(newmss, (u16)1220);
|
||||
|
||||
opt = (u_int8_t *)tcph + sizeof(struct tcphdr);
|
||||
memmove(opt + TCPOLEN_MSS, opt, len - sizeof(struct tcphdr));
|
||||
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
htons(len), htons(len + TCPOLEN_MSS), true);
|
||||
opt[0] = TCPOPT_MSS;
|
||||
opt[1] = TCPOLEN_MSS;
|
||||
opt[2] = (newmss & 0xff00) >> 8;
|
||||
opt[3] = newmss & 0x00ff;
|
||||
|
||||
inet_proto_csum_replace4(&tcph->check, skb, 0, *((__be32 *)opt), false);
|
||||
|
||||
oldval = ((__be16 *)tcph)[6];
|
||||
tcph->doff += TCPOLEN_MSS/4;
|
||||
inet_proto_csum_replace2(&tcph->check, skb,
|
||||
oldval, ((__be16 *)tcph)[6], false);
|
||||
return TCPOLEN_MSS;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
tcpmss_tg4(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
__be16 newlen;
|
||||
int ret;
|
||||
|
||||
ret = tcpmss_mangle_packet(skb, par,
|
||||
PF_INET,
|
||||
iph->ihl * 4,
|
||||
sizeof(*iph) + sizeof(struct tcphdr));
|
||||
if (ret < 0)
|
||||
return NF_DROP;
|
||||
if (ret > 0) {
|
||||
iph = ip_hdr(skb);
|
||||
newlen = htons(ntohs(iph->tot_len) + ret);
|
||||
csum_replace2(&iph->check, iph->tot_len, newlen);
|
||||
iph->tot_len = newlen;
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
static unsigned int
|
||||
tcpmss_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
|
||||
u8 nexthdr;
|
||||
__be16 frag_off, oldlen, newlen;
|
||||
int tcphoff;
|
||||
int ret;
|
||||
|
||||
nexthdr = ipv6h->nexthdr;
|
||||
tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr, &frag_off);
|
||||
if (tcphoff < 0)
|
||||
return NF_DROP;
|
||||
ret = tcpmss_mangle_packet(skb, par,
|
||||
PF_INET6,
|
||||
tcphoff,
|
||||
sizeof(*ipv6h) + sizeof(struct tcphdr));
|
||||
if (ret < 0)
|
||||
return NF_DROP;
|
||||
if (ret > 0) {
|
||||
ipv6h = ipv6_hdr(skb);
|
||||
oldlen = ipv6h->payload_len;
|
||||
newlen = htons(ntohs(oldlen) + ret);
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
skb->csum = csum_add(csum_sub(skb->csum, oldlen),
|
||||
newlen);
|
||||
ipv6h->payload_len = newlen;
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Must specify -p tcp --syn */
|
||||
static inline bool find_syn_match(const struct xt_entry_match *m)
|
||||
{
|
||||
const struct xt_tcp *tcpinfo = (const struct xt_tcp *)m->data;
|
||||
|
||||
if (strcmp(m->u.kernel.match->name, "tcp") == 0 &&
|
||||
tcpinfo->flg_cmp & TCPHDR_SYN &&
|
||||
!(tcpinfo->invflags & XT_TCP_INV_FLAGS))
|
||||
return true;
|
||||
|
||||
dropit:
|
||||
par->hotdrop = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int tcpmss_tg4_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
const struct ipt_entry *e = par->entryinfo;
|
||||
const struct xt_entry_match *ematch;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU &&
|
||||
(par->hook_mask & ~((1 << NF_INET_FORWARD) |
|
||||
(1 << NF_INET_LOCAL_OUT) |
|
||||
(1 << NF_INET_POST_ROUTING))) != 0) {
|
||||
pr_info_ratelimited("path-MTU clamping only supported in FORWARD, OUTPUT and POSTROUTING hooks\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (par->nft_compat)
|
||||
return 0;
|
||||
|
||||
xt_ematch_foreach(ematch, e)
|
||||
if (find_syn_match(ematch))
|
||||
return 0;
|
||||
pr_info_ratelimited("Only works on TCP SYN packets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
static int tcpmss_tg6_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_tcpmss_info *info = par->targinfo;
|
||||
const struct ip6t_entry *e = par->entryinfo;
|
||||
const struct xt_entry_match *ematch;
|
||||
|
||||
if (info->mss == XT_TCPMSS_CLAMP_PMTU &&
|
||||
(par->hook_mask & ~((1 << NF_INET_FORWARD) |
|
||||
(1 << NF_INET_LOCAL_OUT) |
|
||||
(1 << NF_INET_POST_ROUTING))) != 0) {
|
||||
pr_info_ratelimited("path-MTU clamping only supported in FORWARD, OUTPUT and POSTROUTING hooks\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (par->nft_compat)
|
||||
return 0;
|
||||
|
||||
xt_ematch_foreach(ematch, e)
|
||||
if (find_syn_match(ematch))
|
||||
return 0;
|
||||
pr_info_ratelimited("Only works on TCP SYN packets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct xt_target tcpmss_tg_reg[] __read_mostly = {
|
||||
static struct xt_match tcpmss_mt_reg[] __read_mostly = {
|
||||
{
|
||||
.name = "tcpmss",
|
||||
.family = NFPROTO_IPV4,
|
||||
.name = "TCPMSS",
|
||||
.checkentry = tcpmss_tg4_check,
|
||||
.target = tcpmss_tg4,
|
||||
.targetsize = sizeof(struct xt_tcpmss_info),
|
||||
.match = tcpmss_mt,
|
||||
.matchsize = sizeof(struct xt_tcpmss_match_info),
|
||||
.proto = IPPROTO_TCP,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
|
||||
{
|
||||
.name = "tcpmss",
|
||||
.family = NFPROTO_IPV6,
|
||||
.name = "TCPMSS",
|
||||
.checkentry = tcpmss_tg6_check,
|
||||
.target = tcpmss_tg6,
|
||||
.targetsize = sizeof(struct xt_tcpmss_info),
|
||||
.match = tcpmss_mt,
|
||||
.matchsize = sizeof(struct xt_tcpmss_match_info),
|
||||
.proto = IPPROTO_TCP,
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init tcpmss_tg_init(void)
|
||||
static int __init tcpmss_mt_init(void)
|
||||
{
|
||||
return xt_register_targets(tcpmss_tg_reg, ARRAY_SIZE(tcpmss_tg_reg));
|
||||
return xt_register_matches(tcpmss_mt_reg, ARRAY_SIZE(tcpmss_mt_reg));
|
||||
}
|
||||
|
||||
static void __exit tcpmss_tg_exit(void)
|
||||
static void __exit tcpmss_mt_exit(void)
|
||||
{
|
||||
xt_unregister_targets(tcpmss_tg_reg, ARRAY_SIZE(tcpmss_tg_reg));
|
||||
xt_unregister_matches(tcpmss_mt_reg, ARRAY_SIZE(tcpmss_mt_reg));
|
||||
}
|
||||
|
||||
module_init(tcpmss_tg_init);
|
||||
module_exit(tcpmss_tg_exit);
|
||||
module_init(tcpmss_mt_init);
|
||||
module_exit(tcpmss_mt_exit);
|
||||
|
@ -1,8 +1,11 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* IP tables module for matching the value of the IPv4/IPv6 DSCP field
|
||||
/* x_tables module for setting the IPv4/IPv6 DSCP field, Version 1.8
|
||||
*
|
||||
* (C) 2002 by Harald Welte <laforge@netfilter.org>
|
||||
*/
|
||||
* based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
|
||||
*
|
||||
* See RFC2474 for a description of the DSCP field within the IP Header.
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
@ -11,100 +14,148 @@
|
||||
#include <net/dsfield.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_dscp.h>
|
||||
#include <linux/netfilter/xt_DSCP.h>
|
||||
|
||||
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
|
||||
MODULE_DESCRIPTION("Xtables: DSCP/TOS field match");
|
||||
MODULE_DESCRIPTION("Xtables: DSCP/TOS field modification");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("ipt_dscp");
|
||||
MODULE_ALIAS("ip6t_dscp");
|
||||
MODULE_ALIAS("ipt_tos");
|
||||
MODULE_ALIAS("ip6t_tos");
|
||||
MODULE_ALIAS("ipt_DSCP");
|
||||
MODULE_ALIAS("ip6t_DSCP");
|
||||
MODULE_ALIAS("ipt_TOS");
|
||||
MODULE_ALIAS("ip6t_TOS");
|
||||
|
||||
static bool
|
||||
dscp_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
static unsigned int
|
||||
dscp_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_dscp_info *info = par->matchinfo;
|
||||
const struct xt_DSCP_info *dinfo = par->targinfo;
|
||||
u_int8_t dscp = ipv4_get_dsfield(ip_hdr(skb)) >> XT_DSCP_SHIFT;
|
||||
|
||||
return (dscp == info->dscp) ^ !!info->invert;
|
||||
if (dscp != dinfo->dscp) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
|
||||
ipv4_change_dsfield(ip_hdr(skb),
|
||||
(__force __u8)(~XT_DSCP_MASK),
|
||||
dinfo->dscp << XT_DSCP_SHIFT);
|
||||
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static bool
|
||||
dscp_mt6(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
static unsigned int
|
||||
dscp_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_dscp_info *info = par->matchinfo;
|
||||
const struct xt_DSCP_info *dinfo = par->targinfo;
|
||||
u_int8_t dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> XT_DSCP_SHIFT;
|
||||
|
||||
return (dscp == info->dscp) ^ !!info->invert;
|
||||
if (dscp != dinfo->dscp) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct ipv6hdr)))
|
||||
return NF_DROP;
|
||||
|
||||
ipv6_change_dsfield(ipv6_hdr(skb),
|
||||
(__force __u8)(~XT_DSCP_MASK),
|
||||
dinfo->dscp << XT_DSCP_SHIFT);
|
||||
}
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static int dscp_mt_check(const struct xt_mtchk_param *par)
|
||||
static int dscp_tg_check(const struct xt_tgchk_param *par)
|
||||
{
|
||||
const struct xt_dscp_info *info = par->matchinfo;
|
||||
const struct xt_DSCP_info *info = par->targinfo;
|
||||
|
||||
if (info->dscp > XT_DSCP_MAX)
|
||||
return -EDOM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool tos_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
static unsigned int
|
||||
tos_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_tos_match_info *info = par->matchinfo;
|
||||
const struct xt_tos_target_info *info = par->targinfo;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
u_int8_t orig, nv;
|
||||
|
||||
if (xt_family(par) == NFPROTO_IPV4)
|
||||
return ((ip_hdr(skb)->tos & info->tos_mask) ==
|
||||
info->tos_value) ^ !!info->invert;
|
||||
else
|
||||
return ((ipv6_get_dsfield(ipv6_hdr(skb)) & info->tos_mask) ==
|
||||
info->tos_value) ^ !!info->invert;
|
||||
orig = ipv4_get_dsfield(iph);
|
||||
nv = (orig & ~info->tos_mask) ^ info->tos_value;
|
||||
|
||||
if (orig != nv) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
iph = ip_hdr(skb);
|
||||
ipv4_change_dsfield(iph, 0, nv);
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static struct xt_match dscp_mt_reg[] __read_mostly = {
|
||||
static unsigned int
|
||||
tos_tg6(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_tos_target_info *info = par->targinfo;
|
||||
struct ipv6hdr *iph = ipv6_hdr(skb);
|
||||
u_int8_t orig, nv;
|
||||
|
||||
orig = ipv6_get_dsfield(iph);
|
||||
nv = (orig & ~info->tos_mask) ^ info->tos_value;
|
||||
|
||||
if (orig != nv) {
|
||||
if (skb_ensure_writable(skb, sizeof(struct iphdr)))
|
||||
return NF_DROP;
|
||||
iph = ipv6_hdr(skb);
|
||||
ipv6_change_dsfield(iph, 0, nv);
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static struct xt_target dscp_tg_reg[] __read_mostly = {
|
||||
{
|
||||
.name = "dscp",
|
||||
.name = "DSCP",
|
||||
.family = NFPROTO_IPV4,
|
||||
.checkentry = dscp_mt_check,
|
||||
.match = dscp_mt,
|
||||
.matchsize = sizeof(struct xt_dscp_info),
|
||||
.checkentry = dscp_tg_check,
|
||||
.target = dscp_tg,
|
||||
.targetsize = sizeof(struct xt_DSCP_info),
|
||||
.table = "mangle",
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "dscp",
|
||||
.name = "DSCP",
|
||||
.family = NFPROTO_IPV6,
|
||||
.checkentry = dscp_mt_check,
|
||||
.match = dscp_mt6,
|
||||
.matchsize = sizeof(struct xt_dscp_info),
|
||||
.checkentry = dscp_tg_check,
|
||||
.target = dscp_tg6,
|
||||
.targetsize = sizeof(struct xt_DSCP_info),
|
||||
.table = "mangle",
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "tos",
|
||||
.name = "TOS",
|
||||
.revision = 1,
|
||||
.family = NFPROTO_IPV4,
|
||||
.match = tos_mt,
|
||||
.matchsize = sizeof(struct xt_tos_match_info),
|
||||
.table = "mangle",
|
||||
.target = tos_tg,
|
||||
.targetsize = sizeof(struct xt_tos_target_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
{
|
||||
.name = "tos",
|
||||
.name = "TOS",
|
||||
.revision = 1,
|
||||
.family = NFPROTO_IPV6,
|
||||
.match = tos_mt,
|
||||
.matchsize = sizeof(struct xt_tos_match_info),
|
||||
.table = "mangle",
|
||||
.target = tos_tg6,
|
||||
.targetsize = sizeof(struct xt_tos_target_info),
|
||||
.me = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init dscp_mt_init(void)
|
||||
static int __init dscp_tg_init(void)
|
||||
{
|
||||
return xt_register_matches(dscp_mt_reg, ARRAY_SIZE(dscp_mt_reg));
|
||||
return xt_register_targets(dscp_tg_reg, ARRAY_SIZE(dscp_tg_reg));
|
||||
}
|
||||
|
||||
static void __exit dscp_mt_exit(void)
|
||||
static void __exit dscp_tg_exit(void)
|
||||
{
|
||||
xt_unregister_matches(dscp_mt_reg, ARRAY_SIZE(dscp_mt_reg));
|
||||
xt_unregister_targets(dscp_tg_reg, ARRAY_SIZE(dscp_tg_reg));
|
||||
}
|
||||
|
||||
module_init(dscp_mt_init);
|
||||
module_exit(dscp_mt_exit);
|
||||
module_init(dscp_tg_init);
|
||||
module_exit(dscp_tg_exit);
|
||||
|
@ -5,149 +5,228 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/gen_stats.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/gen_stats.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/netns/generic.h>
|
||||
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/xt_rateest.h>
|
||||
#include <linux/netfilter/xt_RATEEST.h>
|
||||
#include <net/netfilter/xt_rateest.h>
|
||||
|
||||
#define RATEEST_HSIZE 16
|
||||
|
||||
static bool
|
||||
xt_rateest_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
struct xt_rateest_net {
|
||||
struct mutex hash_lock;
|
||||
struct hlist_head hash[RATEEST_HSIZE];
|
||||
};
|
||||
|
||||
static unsigned int xt_rateest_id;
|
||||
|
||||
static unsigned int jhash_rnd __read_mostly;
|
||||
|
||||
static unsigned int xt_rateest_hash(const char *name)
|
||||
{
|
||||
const struct xt_rateest_match_info *info = par->matchinfo;
|
||||
struct gnet_stats_rate_est64 sample = {0};
|
||||
u_int32_t bps1, bps2, pps1, pps2;
|
||||
bool ret = true;
|
||||
return jhash(name, sizeof_field(struct xt_rateest, name), jhash_rnd) &
|
||||
(RATEEST_HSIZE - 1);
|
||||
}
|
||||
|
||||
gen_estimator_read(&info->est1->rate_est, &sample);
|
||||
static void xt_rateest_hash_insert(struct xt_rateest_net *xn,
|
||||
struct xt_rateest *est)
|
||||
{
|
||||
unsigned int h;
|
||||
|
||||
if (info->flags & XT_RATEEST_MATCH_DELTA) {
|
||||
bps1 = info->bps1 >= sample.bps ? info->bps1 - sample.bps : 0;
|
||||
pps1 = info->pps1 >= sample.pps ? info->pps1 - sample.pps : 0;
|
||||
} else {
|
||||
bps1 = sample.bps;
|
||||
pps1 = sample.pps;
|
||||
}
|
||||
h = xt_rateest_hash(est->name);
|
||||
hlist_add_head(&est->list, &xn->hash[h]);
|
||||
}
|
||||
|
||||
if (info->flags & XT_RATEEST_MATCH_ABS) {
|
||||
bps2 = info->bps2;
|
||||
pps2 = info->pps2;
|
||||
} else {
|
||||
gen_estimator_read(&info->est2->rate_est, &sample);
|
||||
static struct xt_rateest *__xt_rateest_lookup(struct xt_rateest_net *xn,
|
||||
const char *name)
|
||||
{
|
||||
struct xt_rateest *est;
|
||||
unsigned int h;
|
||||
|
||||
if (info->flags & XT_RATEEST_MATCH_DELTA) {
|
||||
bps2 = info->bps2 >= sample.bps ? info->bps2 - sample.bps : 0;
|
||||
pps2 = info->pps2 >= sample.pps ? info->pps2 - sample.pps : 0;
|
||||
} else {
|
||||
bps2 = sample.bps;
|
||||
pps2 = sample.pps;
|
||||
h = xt_rateest_hash(name);
|
||||
hlist_for_each_entry(est, &xn->hash[h], list) {
|
||||
if (strcmp(est->name, name) == 0) {
|
||||
est->refcnt++;
|
||||
return est;
|
||||
}
|
||||
}
|
||||
|
||||
switch (info->mode) {
|
||||
case XT_RATEEST_MATCH_LT:
|
||||
if (info->flags & XT_RATEEST_MATCH_BPS)
|
||||
ret &= bps1 < bps2;
|
||||
if (info->flags & XT_RATEEST_MATCH_PPS)
|
||||
ret &= pps1 < pps2;
|
||||
break;
|
||||
case XT_RATEEST_MATCH_GT:
|
||||
if (info->flags & XT_RATEEST_MATCH_BPS)
|
||||
ret &= bps1 > bps2;
|
||||
if (info->flags & XT_RATEEST_MATCH_PPS)
|
||||
ret &= pps1 > pps2;
|
||||
break;
|
||||
case XT_RATEEST_MATCH_EQ:
|
||||
if (info->flags & XT_RATEEST_MATCH_BPS)
|
||||
ret &= bps1 == bps2;
|
||||
if (info->flags & XT_RATEEST_MATCH_PPS)
|
||||
ret &= pps1 == pps2;
|
||||
break;
|
||||
}
|
||||
|
||||
ret ^= info->flags & XT_RATEEST_MATCH_INVERT ? true : false;
|
||||
return ret;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int xt_rateest_mt_checkentry(const struct xt_mtchk_param *par)
|
||||
struct xt_rateest *xt_rateest_lookup(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_rateest_match_info *info = par->matchinfo;
|
||||
struct xt_rateest *est1, *est2;
|
||||
int ret = -EINVAL;
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
struct xt_rateest *est;
|
||||
|
||||
if (hweight32(info->flags & (XT_RATEEST_MATCH_ABS |
|
||||
XT_RATEEST_MATCH_REL)) != 1)
|
||||
goto err1;
|
||||
mutex_lock(&xn->hash_lock);
|
||||
est = __xt_rateest_lookup(xn, name);
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return est;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xt_rateest_lookup);
|
||||
|
||||
if (!(info->flags & (XT_RATEEST_MATCH_BPS | XT_RATEEST_MATCH_PPS)))
|
||||
goto err1;
|
||||
void xt_rateest_put(struct net *net, struct xt_rateest *est)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
|
||||
switch (info->mode) {
|
||||
case XT_RATEEST_MATCH_EQ:
|
||||
case XT_RATEEST_MATCH_LT:
|
||||
case XT_RATEEST_MATCH_GT:
|
||||
break;
|
||||
default:
|
||||
goto err1;
|
||||
mutex_lock(&xn->hash_lock);
|
||||
if (--est->refcnt == 0) {
|
||||
hlist_del(&est->list);
|
||||
gen_kill_estimator(&est->rate_est);
|
||||
/*
|
||||
* gen_estimator est_timer() might access est->lock or bstats,
|
||||
* wait a RCU grace period before freeing 'est'
|
||||
*/
|
||||
kfree_rcu(est, rcu);
|
||||
}
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xt_rateest_put);
|
||||
|
||||
static unsigned int
|
||||
xt_rateest_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct xt_rateest_target_info *info = par->targinfo;
|
||||
struct gnet_stats_basic_packed *stats = &info->est->bstats;
|
||||
|
||||
spin_lock_bh(&info->est->lock);
|
||||
stats->bytes += skb->len;
|
||||
stats->packets++;
|
||||
spin_unlock_bh(&info->est->lock);
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
||||
static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
struct xt_rateest_net *xn = net_generic(par->net, xt_rateest_id);
|
||||
struct xt_rateest_target_info *info = par->targinfo;
|
||||
struct xt_rateest *est;
|
||||
struct {
|
||||
struct nlattr opt;
|
||||
struct gnet_estimator est;
|
||||
} cfg;
|
||||
int ret;
|
||||
|
||||
if (strnlen(info->name, sizeof(est->name)) >= sizeof(est->name))
|
||||
return -ENAMETOOLONG;
|
||||
|
||||
net_get_random_once(&jhash_rnd, sizeof(jhash_rnd));
|
||||
|
||||
mutex_lock(&xn->hash_lock);
|
||||
est = __xt_rateest_lookup(xn, info->name);
|
||||
if (est) {
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
/*
|
||||
* If estimator parameters are specified, they must match the
|
||||
* existing estimator.
|
||||
*/
|
||||
if ((!info->interval && !info->ewma_log) ||
|
||||
(info->interval != est->params.interval ||
|
||||
info->ewma_log != est->params.ewma_log)) {
|
||||
xt_rateest_put(par->net, est);
|
||||
return -EINVAL;
|
||||
}
|
||||
info->est = est;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = -ENOENT;
|
||||
est1 = xt_rateest_lookup(par->net, info->name1);
|
||||
if (!est1)
|
||||
ret = -ENOMEM;
|
||||
est = kzalloc(sizeof(*est), GFP_KERNEL);
|
||||
if (!est)
|
||||
goto err1;
|
||||
|
||||
est2 = NULL;
|
||||
if (info->flags & XT_RATEEST_MATCH_REL) {
|
||||
est2 = xt_rateest_lookup(par->net, info->name2);
|
||||
if (!est2)
|
||||
goto err2;
|
||||
}
|
||||
strlcpy(est->name, info->name, sizeof(est->name));
|
||||
spin_lock_init(&est->lock);
|
||||
est->refcnt = 1;
|
||||
est->params.interval = info->interval;
|
||||
est->params.ewma_log = info->ewma_log;
|
||||
|
||||
info->est1 = est1;
|
||||
info->est2 = est2;
|
||||
cfg.opt.nla_len = nla_attr_size(sizeof(cfg.est));
|
||||
cfg.opt.nla_type = TCA_STATS_RATE_EST;
|
||||
cfg.est.interval = info->interval;
|
||||
cfg.est.ewma_log = info->ewma_log;
|
||||
|
||||
ret = gen_new_estimator(&est->bstats, NULL, &est->rate_est,
|
||||
&est->lock, NULL, &cfg.opt);
|
||||
if (ret < 0)
|
||||
goto err2;
|
||||
|
||||
info->est = est;
|
||||
xt_rateest_hash_insert(xn, est);
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
xt_rateest_put(par->net, est1);
|
||||
kfree(est);
|
||||
err1:
|
||||
mutex_unlock(&xn->hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void xt_rateest_mt_destroy(const struct xt_mtdtor_param *par)
|
||||
static void xt_rateest_tg_destroy(const struct xt_tgdtor_param *par)
|
||||
{
|
||||
struct xt_rateest_match_info *info = par->matchinfo;
|
||||
struct xt_rateest_target_info *info = par->targinfo;
|
||||
|
||||
xt_rateest_put(par->net, info->est1);
|
||||
if (info->est2)
|
||||
xt_rateest_put(par->net, info->est2);
|
||||
xt_rateest_put(par->net, info->est);
|
||||
}
|
||||
|
||||
static struct xt_match xt_rateest_mt_reg __read_mostly = {
|
||||
.name = "rateest",
|
||||
static struct xt_target xt_rateest_tg_reg __read_mostly = {
|
||||
.name = "RATEEST",
|
||||
.revision = 0,
|
||||
.family = NFPROTO_UNSPEC,
|
||||
.match = xt_rateest_mt,
|
||||
.checkentry = xt_rateest_mt_checkentry,
|
||||
.destroy = xt_rateest_mt_destroy,
|
||||
.matchsize = sizeof(struct xt_rateest_match_info),
|
||||
.usersize = offsetof(struct xt_rateest_match_info, est1),
|
||||
.target = xt_rateest_tg,
|
||||
.checkentry = xt_rateest_tg_checkentry,
|
||||
.destroy = xt_rateest_tg_destroy,
|
||||
.targetsize = sizeof(struct xt_rateest_target_info),
|
||||
.usersize = offsetof(struct xt_rateest_target_info, est),
|
||||
.me = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int __init xt_rateest_mt_init(void)
|
||||
static __net_init int xt_rateest_net_init(struct net *net)
|
||||
{
|
||||
return xt_register_match(&xt_rateest_mt_reg);
|
||||
struct xt_rateest_net *xn = net_generic(net, xt_rateest_id);
|
||||
int i;
|
||||
|
||||
mutex_init(&xn->hash_lock);
|
||||
for (i = 0; i < ARRAY_SIZE(xn->hash); i++)
|
||||
INIT_HLIST_HEAD(&xn->hash[i]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit xt_rateest_mt_fini(void)
|
||||
static struct pernet_operations xt_rateest_net_ops = {
|
||||
.init = xt_rateest_net_init,
|
||||
.id = &xt_rateest_id,
|
||||
.size = sizeof(struct xt_rateest_net),
|
||||
};
|
||||
|
||||
static int __init xt_rateest_tg_init(void)
|
||||
{
|
||||
xt_unregister_match(&xt_rateest_mt_reg);
|
||||
int err = register_pernet_subsys(&xt_rateest_net_ops);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
return xt_register_target(&xt_rateest_tg_reg);
|
||||
}
|
||||
|
||||
static void __exit xt_rateest_tg_fini(void)
|
||||
{
|
||||
xt_unregister_target(&xt_rateest_tg_reg);
|
||||
unregister_pernet_subsys(&xt_rateest_net_ops);
|
||||
}
|
||||
|
||||
|
||||
MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("xtables rate estimator match");
|
||||
MODULE_ALIAS("ipt_rateest");
|
||||
MODULE_ALIAS("ip6t_rateest");
|
||||
module_init(xt_rateest_mt_init);
|
||||
module_exit(xt_rateest_mt_fini);
|
||||
MODULE_DESCRIPTION("Xtables: packet rate estimator");
|
||||
MODULE_ALIAS("ipt_RATEEST");
|
||||
MODULE_ALIAS("ip6t_RATEEST");
|
||||
module_init(xt_rateest_tg_init);
|
||||
module_exit(xt_rateest_tg_fini);
|
||||
|
@ -1217,7 +1217,7 @@ static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
|
||||
|
||||
/* ACK */
|
||||
if (ddev->atn_count) {
|
||||
/* The target has previously recevied one or more ATN
|
||||
/* The target has previously received one or more ATN
|
||||
* PDUs.
|
||||
*/
|
||||
ddev->atn_count = 0;
|
||||
|
@ -406,7 +406,7 @@ static void llc_shdlc_rcv_u_frame(struct llc_shdlc *shdlc,
|
||||
case SHDLC_NEGOTIATING:
|
||||
case SHDLC_CONNECTING:
|
||||
/*
|
||||
* We sent RSET, but chip wants to negociate or we
|
||||
* We sent RSET, but chip wants to negotiate or we
|
||||
* got RSET before we managed to send out our.
|
||||
*/
|
||||
if (skb->len > 0)
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
/*
|
||||
Comparing to general packet classification problem,
|
||||
RSVP needs only sevaral relatively simple rules:
|
||||
RSVP needs only several relatively simple rules:
|
||||
|
||||
* (dst, protocol) are always specified,
|
||||
so that we are able to hash them.
|
||||
|
@ -104,8 +104,8 @@ void sctp_packet_config(struct sctp_packet *packet, __u32 vtag,
|
||||
if (asoc->param_flags & SPP_PMTUD_ENABLE)
|
||||
sctp_assoc_sync_pmtu(asoc);
|
||||
} else if (!sctp_transport_pl_enabled(tp) &&
|
||||
!sctp_transport_pmtu_check(tp)) {
|
||||
if (asoc->param_flags & SPP_PMTUD_ENABLE)
|
||||
asoc->param_flags & SPP_PMTUD_ENABLE) {
|
||||
if (!sctp_transport_pmtu_check(tp))
|
||||
sctp_assoc_sync_pmtu(asoc);
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
extern struct genl_family smc_gen_nl_family;
|
||||
|
||||
struct smc_nl_dmp_ctx {
|
||||
int pos[2];
|
||||
int pos[3];
|
||||
};
|
||||
|
||||
static inline struct smc_nl_dmp_ctx *smc_nl_dmp_ctx(struct netlink_callback *c)
|
||||
|
@ -66,7 +66,7 @@ static void tipc_sub_send_event(struct tipc_subscription *sub,
|
||||
/**
|
||||
* tipc_sub_check_overlap - test for subscription overlap with the given values
|
||||
* @subscribed: the service range subscribed for
|
||||
* @found: the service range we are checning for match
|
||||
* @found: the service range we are checking for match
|
||||
*
|
||||
* Returns true if there is overlap, otherwise false.
|
||||
*/
|
||||
|
@ -10,7 +10,7 @@
|
||||
Usage() {
|
||||
echo "Script for testing HBM (Host Bandwidth Manager) framework."
|
||||
echo "It creates a cgroup to use for testing and load a BPF program to limit"
|
||||
echo "egress or ingress bandwidht. It then uses iperf3 or netperf to create"
|
||||
echo "egress or ingress bandwidth. It then uses iperf3 or netperf to create"
|
||||
echo "loads. The output is the goodput in Mbps (unless -D was used)."
|
||||
echo ""
|
||||
echo "USAGE: $name [out] [-b=<prog>|--bpf=<prog>] [-c=<cc>|--cc=<cc>]"
|
||||
|
@ -24,7 +24,7 @@ my $help = 0;
|
||||
my $fix = 0;
|
||||
my $warn = 0;
|
||||
|
||||
if (! -d ".git") {
|
||||
if (! -e ".git") {
|
||||
printf "Warning: can't check if file exists, as this is not a git tree\n";
|
||||
exit 0;
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ from __future__ import print_function
|
||||
import os, sys, errno
|
||||
import subprocess
|
||||
|
||||
# Extract and prepare jobserver file descriptors from envirnoment.
|
||||
# Extract and prepare jobserver file descriptors from environment.
|
||||
claim = 0
|
||||
jobs = b""
|
||||
try:
|
||||
|
@ -363,7 +363,7 @@ void print_title(WINDOW *dialog, const char *title, int width)
|
||||
/*
|
||||
* Print a string of text in a window, automatically wrap around to the
|
||||
* next line if the string is too long to fit on one line. Newline
|
||||
* characters '\n' are propperly processed. We start on a new line
|
||||
* characters '\n' are properly processed. We start on a new line
|
||||
* if there is no room for at least 4 nonblanks following a double-space.
|
||||
*/
|
||||
void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
|
||||
@ -541,7 +541,7 @@ int first_alpha(const char *string, const char *exempt)
|
||||
* lxdialog suggest <ESC> <ESC> which is correctly translated to two
|
||||
* times esc. But then we need to ignore the second esc to avoid stepping
|
||||
* out one menu too much. Filter away all escaped key sequences since
|
||||
* keypad(FALSE) turn off ncurses support for escape sequences - and thats
|
||||
* keypad(FALSE) turn off ncurses support for escape sequences - and that's
|
||||
* needed to make notimeout() do as expected.
|
||||
*/
|
||||
int on_key_esc(WINDOW *win)
|
||||
|
@ -4277,6 +4277,9 @@ static int stac_parse_auto_config(struct hda_codec *codec)
|
||||
|
||||
spec->gen.automute_hook = stac_update_outputs;
|
||||
|
||||
if (spec->gpio_led)
|
||||
snd_hda_gen_add_mute_led_cdev(codec, stac_vmaster_hook);
|
||||
|
||||
err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -4318,9 +4321,6 @@ static int stac_parse_auto_config(struct hda_codec *codec)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (spec->gpio_led)
|
||||
snd_hda_gen_add_mute_led_cdev(codec, stac_vmaster_hook);
|
||||
|
||||
if (spec->aloopback_ctl &&
|
||||
snd_hda_get_bool_hint(codec, "loopback") == 1) {
|
||||
unsigned int wr_verb =
|
||||
|
@ -308,7 +308,7 @@ Indicates Interrupt status, which interrupt has occurred, and can clear
|
||||
each interrupt in this register.
|
||||
Writing 1b to a field containing 1b clears field and de-asserts interrupt.
|
||||
Writing 0b to a field has no effect.
|
||||
Field vaules are the following:
|
||||
Field values are the following:
|
||||
0 - Interrupt hasn't occurred.
|
||||
1 - Interrupt has occurred.
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
#include "cs35l33.h"
|
||||
#include "cirrus_legacy.h"
|
||||
|
||||
#define CS35L33_BOOT_DELAY 50
|
||||
|
||||
@ -1190,12 +1191,12 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client,
|
||||
regcache_cache_only(cs35l33->regmap, false);
|
||||
|
||||
/* initialize codec */
|
||||
ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_AB, ®);
|
||||
devid = (reg & 0xFF) << 12;
|
||||
ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_CD, ®);
|
||||
devid |= (reg & 0xFF) << 4;
|
||||
ret = regmap_read(cs35l33->regmap, CS35L33_DEVID_E, ®);
|
||||
devid |= (reg & 0xF0) >> 4;
|
||||
devid = cirrus_read_device_id(cs35l33->regmap, CS35L33_DEVID_AB);
|
||||
if (devid < 0) {
|
||||
ret = devid;
|
||||
dev_err(&i2c_client->dev, "Failed to read device ID: %d\n", ret);
|
||||
goto err_enable;
|
||||
}
|
||||
|
||||
if (devid != CS35L33_CHIP_ID) {
|
||||
dev_err(&i2c_client->dev,
|
||||
@ -1243,6 +1244,8 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client,
|
||||
return 0;
|
||||
|
||||
err_enable:
|
||||
gpiod_set_value_cansleep(cs35l33->reset_gpio, 0);
|
||||
|
||||
regulator_bulk_disable(cs35l33->num_core_supplies,
|
||||
cs35l33->core_supplies);
|
||||
|
||||
|
@ -1498,8 +1498,8 @@ static int rt5651_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
|
||||
snd_soc_component_write(component, RT5651_PLL_CTRL1,
|
||||
pll_code.n_code << RT5651_PLL_N_SFT | pll_code.k_code);
|
||||
snd_soc_component_write(component, RT5651_PLL_CTRL2,
|
||||
(pll_code.m_bp ? 0 : pll_code.m_code) << RT5651_PLL_M_SFT |
|
||||
pll_code.m_bp << RT5651_PLL_M_BP_SFT);
|
||||
((pll_code.m_bp ? 0 : pll_code.m_code) << RT5651_PLL_M_SFT) |
|
||||
(pll_code.m_bp << RT5651_PLL_M_BP_SFT));
|
||||
|
||||
rt5651->pll_in = freq_in;
|
||||
rt5651->pll_out = freq_out;
|
||||
@ -1783,7 +1783,7 @@ static void rt5651_jack_detect_work(struct work_struct *work)
|
||||
struct rt5651_priv *rt5651 =
|
||||
container_of(work, struct rt5651_priv, jack_detect_work);
|
||||
struct snd_soc_component *component = rt5651->component;
|
||||
int report = 0;
|
||||
int report;
|
||||
|
||||
if (!rt5651_jack_inserted(component)) {
|
||||
/* Jack removed, or spurious IRQ? */
|
||||
|
@ -4568,8 +4568,8 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
|
||||
regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1,
|
||||
pll_code.n_code << RT5677_PLL_N_SFT | pll_code.k_code);
|
||||
regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2,
|
||||
(pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT |
|
||||
pll_code.m_bp << RT5677_PLL_M_BP_SFT);
|
||||
((pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT) |
|
||||
(pll_code.m_bp << RT5677_PLL_M_BP_SFT));
|
||||
|
||||
rt5677->pll_in = freq_in;
|
||||
rt5677->pll_out = freq_out;
|
||||
@ -5332,7 +5332,7 @@ static bool rt5677_check_hotword(struct rt5677_priv *rt5677)
|
||||
static irqreturn_t rt5677_irq(int unused, void *data)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = data;
|
||||
int ret = 0, loop, i, reg_irq, virq;
|
||||
int ret, loop, i, reg_irq, virq;
|
||||
bool irq_fired = false;
|
||||
|
||||
mutex_lock(&rt5677->irq_lock);
|
||||
|
@ -151,8 +151,8 @@ struct aic31xx_pdata {
|
||||
#define AIC31XX_WORD_LEN_24BITS 0x02
|
||||
#define AIC31XX_WORD_LEN_32BITS 0x03
|
||||
#define AIC31XX_IFACE1_MASTER_MASK GENMASK(3, 2)
|
||||
#define AIC31XX_BCLK_MASTER BIT(2)
|
||||
#define AIC31XX_WCLK_MASTER BIT(3)
|
||||
#define AIC31XX_BCLK_MASTER BIT(3)
|
||||
#define AIC31XX_WCLK_MASTER BIT(2)
|
||||
|
||||
/* AIC31XX_DATA_OFFSET */
|
||||
#define AIC31XX_DATA_OFFSET_MASK GENMASK(7, 0)
|
||||
|
@ -1131,7 +1131,7 @@ static struct snd_soc_dai_driver aic32x4_tas2505_dai = {
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 1,
|
||||
.channels_max = 2,
|
||||
.rates = SNDRV_PCM_RATE_8000_96000,
|
||||
.formats = AIC32X4_FORMATS,},
|
||||
.ops = &aic32x4_ops,
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
#include <dt-bindings/sound/qcom,q6afe.h>
|
||||
|
||||
#define AFE_PORT_MAX 127
|
||||
#define AFE_PORT_MAX 129
|
||||
|
||||
#define MSM_AFE_PORT_TYPE_RX 0
|
||||
#define MSM_AFE_PORT_TYPE_TX 1
|
||||
|
@ -117,7 +117,7 @@ static int stm32_adfsdm_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
||||
|
||||
/* Set IIO frequency if CODEC is master as clock comes from SPI_IN */
|
||||
|
||||
snprintf(str_freq, sizeof(str_freq), "%d\n", freq);
|
||||
snprintf(str_freq, sizeof(str_freq), "%u\n", freq);
|
||||
size = iio_write_channel_ext_info(priv->iio_ch, "spi_clk_freq",
|
||||
str_freq, sizeof(str_freq));
|
||||
if (size != sizeof(str_freq)) {
|
||||
|
@ -21,7 +21,7 @@
|
||||
* Auto-detection via UAC2 is not feasible to properly discover the vast
|
||||
* majority of features. It's related to both Linux/ALSA's UAC2 as well as
|
||||
* Focusrite's implementation of it. Eventually quirks may be sufficient but
|
||||
* right now it's a major headache to work arount these things.
|
||||
* right now it's a major headache to work around these things.
|
||||
*
|
||||
* NB. Neither the OSX nor the win driver provided by Focusrite performs
|
||||
* discovery, they seem to operate the same as this driver.
|
||||
|
@ -2,6 +2,6 @@
|
||||
#ifndef USX2YHWDEP_H
|
||||
#define USX2YHWDEP_H
|
||||
|
||||
int usX2Y_hwdep_new(struct snd_card *card, struct usb_device* device);
|
||||
int usx2y_hwdep_new(struct snd_card *card, struct usb_device *device);
|
||||
|
||||
#endif
|
||||
|
@ -4,7 +4,7 @@
|
||||
#define MAXSTRIDE 3
|
||||
|
||||
#define SSS (((MAXPACK*MAXBUFFERMS*MAXSTRIDE + 4096) / 4096) * 4096)
|
||||
struct snd_usX2Y_hwdep_pcm_shm {
|
||||
struct snd_usx2y_hwdep_pcm_shm {
|
||||
char playback[SSS];
|
||||
char capture0x8[SSS];
|
||||
char capture0xA[SSS];
|
||||
@ -20,4 +20,4 @@ struct snd_usX2Y_hwdep_pcm_shm {
|
||||
int capture_iso_start;
|
||||
};
|
||||
|
||||
int usX2Y_hwdep_pcm_new(struct snd_card *card);
|
||||
int usx2y_hwdep_pcm_new(struct snd_card *card);
|
||||
|
@ -185,7 +185,7 @@ struct fsxattr {
|
||||
#define BLKROTATIONAL _IO(0x12,126)
|
||||
#define BLKZEROOUT _IO(0x12,127)
|
||||
/*
|
||||
* A jump here: 130-131 are reserved for zoned block devices
|
||||
* A jump here: 130-136 are reserved for zoned block devices
|
||||
* (see uapi/linux/blkzoned.h)
|
||||
*/
|
||||
|
||||
|
@ -19,7 +19,7 @@ Address Dependency: When the address of a later memory access is computed
|
||||
from the value returned by the rcu_dereference() on line 2, the
|
||||
address dependency extends from that rcu_dereference() to that
|
||||
"p->a". In rare cases, optimizing compilers can destroy address
|
||||
dependencies. Please see Documentation/RCU/rcu_dereference.txt
|
||||
dependencies. Please see Documentation/RCU/rcu_dereference.rst
|
||||
for more information.
|
||||
|
||||
See also "Control Dependency" and "Data Dependency".
|
||||
|
@ -1,12 +1,11 @@
|
||||
C Z6.0+pooncelock+poonceLock+pombonce
|
||||
C Z6.0+pooncelock+pooncelock+pombonce
|
||||
|
||||
(*
|
||||
* Result: Never
|
||||
* Result: Sometimes
|
||||
*
|
||||
* This litmus test demonstrates how smp_mb__after_spinlock() may be
|
||||
* used to ensure that accesses in different critical sections for a
|
||||
* given lock running on different CPUs are nevertheless seen in order
|
||||
* by CPUs not holding that lock.
|
||||
* This example demonstrates that a pair of accesses made by different
|
||||
* processes each while holding a given lock will not necessarily be
|
||||
* seen as ordered by a third process not holding that lock.
|
||||
*)
|
||||
|
||||
{}
|
||||
@ -24,7 +23,6 @@ P1(int *y, int *z, spinlock_t *mylock)
|
||||
int r0;
|
||||
|
||||
spin_lock(mylock);
|
||||
smp_mb__after_spinlock();
|
||||
r0 = READ_ONCE(*y);
|
||||
WRITE_ONCE(*z, 1);
|
||||
spin_unlock(mylock);
|
||||
|
@ -684,7 +684,7 @@ static int elf_add_alternative(struct elf *elf,
|
||||
sec = find_section_by_name(elf, ".altinstructions");
|
||||
if (!sec) {
|
||||
sec = elf_create_section(elf, ".altinstructions",
|
||||
SHF_WRITE, size, 0);
|
||||
SHF_ALLOC, size, 0);
|
||||
|
||||
if (!sec) {
|
||||
WARN_ELF("elf_create_section");
|
||||
|
@ -4,13 +4,13 @@
|
||||
#define _OBJTOOL_CFI_REGS_H
|
||||
|
||||
#define CFI_AX 0
|
||||
#define CFI_DX 1
|
||||
#define CFI_CX 2
|
||||
#define CFI_CX 1
|
||||
#define CFI_DX 2
|
||||
#define CFI_BX 3
|
||||
#define CFI_SI 4
|
||||
#define CFI_DI 5
|
||||
#define CFI_BP 6
|
||||
#define CFI_SP 7
|
||||
#define CFI_SP 4
|
||||
#define CFI_BP 5
|
||||
#define CFI_SI 6
|
||||
#define CFI_DI 7
|
||||
#define CFI_R8 8
|
||||
#define CFI_R9 9
|
||||
#define CFI_R10 10
|
||||
|
@ -57,7 +57,7 @@ OPTIONS
|
||||
-u::
|
||||
--update=::
|
||||
Update specified file of the cache. Note that this doesn't remove
|
||||
older entires since those may be still needed for annotating old
|
||||
older entries since those may be still needed for annotating old
|
||||
(or remote) perf.data. Only if there is already a cache which has
|
||||
exactly same build-id, that is replaced by new one. It can be used
|
||||
to update kallsyms and kernel dso to vmlinux in order to support
|
||||
|
@ -108,7 +108,7 @@ int arch_sdt_arg_parse_op(char *old_op, char **new_op)
|
||||
/* [sp], [sp, NUM] or [sp,NUM] */
|
||||
new_len = 7; /* + ( % s p ) NULL */
|
||||
|
||||
/* If the arugment is [sp], need to fill offset '0' */
|
||||
/* If the argument is [sp], need to fill offset '0' */
|
||||
if (rm[2].rm_so == -1)
|
||||
new_len += 1;
|
||||
else
|
||||
|
@ -73,7 +73,7 @@ static int bp_modify1(void)
|
||||
/*
|
||||
* The parent does following steps:
|
||||
* - creates a new breakpoint (id 0) for bp_2 function
|
||||
* - changes that breakponit to bp_1 function
|
||||
* - changes that breakpoint to bp_1 function
|
||||
* - waits for the breakpoint to hit and checks
|
||||
* it has proper rip of bp_1 function
|
||||
* - detaches the child
|
||||
|
@ -372,7 +372,7 @@ static int inject_build_id(struct bench_data *data, u64 *max_rss)
|
||||
len += synthesize_flush(data);
|
||||
}
|
||||
|
||||
/* tihs makes the child to finish */
|
||||
/* this makes the child to finish */
|
||||
close(data->input_pipe[1]);
|
||||
|
||||
wait4(data->pid, &status, 0, &rusage);
|
||||
|
@ -390,7 +390,7 @@ jvmti_write_code(void *agent, char const *sym,
|
||||
rec.p.total_size += size;
|
||||
|
||||
/*
|
||||
* If JVM is multi-threaded, nultiple concurrent calls to agent
|
||||
* If JVM is multi-threaded, multiple concurrent calls to agent
|
||||
* may be possible, so protect file writes
|
||||
*/
|
||||
flockfile(fp);
|
||||
@ -457,7 +457,7 @@ jvmti_write_debug_info(void *agent, uint64_t code,
|
||||
rec.p.total_size = size;
|
||||
|
||||
/*
|
||||
* If JVM is multi-threaded, nultiple concurrent calls to agent
|
||||
* If JVM is multi-threaded, multiple concurrent calls to agent
|
||||
* may be possible, so protect file writes
|
||||
*/
|
||||
flockfile(fp);
|
||||
|
@ -356,7 +356,7 @@ def handle_irq_softirq_exit(event_info):
|
||||
return
|
||||
rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time,
|
||||
'irq_list':irq_list, 'event_list':event_list}
|
||||
# merge information realted to a NET_RX softirq
|
||||
# merge information related to a NET_RX softirq
|
||||
receive_hunk_list.append(rec_data)
|
||||
|
||||
def handle_napi_poll(event_info):
|
||||
|
@ -5,7 +5,7 @@ group_fd=-1
|
||||
flags=0|8
|
||||
cpu=*
|
||||
type=0
|
||||
size=120
|
||||
size=128
|
||||
config=0
|
||||
sample_period=0
|
||||
sample_type=65536
|
||||
|
@ -7,7 +7,7 @@ cpu=*
|
||||
pid=-1
|
||||
flags=8
|
||||
type=1
|
||||
size=120
|
||||
size=128
|
||||
config=9
|
||||
sample_period=4000
|
||||
sample_type=455
|
||||
|
@ -4,7 +4,7 @@
|
||||
* generic one.
|
||||
*
|
||||
* The function 'LIBUNWIND__ARCH_REG_ID' name is set according to arch
|
||||
* name and the defination of this function is included directly from
|
||||
* name and the definition of this function is included directly from
|
||||
* 'arch/arm64/util/unwind-libunwind.c', to make sure that this function
|
||||
* is defined no matter what arch the host is.
|
||||
*
|
||||
|
@ -4,7 +4,7 @@
|
||||
* generic one.
|
||||
*
|
||||
* The function 'LIBUNWIND__ARCH_REG_ID' name is set according to arch
|
||||
* name and the defination of this function is included directly from
|
||||
* name and the definition of this function is included directly from
|
||||
* 'arch/x86/util/unwind-libunwind.c', to make sure that this function
|
||||
* is defined no matter what arch the host is.
|
||||
*
|
||||
|
@ -1211,7 +1211,7 @@ static size_t mask_size(struct perf_cpu_map *map, int *max)
|
||||
*max = 0;
|
||||
|
||||
for (i = 0; i < map->nr; i++) {
|
||||
/* bit possition of the cpu is + 1 */
|
||||
/* bit position of the cpu is + 1 */
|
||||
int bit = map->map[i] + 1;
|
||||
|
||||
if (bit > *max)
|
||||
@ -1237,7 +1237,7 @@ void *cpu_map_data__alloc(struct perf_cpu_map *map, size_t *size, u16 *type, int
|
||||
* mask = size of 'struct perf_record_record_cpu_map' +
|
||||
* maximum cpu bit converted to size of longs
|
||||
*
|
||||
* and finaly + the size of 'struct perf_record_cpu_map_data'.
|
||||
* and finally + the size of 'struct perf_record_cpu_map_data'.
|
||||
*/
|
||||
size_cpus = cpus_size(map);
|
||||
size_mask = mask_size(map, max);
|
||||
|
@ -4386,6 +4386,7 @@ static void do_test_file(unsigned int test_num)
|
||||
fprintf(stderr, "OK");
|
||||
|
||||
done:
|
||||
btf__free(btf);
|
||||
free(func_info);
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
@ -121,7 +121,7 @@ static int dump_tcp_sock(struct seq_file *seq, struct tcp_sock *tp,
|
||||
}
|
||||
|
||||
BPF_SEQ_PRINTF(seq, "%4d: %08X:%04X %08X:%04X ",
|
||||
seq_num, src, srcp, destp, destp);
|
||||
seq_num, src, srcp, dest, destp);
|
||||
BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d ",
|
||||
state,
|
||||
tp->write_seq - tp->snd_una, rx_queue,
|
||||
|
@ -125,6 +125,16 @@ int handle_downsize(void *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
#define bpf_core_read_int bpf_core_read
|
||||
#else
|
||||
#define bpf_core_read_int(dst, sz, src) ({ \
|
||||
/* Prevent "subtraction from stack pointer prohibited" */ \
|
||||
volatile long __off = sizeof(*dst) - (sz); \
|
||||
bpf_core_read((char *)(dst) + __off, sz, src); \
|
||||
})
|
||||
#endif
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handle_probed(void *ctx)
|
||||
{
|
||||
@ -132,23 +142,23 @@ int handle_probed(void *ctx)
|
||||
__u64 tmp;
|
||||
|
||||
tmp = 0;
|
||||
bpf_core_read(&tmp, bpf_core_field_size(in->ptr), &in->ptr);
|
||||
bpf_core_read_int(&tmp, bpf_core_field_size(in->ptr), &in->ptr);
|
||||
ptr_probed = tmp;
|
||||
|
||||
tmp = 0;
|
||||
bpf_core_read(&tmp, bpf_core_field_size(in->val1), &in->val1);
|
||||
bpf_core_read_int(&tmp, bpf_core_field_size(in->val1), &in->val1);
|
||||
val1_probed = tmp;
|
||||
|
||||
tmp = 0;
|
||||
bpf_core_read(&tmp, bpf_core_field_size(in->val2), &in->val2);
|
||||
bpf_core_read_int(&tmp, bpf_core_field_size(in->val2), &in->val2);
|
||||
val2_probed = tmp;
|
||||
|
||||
tmp = 0;
|
||||
bpf_core_read(&tmp, bpf_core_field_size(in->val3), &in->val3);
|
||||
bpf_core_read_int(&tmp, bpf_core_field_size(in->val3), &in->val3);
|
||||
val3_probed = tmp;
|
||||
|
||||
tmp = 0;
|
||||
bpf_core_read(&tmp, bpf_core_field_size(in->val4), &in->val4);
|
||||
bpf_core_read_int(&tmp, bpf_core_field_size(in->val4), &in->val4);
|
||||
val4_probed = tmp;
|
||||
|
||||
return 0;
|
||||
|
@ -764,8 +764,8 @@ static void test_sockmap(unsigned int tasks, void *data)
|
||||
udp = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
i = 0;
|
||||
err = bpf_map_update_elem(fd, &i, &udp, BPF_ANY);
|
||||
if (!err) {
|
||||
printf("Failed socket SOCK_DGRAM allowed '%i:%i'\n",
|
||||
if (err) {
|
||||
printf("Failed socket update SOCK_DGRAM '%i:%i'\n",
|
||||
i, udp);
|
||||
goto out_sockmap;
|
||||
}
|
||||
|
@ -159,3 +159,15 @@
|
||||
.result = ACCEPT,
|
||||
.retval = 2,
|
||||
},
|
||||
{
|
||||
"dead code: zero extension",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4),
|
||||
BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
|
||||
BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.result = ACCEPT,
|
||||
.retval = 0,
|
||||
},
|
||||
|
@ -215,7 +215,7 @@ int main(void)
|
||||
vcpu_set_hv_cpuid(vm, VCPU_ID);
|
||||
|
||||
tsc_page_gva = vm_vaddr_alloc_page(vm);
|
||||
memset(addr_gpa2hva(vm, tsc_page_gva), 0x0, getpagesize());
|
||||
memset(addr_gva2hva(vm, tsc_page_gva), 0x0, getpagesize());
|
||||
TEST_ASSERT((addr_gva2gpa(vm, tsc_page_gva) & (getpagesize() - 1)) == 0,
|
||||
"TSC page has to be page aligned\n");
|
||||
vcpu_args_set(vm, VCPU_ID, 2, tsc_page_gva, addr_gva2gpa(vm, tsc_page_gva));
|
||||
|
@ -31,7 +31,7 @@ then
|
||||
echo "$configfile ------- " $stopstate
|
||||
else
|
||||
title="$configfile ------- $ngps GPs"
|
||||
dur=`sed -e 's/^.* rcutorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null`
|
||||
dur=`grep -v '^#' $i/qemu-cmd | sed -e 's/^.* rcutorture.shutdown_secs=//' -e 's/ .*$//'`
|
||||
if test -z "$dur"
|
||||
then
|
||||
:
|
||||
|
@ -30,7 +30,7 @@ do
|
||||
resdir=`echo $i | sed -e 's,/$,,' -e 's,/[^/]*$,,'`
|
||||
head -1 $resdir/log
|
||||
fi
|
||||
TORTURE_SUITE="`cat $i/../TORTURE_SUITE`"
|
||||
TORTURE_SUITE="`cat $i/../torture_suite`"
|
||||
configfile=`echo $i | sed -e 's,^.*/,,'`
|
||||
rm -f $i/console.log.*.diags
|
||||
kvm-recheck-${TORTURE_SUITE}.sh $i
|
||||
|
@ -7,8 +7,8 @@ TREE07
|
||||
TREE09
|
||||
SRCU-N
|
||||
SRCU-P
|
||||
SRCU-t
|
||||
SRCU-u
|
||||
SRCU-T
|
||||
SRCU-U
|
||||
TINY01
|
||||
TINY02
|
||||
TASKS01
|
||||
|
@ -1 +1 @@
|
||||
rcutree.rcu_fanout_leaf=4 nohz_full=1-7
|
||||
rcutree.rcu_fanout_leaf=4 nohz_full=1-N
|
||||
|
@ -1,3 +1,3 @@
|
||||
rcupdate.rcu_self_test=1
|
||||
rcutree.rcu_fanout_exact=1
|
||||
rcu_nocbs=0-7
|
||||
rcu_nocbs=all
|
||||
|
@ -7,7 +7,7 @@ CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_NOCB_CPU=n
|
||||
|
@ -8,7 +8,7 @@ CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_FANOUT=3
|
||||
|
@ -12,5 +12,5 @@
|
||||
# Adds per-version torture-module parameters to kernels supporting them.
|
||||
per_version_boot_params () {
|
||||
echo $1 rcuscale.shutdown=1 \
|
||||
rcuscale.verbose=1
|
||||
rcuscale.verbose=0
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_NOCB_CPU=n
|
||||
|
@ -7,7 +7,7 @@ CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_RCU_FAST_NO_HZ=n
|
||||
CONFIG_HOTPLUG_CPU=n
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_SUSPEND=n
|
||||
CONFIG_HIBERNATION=n
|
||||
CONFIG_RCU_NOCB_CPU=n
|
||||
|
@ -12,5 +12,5 @@
|
||||
# Adds per-version torture-module parameters to kernels supporting them.
|
||||
per_version_boot_params () {
|
||||
echo $1 refscale.shutdown=1 \
|
||||
refscale.verbose=1
|
||||
refscale.verbose=0
|
||||
}
|
||||
|
@ -77,17 +77,17 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
|
||||
#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA)
|
||||
#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA)
|
||||
|
||||
static inline void __list_del_entry(struct list_head *entry)
|
||||
{
|
||||
__list_del(entry->prev, entry->next);
|
||||
}
|
||||
|
||||
/**
|
||||
* list_del - deletes entry from list.
|
||||
* @entry: the element to delete from the list.
|
||||
* Note: list_empty() on entry does not return true after this, the entry is
|
||||
* in an undefined state.
|
||||
*/
|
||||
static inline void __list_del_entry(struct list_head *entry)
|
||||
{
|
||||
__list_del(entry->prev, entry->next);
|
||||
}
|
||||
|
||||
static inline void list_del(struct list_head *entry)
|
||||
{
|
||||
__list_del(entry->prev, entry->next);
|
||||
|
@ -4,7 +4,8 @@ test: virtio_test vringh_test
|
||||
virtio_test: virtio_ring.o virtio_test.o
|
||||
vringh_test: vringh_test.o vringh.o virtio_ring.o
|
||||
|
||||
CFLAGS += -g -O2 -Werror -Wall -I. -I../include/ -I ../../usr/include/ -Wno-pointer-sign -fno-strict-overflow -fno-strict-aliasing -fno-common -MMD -U_FORTIFY_SOURCE -include ../../include/linux/kconfig.h
|
||||
CFLAGS += -g -O2 -Werror -Wno-maybe-uninitialized -Wall -I. -I../include/ -I ../../usr/include/ -Wno-pointer-sign -fno-strict-overflow -fno-strict-aliasing -fno-common -MMD -U_FORTIFY_SOURCE -include ../../include/linux/kconfig.h
|
||||
LDFLAGS += -lpthread
|
||||
vpath %.c ../../drivers/virtio ../../drivers/vhost
|
||||
mod:
|
||||
${MAKE} -C `pwd`/../.. M=`pwd`/vhost_test V=${V}
|
||||
|
56
tools/virtio/linux/spinlock.h
Normal file
56
tools/virtio/linux/spinlock.h
Normal file
@ -0,0 +1,56 @@
|
||||
#ifndef SPINLOCK_H_STUB
|
||||
#define SPINLOCK_H_STUB
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
typedef pthread_spinlock_t spinlock_t;
|
||||
|
||||
static inline void spin_lock_init(spinlock_t *lock)
|
||||
{
|
||||
int r = pthread_spin_init(lock, 0);
|
||||
assert(!r);
|
||||
}
|
||||
|
||||
static inline void spin_lock(spinlock_t *lock)
|
||||
{
|
||||
int ret = pthread_spin_lock(lock);
|
||||
assert(!ret);
|
||||
}
|
||||
|
||||
static inline void spin_unlock(spinlock_t *lock)
|
||||
{
|
||||
int ret = pthread_spin_unlock(lock);
|
||||
assert(!ret);
|
||||
}
|
||||
|
||||
static inline void spin_lock_bh(spinlock_t *lock)
|
||||
{
|
||||
spin_lock(lock);
|
||||
}
|
||||
|
||||
static inline void spin_unlock_bh(spinlock_t *lock)
|
||||
{
|
||||
spin_unlock(lock);
|
||||
}
|
||||
|
||||
static inline void spin_lock_irq(spinlock_t *lock)
|
||||
{
|
||||
spin_lock(lock);
|
||||
}
|
||||
|
||||
static inline void spin_unlock_irq(spinlock_t *lock)
|
||||
{
|
||||
spin_unlock(lock);
|
||||
}
|
||||
|
||||
static inline void spin_lock_irqsave(spinlock_t *lock, unsigned long f)
|
||||
{
|
||||
spin_lock(lock);
|
||||
}
|
||||
|
||||
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long f)
|
||||
{
|
||||
spin_unlock(lock);
|
||||
}
|
||||
|
||||
#endif
|
@ -3,6 +3,7 @@
|
||||
#define LINUX_VIRTIO_H
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
struct device {
|
||||
void *parent;
|
||||
@ -12,6 +13,7 @@ struct virtio_device {
|
||||
struct device dev;
|
||||
u64 features;
|
||||
struct list_head vqs;
|
||||
spinlock_t vqs_list_lock;
|
||||
};
|
||||
|
||||
struct virtqueue {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user