Changes in 4.9.169 x86/power: Fix some ordering bugs in __restore_processor_context() x86/power/64: Use struct desc_ptr for the IDT in struct saved_context x86/power/32: Move SYSENTER MSR restoration to fix_processor_context() x86/power: Make restore_processor_context() sane powerpc/tm: Limit TM code inside PPC_TRANSACTIONAL_MEM kbuild: clang: choose GCC_TOOLCHAIN_DIR not on LD x86: vdso: Use $LD instead of $CC to link x86/vdso: Drop implicit common-page-size linker flag lib/string.c: implement a basic bcmp powerpc: Fix invalid use of register expressions powerpc/64s: Add barrier_nospec powerpc/64s: Add support for ori barrier_nospec patching powerpc: Avoid code patching freed init sections powerpc/64s: Patch barrier_nospec in modules powerpc/64s: Enable barrier_nospec based on firmware settings powerpc: Use barrier_nospec in copy_from_user() powerpc/64: Use barrier_nospec in syscall entry powerpc/64s: Enhance the information in cpu_show_spectre_v1() powerpc64s: Show ori31 availability in spectre_v1 sysfs file not v2 powerpc/64: Disable the speculation barrier from the command line powerpc/64: Make stf barrier PPC_BOOK3S_64 specific. powerpc/64: Add CONFIG_PPC_BARRIER_NOSPEC powerpc/64: Call setup_barrier_nospec() from setup_arch() powerpc/64: Make meltdown reporting Book3S 64 specific powerpc/fsl: Add barrier_nospec implementation for NXP PowerPC Book3E powerpc/fsl: Sanitize the syscall table for NXP PowerPC 32 bit platforms powerpc/asm: Add a patch_site macro & helpers for patching instructions powerpc/64s: Add new security feature flags for count cache flush powerpc/64s: Add support for software count cache flush powerpc/pseries: Query hypervisor for count cache flush settings powerpc/powernv: Query firmware for count cache flush settings powerpc/fsl: Add infrastructure to fixup branch predictor flush powerpc/fsl: Add macro to flush the branch predictor powerpc/fsl: Fix spectre_v2 mitigations reporting powerpc/fsl: Emulate SPRN_BUCSR register powerpc/fsl: Add nospectre_v2 command line argument powerpc/fsl: Flush the branch predictor at each kernel entry (64bit) powerpc/fsl: Flush the branch predictor at each kernel entry (32 bit) powerpc/fsl: Flush branch predictor when entering KVM powerpc/fsl: Enable runtime patching if nospectre_v2 boot arg is used powerpc/fsl: Update Spectre v2 reporting powerpc/fsl: Fixed warning: orphan section `__btb_flush_fixup' powerpc/fsl: Fix the flush of branch predictor. powerpc/security: Fix spectre_v2 reporting arm64: kaslr: Reserve size of ARM64_MEMSTART_ALIGN in linear region tty: mark Siemens R3964 line discipline as BROKEN tty: ldisc: add sysctl to prevent autoloading of ldiscs ipv6: Fix dangling pointer when ipv6 fragment ipv6: sit: reset ip header pointer in ipip6_rcv kcm: switch order of device registration to fix a crash net: rds: force to destroy connection if t_sock is NULL in rds_tcp_kill_sock(). openvswitch: fix flow actions reallocation qmi_wwan: add Olicard 600 sctp: initialize _pad of sockaddr_in before copying to user memory tcp: Ensure DCTCP reacts to losses vrf: check accept_source_route on the original netdevice bnxt_en: Reset device on RX buffer errors. bnxt_en: Improve RX consumer index validity check. net/mlx5e: Add a lock on tir list netns: provide pure entropy for net_hash_mix() net: ethtool: not call vzalloc for zero sized memory request ip6_tunnel: Match to ARPHRD_TUNNEL6 for dev type ALSA: seq: Fix OOB-reads from strlcpy parisc: Detect QEMU earlier in boot process include/linux/bitrev.h: fix constant bitrev ASoC: fsl_esai: fix channel swap issue when stream starts Btrfs: do not allow trimming when a fs is mounted with the nologreplay option block: do not leak memory in bio_copy_user_iov() genirq: Respect IRQCHIP_SKIP_SET_WAKE in irq_chip_set_wake_parent() virtio: Honour 'may_reduce_num' in vring_create_virtqueue ARM: dts: at91: Fix typo in ISC_D0 on PC9 arm64: futex: Fix FUTEX_WAKE_OP atomic ops with non-zero result value parisc: Use cr16 interval timers unconditionally on qemu xen: Prevent buffer overflow in privcmd ioctl sched/fair: Do not re-read ->h_load_next during hierarchical load calculation xtensa: fix return_address PCI: Add function 1 DMA alias quirk for Marvell 9170 SATA controller Linux 4.9.169 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
112 lines
2.9 KiB
C
112 lines
2.9 KiB
C
#ifndef _LINUX_VIRTIO_RING_H
|
|
#define _LINUX_VIRTIO_RING_H
|
|
|
|
#include <asm/barrier.h>
|
|
#include <linux/irqreturn.h>
|
|
#include <uapi/linux/virtio_ring.h>
|
|
|
|
/*
|
|
* Barriers in virtio are tricky. Non-SMP virtio guests can't assume
|
|
* they're not on an SMP host system, so they need to assume real
|
|
* barriers. Non-SMP virtio hosts could skip the barriers, but does
|
|
* anyone care?
|
|
*
|
|
* For virtio_pci on SMP, we don't need to order with respect to MMIO
|
|
* accesses through relaxed memory I/O windows, so virt_mb() et al are
|
|
* sufficient.
|
|
*
|
|
* For using virtio to talk to real devices (eg. other heterogeneous
|
|
* CPUs) we do need real barriers. In theory, we could be using both
|
|
* kinds of virtio, so it's a runtime decision, and the branch is
|
|
* actually quite cheap.
|
|
*/
|
|
|
|
static inline void virtio_mb(bool weak_barriers)
|
|
{
|
|
if (weak_barriers)
|
|
virt_mb();
|
|
else
|
|
mb();
|
|
}
|
|
|
|
static inline void virtio_rmb(bool weak_barriers)
|
|
{
|
|
if (weak_barriers)
|
|
virt_rmb();
|
|
else
|
|
rmb();
|
|
}
|
|
|
|
static inline void virtio_wmb(bool weak_barriers)
|
|
{
|
|
if (weak_barriers)
|
|
virt_wmb();
|
|
else
|
|
wmb();
|
|
}
|
|
|
|
static inline void virtio_store_mb(bool weak_barriers,
|
|
__virtio16 *p, __virtio16 v)
|
|
{
|
|
if (weak_barriers) {
|
|
virt_store_mb(*p, v);
|
|
} else {
|
|
WRITE_ONCE(*p, v);
|
|
mb();
|
|
}
|
|
}
|
|
|
|
struct virtio_device;
|
|
struct virtqueue;
|
|
|
|
/*
|
|
* Creates a virtqueue and allocates the descriptor ring. If
|
|
* may_reduce_num is set, then this may allocate a smaller ring than
|
|
* expected. The caller should query virtqueue_get_vring_size to learn
|
|
* the actual size of the ring.
|
|
*/
|
|
struct virtqueue *vring_create_virtqueue(unsigned int index,
|
|
unsigned int num,
|
|
unsigned int vring_align,
|
|
struct virtio_device *vdev,
|
|
bool weak_barriers,
|
|
bool may_reduce_num,
|
|
bool (*notify)(struct virtqueue *vq),
|
|
void (*callback)(struct virtqueue *vq),
|
|
const char *name);
|
|
|
|
/* Creates a virtqueue with a custom layout. */
|
|
struct virtqueue *__vring_new_virtqueue(unsigned int index,
|
|
struct vring vring,
|
|
struct virtio_device *vdev,
|
|
bool weak_barriers,
|
|
bool (*notify)(struct virtqueue *),
|
|
void (*callback)(struct virtqueue *),
|
|
const char *name);
|
|
|
|
/*
|
|
* Creates a virtqueue with a standard layout but a caller-allocated
|
|
* ring.
|
|
*/
|
|
struct virtqueue *vring_new_virtqueue(unsigned int index,
|
|
unsigned int num,
|
|
unsigned int vring_align,
|
|
struct virtio_device *vdev,
|
|
bool weak_barriers,
|
|
void *pages,
|
|
bool (*notify)(struct virtqueue *vq),
|
|
void (*callback)(struct virtqueue *vq),
|
|
const char *name);
|
|
|
|
/*
|
|
* Destroys a virtqueue. If created with vring_create_virtqueue, this
|
|
* also frees the ring.
|
|
*/
|
|
void vring_del_virtqueue(struct virtqueue *vq);
|
|
|
|
/* Filter out transport-specific feature bits. */
|
|
void vring_transport_features(struct virtio_device *vdev);
|
|
|
|
irqreturn_t vring_interrupt(int irq, void *_vq);
|
|
#endif /* _LINUX_VIRTIO_RING_H */
|