/* * Copyright (C) 2016 Red Hat, Inc. * Author: Michael S. Tsirkin * This work is licensed under the terms of the GNU GPL, version 2. * * Common macros and functions for ring benchmarking. */ #ifndef MAIN_H #define MAIN_H #include extern bool do_exit; #if defined(__x86_64__) || defined(__i386__) #include "x86intrin.h" static inline void wait_cycles(unsigned long long cycles) { unsigned long long t; t = __rdtsc(); while (__rdtsc() - t < cycles) {} } #define VMEXIT_CYCLES 500 #define VMENTRY_CYCLES 500 #elif defined(__s390x__) static inline void wait_cycles(unsigned long long cycles) { asm volatile("0: brctg %0,0b" : : "d" (cycles)); } /* tweak me */ #define VMEXIT_CYCLES 200 #define VMENTRY_CYCLES 200 #else static inline void wait_cycles(unsigned long long cycles) { _Exit(5); } #define VMEXIT_CYCLES 0 #define VMENTRY_CYCLES 0 #endif static inline void vmexit(void) { if (!do_exit) return; wait_cycles(VMEXIT_CYCLES); } static inline void vmentry(void) { if (!do_exit) return; wait_cycles(VMENTRY_CYCLES); } /* implemented by ring */ void alloc_ring(void); /* guest side */ int add_inbuf(unsigned, void *, void *); void *get_buf(unsigned *, void **); void disable_call(); bool used_empty(); bool enable_call(); void kick_available(); /* host side */ void disable_kick(); bool avail_empty(); bool enable_kick(); bool use_buf(unsigned *, void **); void call_used(); /* implemented by main */ extern bool do_sleep; void kick(void); void wait_for_kick(void); void call(void); void wait_for_call(void); extern unsigned ring_size; /* Compiler barrier - similar to what Linux uses */ #define barrier() asm volatile("" ::: "memory") /* Is there a portable way to do this? */ #if defined(__x86_64__) || defined(__i386__) #define cpu_relax() asm ("rep; nop" ::: "memory") #elif defined(__s390x__) #define cpu_relax() barrier() #else #define cpu_relax() assert(0) #endif extern bool do_relax; static inline void busy_wait(void) { if (do_relax) cpu_relax(); else /* prevent compiler from removing busy loops */ barrier(); } /* * Not using __ATOMIC_SEQ_CST since gcc docs say they are only synchronized * with other __ATOMIC_SEQ_CST calls. */ #define smp_mb() __sync_synchronize() /* * This abuses the atomic builtins for thread fences, and * adds a compiler barrier. */ #define smp_release() do { \ barrier(); \ __atomic_thread_fence(__ATOMIC_RELEASE); \ } while (0) #define smp_acquire() do { \ __atomic_thread_fence(__ATOMIC_ACQUIRE); \ barrier(); \ } while (0) #endif rch'/>
diff options
context:
space:
mode:
authorVincent <vincent.stehle@laposte.net>2017-01-30 15:06:43 +0100
committerDavid S. Miller <davem@davemloft.net>2017-01-31 13:07:40 -0500
commitc73e44269369e936165f0f9b61f1f09a11dae01c (patch)
treee2188e900ba06302f8ed2746cb07edd3efbc5c35 /net/mac80211/wep.h
parent040587af31228d82c52267f717c9fcdb65f36335 (diff)
net: thunderx: avoid dereferencing xcv when NULL
This fixes the following smatch and coccinelle warnings: drivers/net/ethernet/cavium/thunder/thunder_xcv.c:119 xcv_setup_link() error: we previously assumed 'xcv' could be null (see line 118) [smatch] drivers/net/ethernet/cavium/thunder/thunder_xcv.c:119:16-20: ERROR: xcv is NULL but dereferenced. [coccinelle] Fixes: 6465859aba1e66a5 ("net: thunderx: Add RGMII interface type support") Signed-off-by: Vincent Stehlé <vincent.stehle@laposte.net> Cc: Sunil Goutham <sgoutham@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac80211/wep.h')