mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 14:13:01 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Minor overlapping changes for both merge conflicts. Resolution work done by Stephen Rothwell was used as a reference. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
60747ef4d1
1746 changed files with 55964 additions and 77032 deletions
|
|
@ -163,6 +163,7 @@ struct backing_dev_info {
|
|||
wait_queue_head_t wb_waitq;
|
||||
|
||||
struct device *dev;
|
||||
struct device *owner;
|
||||
|
||||
struct timer_list laptop_mode_wb_timer;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ __printf(3, 4)
|
|||
int bdi_register(struct backing_dev_info *bdi, struct device *parent,
|
||||
const char *fmt, ...);
|
||||
int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
|
||||
int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner);
|
||||
void bdi_unregister(struct backing_dev_info *bdi);
|
||||
|
||||
int __must_check bdi_setup_and_register(struct backing_dev_info *, char *);
|
||||
|
|
|
|||
|
|
@ -113,6 +113,8 @@ extern int suid_dumpable;
|
|||
extern int setup_arg_pages(struct linux_binprm * bprm,
|
||||
unsigned long stack_top,
|
||||
int executable_stack);
|
||||
extern int transfer_args_to_stack(struct linux_binprm *bprm,
|
||||
unsigned long *sp_location);
|
||||
extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);
|
||||
extern int copy_strings_kernel(int argc, const char *const *argv,
|
||||
struct linux_binprm *bprm);
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ static inline bool bio_is_rw(struct bio *bio)
|
|||
|
||||
static inline bool bio_mergeable(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_rw & REQ_NOMERGE_FLAGS)
|
||||
if (bio->bi_opf & REQ_NOMERGE_FLAGS)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
@ -318,7 +318,7 @@ struct bio_integrity_payload {
|
|||
|
||||
static inline struct bio_integrity_payload *bio_integrity(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_rw & REQ_INTEGRITY)
|
||||
if (bio->bi_opf & REQ_INTEGRITY)
|
||||
return bio->bi_integrity;
|
||||
|
||||
return NULL;
|
||||
|
|
@ -470,11 +470,14 @@ extern unsigned int bvec_nr_vecs(unsigned short idx);
|
|||
int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css);
|
||||
int bio_associate_current(struct bio *bio);
|
||||
void bio_disassociate_task(struct bio *bio);
|
||||
void bio_clone_blkcg_association(struct bio *dst, struct bio *src);
|
||||
#else /* CONFIG_BLK_CGROUP */
|
||||
static inline int bio_associate_blkcg(struct bio *bio,
|
||||
struct cgroup_subsys_state *blkcg_css) { return 0; }
|
||||
static inline int bio_associate_current(struct bio *bio) { return -ENOENT; }
|
||||
static inline void bio_disassociate_task(struct bio *bio) { }
|
||||
static inline void bio_clone_blkcg_association(struct bio *dst,
|
||||
struct bio *src) { }
|
||||
#endif /* CONFIG_BLK_CGROUP */
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
|
|
|||
|
|
@ -266,13 +266,12 @@ static inline int bitmap_equal(const unsigned long *src1,
|
|||
const unsigned long *src2, unsigned int nbits)
|
||||
{
|
||||
if (small_const_nbits(nbits))
|
||||
return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
|
||||
return !((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
|
||||
#ifdef CONFIG_S390
|
||||
else if (__builtin_constant_p(nbits) && (nbits % BITS_PER_LONG) == 0)
|
||||
if (__builtin_constant_p(nbits) && (nbits % BITS_PER_LONG) == 0)
|
||||
return !memcmp(src1, src2, nbits / 8);
|
||||
#endif
|
||||
else
|
||||
return __bitmap_equal(src1, src2, nbits);
|
||||
return __bitmap_equal(src1, src2, nbits);
|
||||
}
|
||||
|
||||
static inline int bitmap_intersects(const unsigned long *src1,
|
||||
|
|
|
|||
|
|
@ -714,9 +714,9 @@ static inline bool blkcg_bio_issue_check(struct request_queue *q,
|
|||
|
||||
if (!throtl) {
|
||||
blkg = blkg ?: q->root_blkg;
|
||||
blkg_rwstat_add(&blkg->stat_bytes, bio_op(bio), bio->bi_rw,
|
||||
blkg_rwstat_add(&blkg->stat_bytes, bio_op(bio), bio->bi_opf,
|
||||
bio->bi_iter.bi_size);
|
||||
blkg_rwstat_add(&blkg->stat_ios, bio_op(bio), bio->bi_rw, 1);
|
||||
blkg_rwstat_add(&blkg->stat_ios, bio_op(bio), bio->bi_opf, 1);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
|
|
@ -27,8 +27,9 @@ struct bio {
|
|||
struct bio *bi_next; /* request queue link */
|
||||
struct block_device *bi_bdev;
|
||||
int bi_error;
|
||||
unsigned int bi_rw; /* bottom bits req flags,
|
||||
* top bits REQ_OP
|
||||
unsigned int bi_opf; /* bottom bits req flags,
|
||||
* top bits REQ_OP. Use
|
||||
* accessors.
|
||||
*/
|
||||
unsigned short bi_flags; /* status, command, etc */
|
||||
unsigned short bi_ioprio;
|
||||
|
|
@ -89,13 +90,13 @@ struct bio {
|
|||
};
|
||||
|
||||
#define BIO_OP_SHIFT (8 * sizeof(unsigned int) - REQ_OP_BITS)
|
||||
#define bio_op(bio) ((bio)->bi_rw >> BIO_OP_SHIFT)
|
||||
#define bio_op(bio) ((bio)->bi_opf >> BIO_OP_SHIFT)
|
||||
|
||||
#define bio_set_op_attrs(bio, op, op_flags) do { \
|
||||
WARN_ON(op >= (1 << REQ_OP_BITS)); \
|
||||
(bio)->bi_rw &= ((1 << BIO_OP_SHIFT) - 1); \
|
||||
(bio)->bi_rw |= ((unsigned int) (op) << BIO_OP_SHIFT); \
|
||||
(bio)->bi_rw |= op_flags; \
|
||||
(bio)->bi_opf &= ((1 << BIO_OP_SHIFT) - 1); \
|
||||
(bio)->bi_opf |= ((unsigned int) (op) << BIO_OP_SHIFT); \
|
||||
(bio)->bi_opf |= op_flags; \
|
||||
} while (0)
|
||||
|
||||
#define BIO_RESET_BYTES offsetof(struct bio, bi_max_vecs)
|
||||
|
|
@ -138,7 +139,7 @@ struct bio {
|
|||
|
||||
/*
|
||||
* Request flags. For use in the cmd_flags field of struct request, and in
|
||||
* bi_rw of struct bio. Note that some flags are only valid in either one.
|
||||
* bi_opf of struct bio. Note that some flags are only valid in either one.
|
||||
*/
|
||||
enum rq_flag_bits {
|
||||
/* common flags */
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ struct pr_ops;
|
|||
*/
|
||||
#define BLKCG_MAX_POLS 2
|
||||
|
||||
struct request;
|
||||
typedef void (rq_end_io_fn)(struct request *, int);
|
||||
|
||||
#define BLK_RL_SYNCFULL (1U << 0)
|
||||
|
|
@ -1673,7 +1672,7 @@ struct blk_dax_ctl {
|
|||
struct block_device_operations {
|
||||
int (*open) (struct block_device *, fmode_t);
|
||||
void (*release) (struct gendisk *, fmode_t);
|
||||
int (*rw_page)(struct block_device *, sector_t, struct page *, int rw);
|
||||
int (*rw_page)(struct block_device *, sector_t, struct page *, bool);
|
||||
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
long (*direct_access)(struct block_device *, sector_t, void **, pfn_t *,
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ static inline void bvec_iter_advance(const struct bio_vec *bv,
|
|||
"Attempted to advance past end of bvec iter\n");
|
||||
|
||||
while (bytes) {
|
||||
unsigned len = min(bytes, bvec_iter_len(bv, *iter));
|
||||
unsigned iter_len = bvec_iter_len(bv, *iter);
|
||||
unsigned len = min(bytes, iter_len);
|
||||
|
||||
bytes -= len;
|
||||
iter->bi_size -= len;
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ struct dentry_operations {
|
|||
int (*d_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_weak_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_hash)(const struct dentry *, struct qstr *);
|
||||
int (*d_compare)(const struct dentry *, const struct dentry *,
|
||||
int (*d_compare)(const struct dentry *,
|
||||
unsigned int, const char *, const struct qstr *);
|
||||
int (*d_delete)(const struct dentry *);
|
||||
int (*d_init)(struct dentry *);
|
||||
|
|
@ -263,7 +263,7 @@ extern void d_rehash(struct dentry *);
|
|||
|
||||
extern void d_add(struct dentry *, struct inode *);
|
||||
|
||||
extern void dentry_update_name_case(struct dentry *, struct qstr *);
|
||||
extern void dentry_update_name_case(struct dentry *, const struct qstr *);
|
||||
|
||||
/* used for rename() and baskets */
|
||||
extern void d_move(struct dentry *, struct dentry *);
|
||||
|
|
|
|||
|
|
@ -1,71 +0,0 @@
|
|||
#ifndef _DMA_ATTR_H
|
||||
#define _DMA_ATTR_H
|
||||
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
/**
|
||||
* an enum dma_attr represents an attribute associated with a DMA
|
||||
* mapping. The semantics of each attribute should be defined in
|
||||
* Documentation/DMA-attributes.txt.
|
||||
*/
|
||||
enum dma_attr {
|
||||
DMA_ATTR_WRITE_BARRIER,
|
||||
DMA_ATTR_WEAK_ORDERING,
|
||||
DMA_ATTR_WRITE_COMBINE,
|
||||
DMA_ATTR_NON_CONSISTENT,
|
||||
DMA_ATTR_NO_KERNEL_MAPPING,
|
||||
DMA_ATTR_SKIP_CPU_SYNC,
|
||||
DMA_ATTR_FORCE_CONTIGUOUS,
|
||||
DMA_ATTR_ALLOC_SINGLE_PAGES,
|
||||
DMA_ATTR_MAX,
|
||||
};
|
||||
|
||||
#define __DMA_ATTRS_LONGS BITS_TO_LONGS(DMA_ATTR_MAX)
|
||||
|
||||
/**
|
||||
* struct dma_attrs - an opaque container for DMA attributes
|
||||
* @flags - bitmask representing a collection of enum dma_attr
|
||||
*/
|
||||
struct dma_attrs {
|
||||
unsigned long flags[__DMA_ATTRS_LONGS];
|
||||
};
|
||||
|
||||
#define DEFINE_DMA_ATTRS(x) \
|
||||
struct dma_attrs x = { \
|
||||
.flags = { [0 ... __DMA_ATTRS_LONGS-1] = 0 }, \
|
||||
}
|
||||
|
||||
static inline void init_dma_attrs(struct dma_attrs *attrs)
|
||||
{
|
||||
bitmap_zero(attrs->flags, __DMA_ATTRS_LONGS);
|
||||
}
|
||||
|
||||
/**
|
||||
* dma_set_attr - set a specific attribute
|
||||
* @attr: attribute to set
|
||||
* @attrs: struct dma_attrs (may be NULL)
|
||||
*/
|
||||
static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs)
|
||||
{
|
||||
if (attrs == NULL)
|
||||
return;
|
||||
BUG_ON(attr >= DMA_ATTR_MAX);
|
||||
__set_bit(attr, attrs->flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* dma_get_attr - check for a specific attribute
|
||||
* @attr: attribute to set
|
||||
* @attrs: struct dma_attrs (may be NULL)
|
||||
*/
|
||||
static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs)
|
||||
{
|
||||
if (attrs == NULL)
|
||||
return 0;
|
||||
BUG_ON(attr >= DMA_ATTR_MAX);
|
||||
return test_bit(attr, attrs->flags);
|
||||
}
|
||||
|
||||
#endif /* _DMA_ATTR_H */
|
||||
|
|
@ -39,7 +39,7 @@ int dma_direction_to_prot(enum dma_data_direction dir, bool coherent);
|
|||
* the arch code to take care of attributes and cache maintenance
|
||||
*/
|
||||
struct page **iommu_dma_alloc(struct device *dev, size_t size, gfp_t gfp,
|
||||
struct dma_attrs *attrs, int prot, dma_addr_t *handle,
|
||||
unsigned long attrs, int prot, dma_addr_t *handle,
|
||||
void (*flush_page)(struct device *, const void *, phys_addr_t));
|
||||
void iommu_dma_free(struct device *dev, struct page **pages, size_t size,
|
||||
dma_addr_t *handle);
|
||||
|
|
@ -56,9 +56,9 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg,
|
|||
* directly as DMA mapping callbacks for simplicity
|
||||
*/
|
||||
void iommu_dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
|
||||
enum dma_data_direction dir, struct dma_attrs *attrs);
|
||||
enum dma_data_direction dir, unsigned long attrs);
|
||||
void iommu_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir, struct dma_attrs *attrs);
|
||||
enum dma_data_direction dir, unsigned long attrs);
|
||||
int iommu_dma_supported(struct device *dev, u64 mask);
|
||||
int iommu_dma_mapping_error(struct device *dev, dma_addr_t dma_addr);
|
||||
|
||||
|
|
|
|||
|
|
@ -5,13 +5,58 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/dma-attrs.h>
|
||||
#include <linux/dma-debug.h>
|
||||
#include <linux/dma-direction.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/kmemcheck.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
/**
|
||||
* List of possible attributes associated with a DMA mapping. The semantics
|
||||
* of each attribute should be defined in Documentation/DMA-attributes.txt.
|
||||
*
|
||||
* DMA_ATTR_WRITE_BARRIER: DMA to a memory region with this attribute
|
||||
* forces all pending DMA writes to complete.
|
||||
*/
|
||||
#define DMA_ATTR_WRITE_BARRIER (1UL << 0)
|
||||
/*
|
||||
* DMA_ATTR_WEAK_ORDERING: Specifies that reads and writes to the mapping
|
||||
* may be weakly ordered, that is that reads and writes may pass each other.
|
||||
*/
|
||||
#define DMA_ATTR_WEAK_ORDERING (1UL << 1)
|
||||
/*
|
||||
* DMA_ATTR_WRITE_COMBINE: Specifies that writes to the mapping may be
|
||||
* buffered to improve performance.
|
||||
*/
|
||||
#define DMA_ATTR_WRITE_COMBINE (1UL << 2)
|
||||
/*
|
||||
* DMA_ATTR_NON_CONSISTENT: Lets the platform to choose to return either
|
||||
* consistent or non-consistent memory as it sees fit.
|
||||
*/
|
||||
#define DMA_ATTR_NON_CONSISTENT (1UL << 3)
|
||||
/*
|
||||
* DMA_ATTR_NO_KERNEL_MAPPING: Lets the platform to avoid creating a kernel
|
||||
* virtual mapping for the allocated buffer.
|
||||
*/
|
||||
#define DMA_ATTR_NO_KERNEL_MAPPING (1UL << 4)
|
||||
/*
|
||||
* DMA_ATTR_SKIP_CPU_SYNC: Allows platform code to skip synchronization of
|
||||
* the CPU cache for the given buffer assuming that it has been already
|
||||
* transferred to 'device' domain.
|
||||
*/
|
||||
#define DMA_ATTR_SKIP_CPU_SYNC (1UL << 5)
|
||||
/*
|
||||
* DMA_ATTR_FORCE_CONTIGUOUS: Forces contiguous allocation of the buffer
|
||||
* in physical memory.
|
||||
*/
|
||||
#define DMA_ATTR_FORCE_CONTIGUOUS (1UL << 6)
|
||||
/*
|
||||
* DMA_ATTR_ALLOC_SINGLE_PAGES: This is a hint to the DMA-mapping subsystem
|
||||
* that it's probably not worth the time to try to allocate memory to in a way
|
||||
* that gives better TLB efficiency.
|
||||
*/
|
||||
#define DMA_ATTR_ALLOC_SINGLE_PAGES (1UL << 7)
|
||||
|
||||
/*
|
||||
* A dma_addr_t can hold any valid DMA or bus address for the platform.
|
||||
* It can be given to a device to use as a DMA source or target. A CPU cannot
|
||||
|
|
@ -21,34 +66,35 @@
|
|||
struct dma_map_ops {
|
||||
void* (*alloc)(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
void (*free)(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
int (*mmap)(struct device *, struct vm_area_struct *,
|
||||
void *, dma_addr_t, size_t, struct dma_attrs *attrs);
|
||||
void *, dma_addr_t, size_t,
|
||||
unsigned long attrs);
|
||||
|
||||
int (*get_sgtable)(struct device *dev, struct sg_table *sgt, void *,
|
||||
dma_addr_t, size_t, struct dma_attrs *attrs);
|
||||
dma_addr_t, size_t, unsigned long attrs);
|
||||
|
||||
dma_addr_t (*map_page)(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
void (*unmap_page)(struct device *dev, dma_addr_t dma_handle,
|
||||
size_t size, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
/*
|
||||
* map_sg returns 0 on error and a value > 0 on success.
|
||||
* It should never return a value < 0.
|
||||
*/
|
||||
int (*map_sg)(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
void (*unmap_sg)(struct device *dev,
|
||||
struct scatterlist *sg, int nents,
|
||||
enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
void (*sync_single_for_cpu)(struct device *dev,
|
||||
dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction dir);
|
||||
|
|
@ -123,7 +169,7 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev)
|
|||
static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
|
||||
size_t size,
|
||||
enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
dma_addr_t addr;
|
||||
|
|
@ -142,7 +188,7 @@ static inline dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
|
|||
static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
|
||||
size_t size,
|
||||
enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
|
|
@ -158,7 +204,7 @@ static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
|
|||
*/
|
||||
static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
int i, ents;
|
||||
|
|
@ -176,7 +222,7 @@ static inline int dma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
|
|||
|
||||
static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
|
|
@ -195,7 +241,7 @@ static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
|
|||
|
||||
kmemcheck_mark_initialized(page_address(page) + offset, size);
|
||||
BUG_ON(!valid_dma_direction(dir));
|
||||
addr = ops->map_page(dev, page, offset, size, dir, NULL);
|
||||
addr = ops->map_page(dev, page, offset, size, dir, 0);
|
||||
debug_dma_map_page(dev, page, offset, size, dir, addr, false);
|
||||
|
||||
return addr;
|
||||
|
|
@ -208,7 +254,7 @@ static inline void dma_unmap_page(struct device *dev, dma_addr_t addr,
|
|||
|
||||
BUG_ON(!valid_dma_direction(dir));
|
||||
if (ops->unmap_page)
|
||||
ops->unmap_page(dev, addr, size, dir, NULL);
|
||||
ops->unmap_page(dev, addr, size, dir, 0);
|
||||
debug_dma_unmap_page(dev, addr, size, dir, false);
|
||||
}
|
||||
|
||||
|
|
@ -289,10 +335,10 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
|
|||
|
||||
}
|
||||
|
||||
#define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, NULL)
|
||||
#define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, NULL)
|
||||
#define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, NULL)
|
||||
#define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, NULL)
|
||||
#define dma_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, 0)
|
||||
#define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, 0)
|
||||
#define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, 0)
|
||||
#define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
|
||||
|
||||
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size);
|
||||
|
|
@ -321,7 +367,7 @@ void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags);
|
|||
*/
|
||||
static inline int
|
||||
dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
|
||||
dma_addr_t dma_addr, size_t size, unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
BUG_ON(!ops);
|
||||
|
|
@ -330,7 +376,7 @@ dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr,
|
|||
return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
|
||||
}
|
||||
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL)
|
||||
#define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, 0)
|
||||
|
||||
int
|
||||
dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||
|
|
@ -338,7 +384,8 @@ dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
|||
|
||||
static inline int
|
||||
dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr,
|
||||
dma_addr_t dma_addr, size_t size, struct dma_attrs *attrs)
|
||||
dma_addr_t dma_addr, size_t size,
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
BUG_ON(!ops);
|
||||
|
|
@ -348,7 +395,7 @@ dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr,
|
|||
return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size);
|
||||
}
|
||||
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_get_sgtable_attrs(d, t, v, h, s, NULL)
|
||||
#define dma_get_sgtable(d, t, v, h, s) dma_get_sgtable_attrs(d, t, v, h, s, 0)
|
||||
|
||||
#ifndef arch_dma_alloc_attrs
|
||||
#define arch_dma_alloc_attrs(dev, flag) (true)
|
||||
|
|
@ -356,7 +403,7 @@ dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr,
|
|||
|
||||
static inline void *dma_alloc_attrs(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
void *cpu_addr;
|
||||
|
|
@ -378,7 +425,7 @@ static inline void *dma_alloc_attrs(struct device *dev, size_t size,
|
|||
|
||||
static inline void dma_free_attrs(struct device *dev, size_t size,
|
||||
void *cpu_addr, dma_addr_t dma_handle,
|
||||
struct dma_attrs *attrs)
|
||||
unsigned long attrs)
|
||||
{
|
||||
struct dma_map_ops *ops = get_dma_ops(dev);
|
||||
|
||||
|
|
@ -398,31 +445,27 @@ static inline void dma_free_attrs(struct device *dev, size_t size,
|
|||
static inline void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
return dma_alloc_attrs(dev, size, dma_handle, flag, NULL);
|
||||
return dma_alloc_attrs(dev, size, dma_handle, flag, 0);
|
||||
}
|
||||
|
||||
static inline void dma_free_coherent(struct device *dev, size_t size,
|
||||
void *cpu_addr, dma_addr_t dma_handle)
|
||||
{
|
||||
return dma_free_attrs(dev, size, cpu_addr, dma_handle, NULL);
|
||||
return dma_free_attrs(dev, size, cpu_addr, dma_handle, 0);
|
||||
}
|
||||
|
||||
static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
|
||||
dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs);
|
||||
return dma_alloc_attrs(dev, size, dma_handle, gfp, &attrs);
|
||||
return dma_alloc_attrs(dev, size, dma_handle, gfp,
|
||||
DMA_ATTR_NON_CONSISTENT);
|
||||
}
|
||||
|
||||
static inline void dma_free_noncoherent(struct device *dev, size_t size,
|
||||
void *cpu_addr, dma_addr_t dma_handle)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
|
||||
dma_set_attr(DMA_ATTR_NON_CONSISTENT, &attrs);
|
||||
dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs);
|
||||
dma_free_attrs(dev, size, cpu_addr, dma_handle,
|
||||
DMA_ATTR_NON_CONSISTENT);
|
||||
}
|
||||
|
||||
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
|
|
@ -646,9 +689,8 @@ static inline void dmam_release_declared_memory(struct device *dev)
|
|||
static inline void *dma_alloc_wc(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_addr, gfp_t gfp)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_alloc_attrs(dev, size, dma_addr, gfp, &attrs);
|
||||
return dma_alloc_attrs(dev, size, dma_addr, gfp,
|
||||
DMA_ATTR_WRITE_COMBINE);
|
||||
}
|
||||
#ifndef dma_alloc_writecombine
|
||||
#define dma_alloc_writecombine dma_alloc_wc
|
||||
|
|
@ -657,9 +699,8 @@ static inline void *dma_alloc_wc(struct device *dev, size_t size,
|
|||
static inline void dma_free_wc(struct device *dev, size_t size,
|
||||
void *cpu_addr, dma_addr_t dma_addr)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_free_attrs(dev, size, cpu_addr, dma_addr, &attrs);
|
||||
return dma_free_attrs(dev, size, cpu_addr, dma_addr,
|
||||
DMA_ATTR_WRITE_COMBINE);
|
||||
}
|
||||
#ifndef dma_free_writecombine
|
||||
#define dma_free_writecombine dma_free_wc
|
||||
|
|
@ -670,9 +711,8 @@ static inline int dma_mmap_wc(struct device *dev,
|
|||
void *cpu_addr, dma_addr_t dma_addr,
|
||||
size_t size)
|
||||
{
|
||||
DEFINE_DMA_ATTRS(attrs);
|
||||
dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
|
||||
return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs);
|
||||
return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size,
|
||||
DMA_ATTR_WRITE_COMBINE);
|
||||
}
|
||||
#ifndef dma_mmap_writecombine
|
||||
#define dma_mmap_writecombine dma_mmap_wc
|
||||
|
|
|
|||
|
|
@ -1,66 +0,0 @@
|
|||
/*
|
||||
* ds17287rtc.h - register definitions for the ds1728[57] RTC / CMOS RAM
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* (C) 2003 Guido Guenther <agx@sigxcpu.org>
|
||||
*/
|
||||
#ifndef __LINUX_DS17287RTC_H
|
||||
#define __LINUX_DS17287RTC_H
|
||||
|
||||
#include <linux/rtc.h> /* get the user-level API */
|
||||
#include <linux/mc146818rtc.h>
|
||||
|
||||
/* Register A */
|
||||
#define DS_REGA_DV2 0x40 /* countdown chain */
|
||||
#define DS_REGA_DV1 0x20 /* oscillator enable */
|
||||
#define DS_REGA_DV0 0x10 /* bank select */
|
||||
|
||||
/* bank 1 registers */
|
||||
#define DS_B1_MODEL 0x40 /* model number byte */
|
||||
#define DS_B1_SN1 0x41 /* serial number byte 1 */
|
||||
#define DS_B1_SN2 0x42 /* serial number byte 2 */
|
||||
#define DS_B1_SN3 0x43 /* serial number byte 3 */
|
||||
#define DS_B1_SN4 0x44 /* serial number byte 4 */
|
||||
#define DS_B1_SN5 0x45 /* serial number byte 5 */
|
||||
#define DS_B1_SN6 0x46 /* serial number byte 6 */
|
||||
#define DS_B1_CRC 0x47 /* CRC byte */
|
||||
#define DS_B1_CENTURY 0x48 /* Century byte */
|
||||
#define DS_B1_DALARM 0x49 /* date alarm */
|
||||
#define DS_B1_XCTRL4A 0x4a /* extendec control register 4a */
|
||||
#define DS_B1_XCTRL4B 0x4b /* extendec control register 4b */
|
||||
#define DS_B1_RTCADDR2 0x4e /* rtc address 2 */
|
||||
#define DS_B1_RTCADDR3 0x4f /* rtc address 3 */
|
||||
#define DS_B1_RAMLSB 0x50 /* extended ram LSB */
|
||||
#define DS_B1_RAMMSB 0x51 /* extended ram MSB */
|
||||
#define DS_B1_RAMDPORT 0x53 /* extended ram data port */
|
||||
|
||||
/* register details */
|
||||
/* extended control register 4a */
|
||||
#define DS_XCTRL4A_VRT2 0x80 /* valid ram and time */
|
||||
#define DS_XCTRL4A_INCR 0x40 /* increment progress status */
|
||||
#define DS_XCTRL4A_BME 0x20 /* burst mode enable */
|
||||
#define DS_XCTRL4A_PAB 0x08 /* power active bar ctrl */
|
||||
#define DS_XCTRL4A_RF 0x04 /* ram clear flag */
|
||||
#define DS_XCTRL4A_WF 0x02 /* wake up alarm flag */
|
||||
#define DS_XCTRL4A_KF 0x01 /* kickstart flag */
|
||||
|
||||
/* interrupt causes */
|
||||
#define DS_XCTRL4A_IFS (DS_XCTRL4A_RF|DS_XCTRL4A_WF|DS_XCTRL4A_KF)
|
||||
|
||||
/* extended control register 4b */
|
||||
#define DS_XCTRL4B_ABE 0x80 /* auxiliary battery enable */
|
||||
#define DS_XCTRL4B_E32K 0x40 /* enable 32.768 kHz Output */
|
||||
#define DS_XCTRL4B_CS 0x20 /* crystal select */
|
||||
#define DS_XCTRL4B_RCE 0x10 /* ram clear enable */
|
||||
#define DS_XCTRL4B_PRS 0x08 /* PAB resec select */
|
||||
#define DS_XCTRL4B_RIE 0x04 /* ram clear interrupt enable */
|
||||
#define DS_XCTRL4B_WFE 0x02 /* wake up alarm interrupt enable */
|
||||
#define DS_XCTRL4B_KFE 0x01 /* kickstart interrupt enable */
|
||||
|
||||
/* interrupt enable bits */
|
||||
#define DS_XCTRL4B_IFES (DS_XCTRL4B_RIE|DS_XCTRL4B_WFE|DS_XCTRL4B_KFE)
|
||||
|
||||
#endif /* __LINUX_DS17287RTC_H */
|
||||
|
|
@ -1,6 +1,10 @@
|
|||
#ifndef _DYNAMIC_DEBUG_H
|
||||
#define _DYNAMIC_DEBUG_H
|
||||
|
||||
#if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL)
|
||||
#include <linux/jump_label.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* An instance of this structure is created in a special
|
||||
* ELF section at every dynamic debug callsite. At runtime,
|
||||
|
|
@ -33,6 +37,12 @@ struct _ddebug {
|
|||
#define _DPRINTK_FLAGS_DEFAULT 0
|
||||
#endif
|
||||
unsigned int flags:8;
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
union {
|
||||
struct static_key_true dd_key_true;
|
||||
struct static_key_false dd_key_false;
|
||||
} key;
|
||||
#endif
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
|
||||
|
|
@ -60,7 +70,7 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
|
|||
const struct net_device *dev,
|
||||
const char *fmt, ...);
|
||||
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA_KEY(name, fmt, key, init) \
|
||||
static struct _ddebug __aligned(8) \
|
||||
__attribute__((section("__verbose"))) name = { \
|
||||
.modname = KBUILD_MODNAME, \
|
||||
|
|
@ -68,13 +78,51 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
|
|||
.filename = __FILE__, \
|
||||
.format = (fmt), \
|
||||
.lineno = __LINE__, \
|
||||
.flags = _DPRINTK_FLAGS_DEFAULT, \
|
||||
.flags = _DPRINTK_FLAGS_DEFAULT, \
|
||||
dd_key_init(key, init) \
|
||||
}
|
||||
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
|
||||
#define dd_key_init(key, init) key = (init)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA_KEY(name, fmt, .key.dd_key_true, \
|
||||
(STATIC_KEY_TRUE_INIT))
|
||||
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) \
|
||||
static_branch_likely(&descriptor.key.dd_key_true)
|
||||
#else
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA_KEY(name, fmt, .key.dd_key_false, \
|
||||
(STATIC_KEY_FALSE_INIT))
|
||||
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) \
|
||||
static_branch_unlikely(&descriptor.key.dd_key_false)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define dd_key_init(key, init)
|
||||
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA_KEY(name, fmt, 0, 0)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) \
|
||||
likely(descriptor.flags & _DPRINTK_FLAGS_PRINT)
|
||||
#else
|
||||
#define DYNAMIC_DEBUG_BRANCH(descriptor) \
|
||||
unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
|
||||
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
|
@ -82,7 +130,7 @@ do { \
|
|||
#define dynamic_dev_dbg(dev, fmt, ...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
|
||||
__dynamic_dev_dbg(&descriptor, dev, fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
|
@ -90,7 +138,7 @@ do { \
|
|||
#define dynamic_netdev_dbg(dev, fmt, ...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
|
||||
__dynamic_netdev_dbg(&descriptor, dev, fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
|
@ -100,7 +148,7 @@ do { \
|
|||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, \
|
||||
__builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(descriptor)) \
|
||||
print_hex_dump(KERN_DEBUG, prefix_str, \
|
||||
prefix_type, rowsize, groupsize, \
|
||||
buf, len, ascii); \
|
||||
|
|
|
|||
32
include/linux/extable.h
Normal file
32
include/linux/extable.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef _LINUX_EXTABLE_H
|
||||
#define _LINUX_EXTABLE_H
|
||||
|
||||
#include <linux/stddef.h> /* for NULL */
|
||||
|
||||
struct module;
|
||||
struct exception_table_entry;
|
||||
|
||||
const struct exception_table_entry *
|
||||
search_extable(const struct exception_table_entry *first,
|
||||
const struct exception_table_entry *last,
|
||||
unsigned long value);
|
||||
void sort_extable(struct exception_table_entry *start,
|
||||
struct exception_table_entry *finish);
|
||||
void sort_main_extable(void);
|
||||
void trim_init_extable(struct module *m);
|
||||
|
||||
/* Given an address, look for it in the exception tables */
|
||||
const struct exception_table_entry *search_exception_tables(unsigned long add);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
/* For extable.c to search modules' exception tables. */
|
||||
const struct exception_table_entry *search_module_extables(unsigned long addr);
|
||||
#else
|
||||
static inline const struct exception_table_entry *
|
||||
search_module_extables(unsigned long addr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /*CONFIG_MODULES*/
|
||||
|
||||
#endif /* _LINUX_EXTABLE_H */
|
||||
|
|
@ -358,7 +358,7 @@ u64 fence_context_alloc(unsigned num);
|
|||
#define FENCE_TRACE(f, fmt, args...) \
|
||||
do { \
|
||||
struct fence *__ff = (f); \
|
||||
if (config_enabled(CONFIG_FENCE_TRACE)) \
|
||||
if (IS_ENABLED(CONFIG_FENCE_TRACE)) \
|
||||
pr_info("f %llu#%u: " fmt, \
|
||||
__ff->context, __ff->seqno, ##args); \
|
||||
} while (0)
|
||||
|
|
|
|||
|
|
@ -2747,11 +2747,6 @@ extern struct inode *new_inode(struct super_block *sb);
|
|||
extern void free_inode_nonrcu(struct inode *inode);
|
||||
extern int should_remove_suid(struct dentry *);
|
||||
extern int file_remove_privs(struct file *);
|
||||
extern int dentry_needs_remove_privs(struct dentry *dentry);
|
||||
static inline int file_needs_remove_privs(struct file *file)
|
||||
{
|
||||
return dentry_needs_remove_privs(file->f_path.dentry);
|
||||
}
|
||||
|
||||
extern void __insert_inode_hash(struct inode *, unsigned long hashval);
|
||||
static inline void insert_inode_hash(struct inode *inode)
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ struct serio;
|
|||
void i8042_lock_chip(void);
|
||||
void i8042_unlock_chip(void);
|
||||
int i8042_command(unsigned char *param, int command);
|
||||
bool i8042_check_port_owner(const struct serio *);
|
||||
int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str,
|
||||
struct serio *serio));
|
||||
int i8042_remove_filter(bool (*filter)(unsigned char data, unsigned char str,
|
||||
|
|
@ -83,11 +82,6 @@ static inline int i8042_command(unsigned char *param, int command)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline bool i8042_check_port_owner(const struct serio *serio)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str,
|
||||
struct serio *serio))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
extern bool static_key_initialized;
|
||||
|
||||
|
|
@ -115,20 +114,8 @@ enum jump_label_type {
|
|||
|
||||
struct module;
|
||||
|
||||
#include <linux/atomic.h>
|
||||
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
|
||||
static inline int static_key_count(struct static_key *key)
|
||||
{
|
||||
/*
|
||||
* -1 means the first static_key_slow_inc() is in progress.
|
||||
* static_key_enabled() must return true, so return 1 here.
|
||||
*/
|
||||
int n = atomic_read(&key->enabled);
|
||||
return n >= 0 ? n : 1;
|
||||
}
|
||||
|
||||
#define JUMP_TYPE_FALSE 0UL
|
||||
#define JUMP_TYPE_TRUE 1UL
|
||||
#define JUMP_TYPE_MASK 1UL
|
||||
|
|
@ -157,16 +144,29 @@ extern int jump_label_text_reserved(void *start, void *end);
|
|||
extern void static_key_slow_inc(struct static_key *key);
|
||||
extern void static_key_slow_dec(struct static_key *key);
|
||||
extern void jump_label_apply_nops(struct module *mod);
|
||||
extern int static_key_count(struct static_key *key);
|
||||
extern void static_key_enable(struct static_key *key);
|
||||
extern void static_key_disable(struct static_key *key);
|
||||
|
||||
/*
|
||||
* We should be using ATOMIC_INIT() for initializing .enabled, but
|
||||
* the inclusion of atomic.h is problematic for inclusion of jump_label.h
|
||||
* in 'low-level' headers. Thus, we are initializing .enabled with a
|
||||
* raw value, but have added a BUILD_BUG_ON() to catch any issues in
|
||||
* jump_label_init() see: kernel/jump_label.c.
|
||||
*/
|
||||
#define STATIC_KEY_INIT_TRUE \
|
||||
{ .enabled = ATOMIC_INIT(1), \
|
||||
{ .enabled = { 1 }, \
|
||||
.entries = (void *)JUMP_TYPE_TRUE }
|
||||
#define STATIC_KEY_INIT_FALSE \
|
||||
{ .enabled = ATOMIC_INIT(0), \
|
||||
{ .enabled = { 0 }, \
|
||||
.entries = (void *)JUMP_TYPE_FALSE }
|
||||
|
||||
#else /* !HAVE_JUMP_LABEL */
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
static inline int static_key_count(struct static_key *key)
|
||||
{
|
||||
return atomic_read(&key->enabled);
|
||||
|
|
@ -216,14 +216,6 @@ static inline int jump_label_apply_nops(struct module *mod)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define STATIC_KEY_INIT_TRUE { .enabled = ATOMIC_INIT(1) }
|
||||
#define STATIC_KEY_INIT_FALSE { .enabled = ATOMIC_INIT(0) }
|
||||
|
||||
#endif /* HAVE_JUMP_LABEL */
|
||||
|
||||
#define STATIC_KEY_INIT STATIC_KEY_INIT_FALSE
|
||||
#define jump_label_enabled static_key_enabled
|
||||
|
||||
static inline void static_key_enable(struct static_key *key)
|
||||
{
|
||||
int count = static_key_count(key);
|
||||
|
|
@ -244,6 +236,14 @@ static inline void static_key_disable(struct static_key *key)
|
|||
static_key_slow_dec(key);
|
||||
}
|
||||
|
||||
#define STATIC_KEY_INIT_TRUE { .enabled = ATOMIC_INIT(1) }
|
||||
#define STATIC_KEY_INIT_FALSE { .enabled = ATOMIC_INIT(0) }
|
||||
|
||||
#endif /* HAVE_JUMP_LABEL */
|
||||
|
||||
#define STATIC_KEY_INIT STATIC_KEY_INIT_FALSE
|
||||
#define jump_label_enabled static_key_enabled
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -317,7 +317,13 @@ struct kvm_kernel_irq_routing_entry {
|
|||
unsigned irqchip;
|
||||
unsigned pin;
|
||||
} irqchip;
|
||||
struct msi_msg msi;
|
||||
struct {
|
||||
u32 address_lo;
|
||||
u32 address_hi;
|
||||
u32 data;
|
||||
u32 flags;
|
||||
u32 devid;
|
||||
} msi;
|
||||
struct kvm_s390_adapter_int adapter;
|
||||
struct kvm_hv_sint hv_sint;
|
||||
};
|
||||
|
|
@ -1003,12 +1009,12 @@ static inline int mmu_notifier_retry(struct kvm *kvm, unsigned long mmu_seq)
|
|||
|
||||
#ifdef CONFIG_S390
|
||||
#define KVM_MAX_IRQ_ROUTES 4096 //FIXME: we can have more than that...
|
||||
#elif defined(CONFIG_ARM64)
|
||||
#define KVM_MAX_IRQ_ROUTES 4096
|
||||
#else
|
||||
#define KVM_MAX_IRQ_ROUTES 1024
|
||||
#endif
|
||||
|
||||
int kvm_setup_default_irq_routing(struct kvm *kvm);
|
||||
int kvm_setup_empty_irq_routing(struct kvm *kvm);
|
||||
int kvm_set_irq_routing(struct kvm *kvm,
|
||||
const struct kvm_irq_routing_entry *entries,
|
||||
unsigned nr,
|
||||
|
|
@ -1107,8 +1113,20 @@ struct kvm_device {
|
|||
/* create, destroy, and name are mandatory */
|
||||
struct kvm_device_ops {
|
||||
const char *name;
|
||||
|
||||
/*
|
||||
* create is called holding kvm->lock and any operations not suitable
|
||||
* to do while holding the lock should be deferred to init (see
|
||||
* below).
|
||||
*/
|
||||
int (*create)(struct kvm_device *dev, u32 type);
|
||||
|
||||
/*
|
||||
* init is called after create if create is successful and is called
|
||||
* outside of holding kvm->lock.
|
||||
*/
|
||||
void (*init)(struct kvm_device *dev);
|
||||
|
||||
/*
|
||||
* Destroy is responsible for freeing dev.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1356,7 +1356,7 @@ union security_list_options {
|
|||
struct super_block *newsb);
|
||||
int (*sb_parse_opts_str)(char *options, struct security_mnt_opts *opts);
|
||||
int (*dentry_init_security)(struct dentry *dentry, int mode,
|
||||
struct qstr *name, void **ctx,
|
||||
const struct qstr *name, void **ctx,
|
||||
u32 *ctxlen);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@
|
|||
#include <asm/io.h>
|
||||
#include <linux/rtc.h> /* get the user-level API */
|
||||
#include <asm/mc146818rtc.h> /* register access macros */
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/spinlock.h> /* spinlock_t */
|
||||
|
|
@ -120,4 +122,7 @@ struct cmos_rtc_board_info {
|
|||
#define RTC_IO_EXTENT_USED RTC_IO_EXTENT
|
||||
#endif /* ARCH_RTC_LOCATION */
|
||||
|
||||
unsigned int mc146818_get_time(struct rtc_time *time);
|
||||
int mc146818_set_time(struct rtc_time *time);
|
||||
|
||||
#endif /* _MC146818RTC_H */
|
||||
|
|
|
|||
|
|
@ -225,6 +225,21 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev,
|
|||
int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_cmd_xfer_status - Send a command to the ChromeOS EC
|
||||
*
|
||||
* This function is identical to cros_ec_cmd_xfer, except it returns success
|
||||
* status only if both the command was transmitted successfully and the EC
|
||||
* replied with success status. It's not necessary to check msg->result when
|
||||
* using this function.
|
||||
*
|
||||
* @ec_dev: EC device
|
||||
* @msg: Message to write
|
||||
* @return: Num. of bytes transferred on success, <0 on failure
|
||||
*/
|
||||
int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_remove - Remove a ChromeOS EC
|
||||
*
|
||||
|
|
|
|||
|
|
@ -949,6 +949,37 @@ struct ec_params_pwm_set_fan_duty {
|
|||
uint32_t percent;
|
||||
} __packed;
|
||||
|
||||
#define EC_CMD_PWM_SET_DUTY 0x25
|
||||
/* 16 bit duty cycle, 0xffff = 100% */
|
||||
#define EC_PWM_MAX_DUTY 0xffff
|
||||
|
||||
enum ec_pwm_type {
|
||||
/* All types, indexed by board-specific enum pwm_channel */
|
||||
EC_PWM_TYPE_GENERIC = 0,
|
||||
/* Keyboard backlight */
|
||||
EC_PWM_TYPE_KB_LIGHT,
|
||||
/* Display backlight */
|
||||
EC_PWM_TYPE_DISPLAY_LIGHT,
|
||||
EC_PWM_TYPE_COUNT,
|
||||
};
|
||||
|
||||
struct ec_params_pwm_set_duty {
|
||||
uint16_t duty; /* Duty cycle, EC_PWM_MAX_DUTY = 100% */
|
||||
uint8_t pwm_type; /* ec_pwm_type */
|
||||
uint8_t index; /* Type-specific index, or 0 if unique */
|
||||
} __packed;
|
||||
|
||||
#define EC_CMD_PWM_GET_DUTY 0x26
|
||||
|
||||
struct ec_params_pwm_get_duty {
|
||||
uint8_t pwm_type; /* ec_pwm_type */
|
||||
uint8_t index; /* Type-specific index, or 0 if unique */
|
||||
} __packed;
|
||||
|
||||
struct ec_response_pwm_get_duty {
|
||||
uint16_t duty; /* Duty cycle, EC_PWM_MAX_DUTY = 100% */
|
||||
} __packed;
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* Lightbar commands. This looks worse than it is. Since we only use one HOST
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ enum {
|
|||
MLX4_DEV_CAP_FLAG2_LB_SRC_CHK = 1ULL << 32,
|
||||
MLX4_DEV_CAP_FLAG2_ROCE_V1_V2 = 1ULL << 33,
|
||||
MLX4_DEV_CAP_FLAG2_DMFS_UC_MC_SNIFFER = 1ULL << 34,
|
||||
MLX4_DEV_CAP_FLAG2_DIAG_PER_PORT = 1ULL << 35,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
@ -1342,6 +1343,9 @@ enum {
|
|||
VXLAN_STEER_BY_INNER_VLAN = 1 << 4,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX4_OP_MOD_QUERY_TRANSPORT_CI_ERRORS = 0x2,
|
||||
};
|
||||
|
||||
int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, u32 qpn,
|
||||
enum mlx4_net_trans_promisc_mode mode);
|
||||
|
|
@ -1382,6 +1386,9 @@ void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr,
|
|||
int mlx4_fmr_free(struct mlx4_dev *dev, struct mlx4_fmr *fmr);
|
||||
int mlx4_SYNC_TPT(struct mlx4_dev *dev);
|
||||
int mlx4_test_interrupts(struct mlx4_dev *dev);
|
||||
int mlx4_query_diag_counters(struct mlx4_dev *dev, u8 op_modifier,
|
||||
const u32 offset[], u32 value[],
|
||||
size_t array_len, u8 port);
|
||||
u32 mlx4_get_eqs_per_port(struct mlx4_dev *dev, u8 port);
|
||||
bool mlx4_is_eq_vector_valid(struct mlx4_dev *dev, u8 port, int vector);
|
||||
struct cpu_rmap *mlx4_get_cpu_rmap(struct mlx4_dev *dev, int port);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,8 @@ struct mlx5_core_cq {
|
|||
void (*comp)(struct mlx5_core_cq *);
|
||||
void *priv;
|
||||
} tasklet_ctx;
|
||||
int reset_notify_added;
|
||||
struct list_head reset_notify;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
|
||||
#include <linux/mlx5/device.h>
|
||||
#include <linux/mlx5/doorbell.h>
|
||||
#include <linux/mlx5/srq.h>
|
||||
|
||||
enum {
|
||||
MLX5_RQ_BITMASK_VSD = 1 << 1,
|
||||
|
|
@ -798,11 +799,10 @@ struct mlx5_cmd_mailbox *mlx5_alloc_cmd_mailbox_chain(struct mlx5_core_dev *dev,
|
|||
void mlx5_free_cmd_mailbox_chain(struct mlx5_core_dev *dev,
|
||||
struct mlx5_cmd_mailbox *head);
|
||||
int mlx5_core_create_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
|
||||
struct mlx5_create_srq_mbox_in *in, int inlen,
|
||||
int is_xrc);
|
||||
struct mlx5_srq_attr *in);
|
||||
int mlx5_core_destroy_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq);
|
||||
int mlx5_core_query_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
|
||||
struct mlx5_query_srq_mbox_out *out);
|
||||
struct mlx5_srq_attr *out);
|
||||
int mlx5_core_arm_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
|
||||
u16 lwm, int is_srq);
|
||||
void mlx5_init_mkey_table(struct mlx5_core_dev *dev);
|
||||
|
|
|
|||
|
|
@ -556,9 +556,9 @@ struct mlx5_destroy_qp_mbox_out {
|
|||
struct mlx5_modify_qp_mbox_in {
|
||||
struct mlx5_inbox_hdr hdr;
|
||||
__be32 qpn;
|
||||
u8 rsvd1[4];
|
||||
__be32 optparam;
|
||||
u8 rsvd0[4];
|
||||
__be32 optparam;
|
||||
u8 rsvd1[4];
|
||||
struct mlx5_qp_context ctx;
|
||||
u8 rsvd2[16];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -35,6 +35,31 @@
|
|||
|
||||
#include <linux/mlx5/driver.h>
|
||||
|
||||
enum {
|
||||
MLX5_SRQ_FLAG_ERR = (1 << 0),
|
||||
MLX5_SRQ_FLAG_WQ_SIG = (1 << 1),
|
||||
};
|
||||
|
||||
struct mlx5_srq_attr {
|
||||
u32 type;
|
||||
u32 flags;
|
||||
u32 log_size;
|
||||
u32 wqe_shift;
|
||||
u32 log_page_size;
|
||||
u32 wqe_cnt;
|
||||
u32 srqn;
|
||||
u32 xrcd;
|
||||
u32 page_offset;
|
||||
u32 cqn;
|
||||
u32 pd;
|
||||
u32 lwm;
|
||||
u32 user_index;
|
||||
u64 db_record;
|
||||
u64 *pas;
|
||||
};
|
||||
|
||||
struct mlx5_core_dev;
|
||||
|
||||
void mlx5_init_srq_table(struct mlx5_core_dev *dev);
|
||||
void mlx5_cleanup_srq_table(struct mlx5_core_dev *dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -68,8 +68,10 @@ extern char * const migratetype_names[MIGRATE_TYPES];
|
|||
|
||||
#ifdef CONFIG_CMA
|
||||
# define is_migrate_cma(migratetype) unlikely((migratetype) == MIGRATE_CMA)
|
||||
# define is_migrate_cma_page(_page) (get_pageblock_migratetype(_page) == MIGRATE_CMA)
|
||||
#else
|
||||
# define is_migrate_cma(migratetype) false
|
||||
# define is_migrate_cma_page(_page) false
|
||||
#endif
|
||||
|
||||
#define for_each_migratetype_order(order, type) \
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/jump_label.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/extable.h> /* only as arch move module.h -> extable.h */
|
||||
#include <linux/rbtree_latch.h>
|
||||
|
||||
#include <linux/percpu.h>
|
||||
|
|
@ -37,6 +38,7 @@ struct modversion_info {
|
|||
};
|
||||
|
||||
struct module;
|
||||
struct exception_table_entry;
|
||||
|
||||
struct module_kobject {
|
||||
struct kobject kobj;
|
||||
|
|
@ -155,18 +157,6 @@ extern void cleanup_module(void);
|
|||
#define __INITRODATA_OR_MODULE __INITRODATA
|
||||
#endif /*CONFIG_MODULES*/
|
||||
|
||||
/* Archs provide a method of finding the correct exception table. */
|
||||
struct exception_table_entry;
|
||||
|
||||
const struct exception_table_entry *
|
||||
search_extable(const struct exception_table_entry *first,
|
||||
const struct exception_table_entry *last,
|
||||
unsigned long value);
|
||||
void sort_extable(struct exception_table_entry *start,
|
||||
struct exception_table_entry *finish);
|
||||
void sort_main_extable(void);
|
||||
void trim_init_extable(struct module *m);
|
||||
|
||||
/* Generic info of form tag = "info" */
|
||||
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
|
||||
|
||||
|
|
@ -268,9 +258,6 @@ extern const typeof(name) __mod_##type##__##name##_device_table \
|
|||
* files require multiple MODULE_FIRMWARE() specifiers */
|
||||
#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
|
||||
|
||||
/* Given an address, look for it in the exception tables */
|
||||
const struct exception_table_entry *search_exception_tables(unsigned long add);
|
||||
|
||||
struct notifier_block;
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
|
|
@ -311,6 +298,8 @@ struct module_layout {
|
|||
unsigned int text_size;
|
||||
/* Size of RO section of the module (text+rodata) */
|
||||
unsigned int ro_size;
|
||||
/* Size of RO after init section */
|
||||
unsigned int ro_after_init_size;
|
||||
|
||||
#ifdef CONFIG_MODULES_TREE_LOOKUP
|
||||
struct mod_tree_node mtn;
|
||||
|
|
@ -575,8 +564,8 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
|
|||
struct module *, unsigned long),
|
||||
void *data);
|
||||
|
||||
extern void __module_put_and_exit(struct module *mod, long code)
|
||||
__attribute__((noreturn));
|
||||
extern void __noreturn __module_put_and_exit(struct module *mod,
|
||||
long code);
|
||||
#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code)
|
||||
|
||||
#ifdef CONFIG_MODULE_UNLOAD
|
||||
|
|
@ -630,9 +619,6 @@ const char *module_address_lookup(unsigned long addr,
|
|||
int lookup_module_symbol_name(unsigned long addr, char *symname);
|
||||
int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name);
|
||||
|
||||
/* For extable.c to search modules' exception tables. */
|
||||
const struct exception_table_entry *search_module_extables(unsigned long addr);
|
||||
|
||||
int register_module_notifier(struct notifier_block *nb);
|
||||
int unregister_module_notifier(struct notifier_block *nb);
|
||||
|
||||
|
|
@ -657,13 +643,6 @@ static inline bool is_livepatch_module(struct module *mod)
|
|||
|
||||
#else /* !CONFIG_MODULES... */
|
||||
|
||||
/* Given an address, look for it in the exception tables. */
|
||||
static inline const struct exception_table_entry *
|
||||
search_module_extables(unsigned long addr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct module *__module_address(unsigned long addr)
|
||||
{
|
||||
return NULL;
|
||||
|
|
@ -788,12 +767,12 @@ extern int module_sysfs_initialized;
|
|||
#ifdef CONFIG_DEBUG_SET_MODULE_RONX
|
||||
extern void set_all_modules_text_rw(void);
|
||||
extern void set_all_modules_text_ro(void);
|
||||
extern void module_enable_ro(const struct module *mod);
|
||||
extern void module_enable_ro(const struct module *mod, bool after_init);
|
||||
extern void module_disable_ro(const struct module *mod);
|
||||
#else
|
||||
static inline void set_all_modules_text_rw(void) { }
|
||||
static inline void set_all_modules_text_ro(void) { }
|
||||
static inline void module_enable_ro(const struct module *mod) { }
|
||||
static inline void module_enable_ro(const struct module *mod, bool after_init) { }
|
||||
static inline void module_disable_ro(const struct module *mod) { }
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -270,6 +270,8 @@ enum {
|
|||
MSI_FLAG_MULTI_PCI_MSI = (1 << 2),
|
||||
/* Support PCI MSIX interrupts */
|
||||
MSI_FLAG_PCI_MSIX = (1 << 3),
|
||||
/* Needs early activate, required for PCI */
|
||||
MSI_FLAG_ACTIVATE_EARLY = (1 << 4),
|
||||
};
|
||||
|
||||
int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
||||
|
|
|
|||
|
|
@ -3895,8 +3895,7 @@ void netdev_default_l2upper_neigh_destroy(struct net_device *dev,
|
|||
extern u8 netdev_rss_key[NETDEV_RSS_KEY_LEN] __read_mostly;
|
||||
void netdev_rss_key_fill(void *buffer, size_t len);
|
||||
|
||||
int dev_get_nest_level(struct net_device *dev,
|
||||
bool (*type_check)(const struct net_device *dev));
|
||||
int dev_get_nest_level(struct net_device *dev);
|
||||
int skb_checksum_help(struct sk_buff *skb);
|
||||
struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features, bool tx_path);
|
||||
|
|
|
|||
|
|
@ -643,4 +643,15 @@ enum pnfs_update_layout_reason {
|
|||
PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
|
||||
};
|
||||
|
||||
#define NFS4_OP_MAP_NUM_LONGS \
|
||||
DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long))
|
||||
#define NFS4_OP_MAP_NUM_WORDS \
|
||||
(NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32))
|
||||
struct nfs4_op_map {
|
||||
union {
|
||||
unsigned long longs[NFS4_OP_MAP_NUM_LONGS];
|
||||
u32 words[NFS4_OP_MAP_NUM_WORDS];
|
||||
} u;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1185,17 +1185,6 @@ struct pnfs_ds_commit_info {
|
|||
struct pnfs_commit_bucket *buckets;
|
||||
};
|
||||
|
||||
#define NFS4_OP_MAP_NUM_LONGS \
|
||||
DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long))
|
||||
#define NFS4_OP_MAP_NUM_WORDS \
|
||||
(NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32))
|
||||
struct nfs4_op_map {
|
||||
union {
|
||||
unsigned long longs[NFS4_OP_MAP_NUM_LONGS];
|
||||
u32 words[NFS4_OP_MAP_NUM_WORDS];
|
||||
} u;
|
||||
};
|
||||
|
||||
struct nfs41_state_protection {
|
||||
u32 how;
|
||||
struct nfs4_op_map enforce;
|
||||
|
|
@ -1543,7 +1532,7 @@ struct nfs_rpc_ops {
|
|||
struct nfs_fattr *, struct nfs4_label *);
|
||||
int (*setattr) (struct dentry *, struct nfs_fattr *,
|
||||
struct iattr *);
|
||||
int (*lookup) (struct inode *, struct qstr *,
|
||||
int (*lookup) (struct inode *, const struct qstr *,
|
||||
struct nfs_fh *, struct nfs_fattr *,
|
||||
struct nfs4_label *);
|
||||
int (*access) (struct inode *, struct nfs_access_entry *);
|
||||
|
|
@ -1551,18 +1540,18 @@ struct nfs_rpc_ops {
|
|||
unsigned int);
|
||||
int (*create) (struct inode *, struct dentry *,
|
||||
struct iattr *, int);
|
||||
int (*remove) (struct inode *, struct qstr *);
|
||||
int (*remove) (struct inode *, const struct qstr *);
|
||||
void (*unlink_setup) (struct rpc_message *, struct inode *dir);
|
||||
void (*unlink_rpc_prepare) (struct rpc_task *, struct nfs_unlinkdata *);
|
||||
int (*unlink_done) (struct rpc_task *, struct inode *);
|
||||
void (*rename_setup) (struct rpc_message *msg, struct inode *dir);
|
||||
void (*rename_rpc_prepare)(struct rpc_task *task, struct nfs_renamedata *);
|
||||
int (*rename_done) (struct rpc_task *task, struct inode *old_dir, struct inode *new_dir);
|
||||
int (*link) (struct inode *, struct inode *, struct qstr *);
|
||||
int (*link) (struct inode *, struct inode *, const struct qstr *);
|
||||
int (*symlink) (struct inode *, struct dentry *, struct page *,
|
||||
unsigned int, struct iattr *);
|
||||
int (*mkdir) (struct inode *, struct dentry *, struct iattr *);
|
||||
int (*rmdir) (struct inode *, struct qstr *);
|
||||
int (*rmdir) (struct inode *, const struct qstr *);
|
||||
int (*readdir) (struct dentry *, struct rpc_cred *,
|
||||
u64, struct page **, unsigned int, int);
|
||||
int (*mknod) (struct inode *, struct dentry *, struct iattr *,
|
||||
|
|
|
|||
|
|
@ -510,7 +510,7 @@ static inline void wait_on_page_writeback(struct page *page)
|
|||
extern void end_page_writeback(struct page *page);
|
||||
void wait_for_stable_page(struct page *page);
|
||||
|
||||
void page_endio(struct page *page, int rw, int err);
|
||||
void page_endio(struct page *page, bool is_write, int err);
|
||||
|
||||
/*
|
||||
* Add an arbitrary waiter to a page's wait queue
|
||||
|
|
|
|||
|
|
@ -743,7 +743,9 @@ struct perf_event_context {
|
|||
u64 parent_gen;
|
||||
u64 generation;
|
||||
int pin_count;
|
||||
#ifdef CONFIG_CGROUP_PERF
|
||||
int nr_cgroups; /* cgroup evts */
|
||||
#endif
|
||||
void *task_ctx_data; /* pmu specific data */
|
||||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
|
@ -769,7 +771,9 @@ struct perf_cpu_context {
|
|||
unsigned int hrtimer_active;
|
||||
|
||||
struct pmu *unique_pmu;
|
||||
#ifdef CONFIG_CGROUP_PERF
|
||||
struct perf_cgroup *cgrp;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct perf_output_handle {
|
||||
|
|
|
|||
|
|
@ -266,39 +266,21 @@ extern asmlinkage void dump_stack(void) __cold;
|
|||
* and other debug macros are compiled out unless either DEBUG is defined
|
||||
* or CONFIG_DYNAMIC_DEBUG is set.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
asmlinkage __printf(1, 2) __cold void __pr_emerg(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_alert(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_crit(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_err(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_warn(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_notice(const char *fmt, ...);
|
||||
asmlinkage __printf(1, 2) __cold void __pr_info(const char *fmt, ...);
|
||||
|
||||
#define pr_emerg(fmt, ...) __pr_emerg(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_alert(fmt, ...) __pr_alert(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_crit(fmt, ...) __pr_crit(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_err(fmt, ...) __pr_err(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_warn(fmt, ...) __pr_warn(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_notice(fmt, ...) __pr_notice(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) __pr_info(pr_fmt(fmt), ##__VA_ARGS__)
|
||||
|
||||
#else
|
||||
|
||||
#define pr_emerg(fmt, ...) printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_alert(fmt, ...) printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_crit(fmt, ...) printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_err(fmt, ...) printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_warn(fmt, ...) printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_notice(fmt, ...) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
|
||||
|
||||
#endif
|
||||
|
||||
#define pr_warning pr_warn
|
||||
|
||||
#define pr_emerg(fmt, ...) \
|
||||
printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_alert(fmt, ...) \
|
||||
printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_crit(fmt, ...) \
|
||||
printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_err(fmt, ...) \
|
||||
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_warning(fmt, ...) \
|
||||
printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_warn pr_warning
|
||||
#define pr_notice(fmt, ...) \
|
||||
printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) \
|
||||
printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
|
||||
/*
|
||||
* Like KERN_CONT, pr_cont() should only be used when continuing
|
||||
* a line with no newline ('\n') enclosed. Otherwise it defaults
|
||||
|
|
|
|||
|
|
@ -5,7 +5,9 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
struct pwm_capture;
|
||||
struct seq_file;
|
||||
|
||||
struct pwm_chip;
|
||||
|
||||
/**
|
||||
|
|
@ -147,12 +149,101 @@ static inline void pwm_get_args(const struct pwm_device *pwm,
|
|||
*args = pwm->args;
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_init_state() - prepare a new state to be applied with pwm_apply_state()
|
||||
* @pwm: PWM device
|
||||
* @state: state to fill with the prepared PWM state
|
||||
*
|
||||
* This functions prepares a state that can later be tweaked and applied
|
||||
* to the PWM device with pwm_apply_state(). This is a convenient function
|
||||
* that first retrieves the current PWM state and the replaces the period
|
||||
* and polarity fields with the reference values defined in pwm->args.
|
||||
* Once the function returns, you can adjust the ->enabled and ->duty_cycle
|
||||
* fields according to your needs before calling pwm_apply_state().
|
||||
*
|
||||
* ->duty_cycle is initially set to zero to avoid cases where the current
|
||||
* ->duty_cycle value exceed the pwm_args->period one, which would trigger
|
||||
* an error if the user calls pwm_apply_state() without adjusting ->duty_cycle
|
||||
* first.
|
||||
*/
|
||||
static inline void pwm_init_state(const struct pwm_device *pwm,
|
||||
struct pwm_state *state)
|
||||
{
|
||||
struct pwm_args args;
|
||||
|
||||
/* First get the current state. */
|
||||
pwm_get_state(pwm, state);
|
||||
|
||||
/* Then fill it with the reference config */
|
||||
pwm_get_args(pwm, &args);
|
||||
|
||||
state->period = args.period;
|
||||
state->polarity = args.polarity;
|
||||
state->duty_cycle = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_get_relative_duty_cycle() - Get a relative duty cycle value
|
||||
* @state: PWM state to extract the duty cycle from
|
||||
* @scale: target scale of the relative duty cycle
|
||||
*
|
||||
* This functions converts the absolute duty cycle stored in @state (expressed
|
||||
* in nanosecond) into a value relative to the period.
|
||||
*
|
||||
* For example if you want to get the duty_cycle expressed in percent, call:
|
||||
*
|
||||
* pwm_get_state(pwm, &state);
|
||||
* duty = pwm_get_relative_duty_cycle(&state, 100);
|
||||
*/
|
||||
static inline unsigned int
|
||||
pwm_get_relative_duty_cycle(const struct pwm_state *state, unsigned int scale)
|
||||
{
|
||||
if (!state->period)
|
||||
return 0;
|
||||
|
||||
return DIV_ROUND_CLOSEST_ULL((u64)state->duty_cycle * scale,
|
||||
state->period);
|
||||
}
|
||||
|
||||
/**
|
||||
* pwm_set_relative_duty_cycle() - Set a relative duty cycle value
|
||||
* @state: PWM state to fill
|
||||
* @duty_cycle: relative duty cycle value
|
||||
* @scale: scale in which @duty_cycle is expressed
|
||||
*
|
||||
* This functions converts a relative into an absolute duty cycle (expressed
|
||||
* in nanoseconds), and puts the result in state->duty_cycle.
|
||||
*
|
||||
* For example if you want to configure a 50% duty cycle, call:
|
||||
*
|
||||
* pwm_init_state(pwm, &state);
|
||||
* pwm_set_relative_duty_cycle(&state, 50, 100);
|
||||
* pwm_apply_state(pwm, &state);
|
||||
*
|
||||
* This functions returns -EINVAL if @duty_cycle and/or @scale are
|
||||
* inconsistent (@scale == 0 or @duty_cycle > @scale).
|
||||
*/
|
||||
static inline int
|
||||
pwm_set_relative_duty_cycle(struct pwm_state *state, unsigned int duty_cycle,
|
||||
unsigned int scale)
|
||||
{
|
||||
if (!scale || duty_cycle > scale)
|
||||
return -EINVAL;
|
||||
|
||||
state->duty_cycle = DIV_ROUND_CLOSEST_ULL((u64)duty_cycle *
|
||||
state->period,
|
||||
scale);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct pwm_ops - PWM controller operations
|
||||
* @request: optional hook for requesting a PWM
|
||||
* @free: optional hook for freeing a PWM
|
||||
* @config: configure duty cycles and period length for this PWM
|
||||
* @set_polarity: configure the polarity of this PWM
|
||||
* @capture: capture and report PWM signal
|
||||
* @enable: enable PWM output toggling
|
||||
* @disable: disable PWM output toggling
|
||||
* @apply: atomically apply a new PWM config. The state argument
|
||||
|
|
@ -172,6 +263,8 @@ struct pwm_ops {
|
|||
int duty_ns, int period_ns);
|
||||
int (*set_polarity)(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
enum pwm_polarity polarity);
|
||||
int (*capture)(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
struct pwm_capture *result, unsigned long timeout);
|
||||
int (*enable)(struct pwm_chip *chip, struct pwm_device *pwm);
|
||||
void (*disable)(struct pwm_chip *chip, struct pwm_device *pwm);
|
||||
int (*apply)(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
|
|
@ -212,6 +305,16 @@ struct pwm_chip {
|
|||
bool can_sleep;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct pwm_capture - PWM capture data
|
||||
* @period: period of the PWM signal (in nanoseconds)
|
||||
* @duty_cycle: duty cycle of the PWM signal (in nanoseconds)
|
||||
*/
|
||||
struct pwm_capture {
|
||||
unsigned int period;
|
||||
unsigned int duty_cycle;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_PWM)
|
||||
/* PWM user APIs */
|
||||
struct pwm_device *pwm_request(int pwm_id, const char *label);
|
||||
|
|
@ -323,8 +426,9 @@ static inline void pwm_disable(struct pwm_device *pwm)
|
|||
pwm_apply_state(pwm, &state);
|
||||
}
|
||||
|
||||
|
||||
/* PWM provider APIs */
|
||||
int pwm_capture(struct pwm_device *pwm, struct pwm_capture *result,
|
||||
unsigned long timeout);
|
||||
int pwm_set_chip_data(struct pwm_device *pwm, void *data);
|
||||
void *pwm_get_chip_data(struct pwm_device *pwm);
|
||||
|
||||
|
|
@ -376,6 +480,13 @@ static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int pwm_capture(struct pwm_device *pwm,
|
||||
struct pwm_capture *result,
|
||||
unsigned long timeout)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int pwm_set_polarity(struct pwm_device *pwm,
|
||||
enum pwm_polarity polarity)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -70,8 +70,16 @@ struct qed_dbcx_pfc_params {
|
|||
u8 max_tc;
|
||||
};
|
||||
|
||||
enum qed_dcbx_sf_ieee_type {
|
||||
QED_DCBX_SF_IEEE_ETHTYPE,
|
||||
QED_DCBX_SF_IEEE_TCP_PORT,
|
||||
QED_DCBX_SF_IEEE_UDP_PORT,
|
||||
QED_DCBX_SF_IEEE_TCP_UDP_PORT
|
||||
};
|
||||
|
||||
struct qed_app_entry {
|
||||
bool ethtype;
|
||||
enum qed_dcbx_sf_ieee_type sf_ieee;
|
||||
bool enabled;
|
||||
u8 prio;
|
||||
u16 proto_id;
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ int security_sb_clone_mnt_opts(const struct super_block *oldsb,
|
|||
struct super_block *newsb);
|
||||
int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts);
|
||||
int security_dentry_init_security(struct dentry *dentry, int mode,
|
||||
struct qstr *name, void **ctx,
|
||||
const struct qstr *name, void **ctx,
|
||||
u32 *ctxlen);
|
||||
|
||||
int security_inode_alloc(struct inode *inode);
|
||||
|
|
@ -591,7 +591,7 @@ static inline void security_inode_free(struct inode *inode)
|
|||
|
||||
static inline int security_dentry_init_security(struct dentry *dentry,
|
||||
int mode,
|
||||
struct qstr *name,
|
||||
const struct qstr *name,
|
||||
void **ctx,
|
||||
u32 *ctxlen)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ struct serio {
|
|||
|
||||
struct serio_device_id id;
|
||||
|
||||
spinlock_t lock; /* protects critical sections from port's interrupt handler */
|
||||
/* Protects critical sections from port's interrupt handler */
|
||||
spinlock_t lock;
|
||||
|
||||
int (*write)(struct serio *, unsigned char);
|
||||
int (*open)(struct serio *);
|
||||
|
|
@ -40,16 +41,29 @@ struct serio {
|
|||
void (*stop)(struct serio *);
|
||||
|
||||
struct serio *parent;
|
||||
struct list_head child_node; /* Entry in parent->children list */
|
||||
/* Entry in parent->children list */
|
||||
struct list_head child_node;
|
||||
struct list_head children;
|
||||
unsigned int depth; /* level of nesting in serio hierarchy */
|
||||
/* Level of nesting in serio hierarchy */
|
||||
unsigned int depth;
|
||||
|
||||
struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */
|
||||
struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */
|
||||
/*
|
||||
* serio->drv is accessed from interrupt handlers; when modifying
|
||||
* caller should acquire serio->drv_mutex and serio->lock.
|
||||
*/
|
||||
struct serio_driver *drv;
|
||||
/* Protects serio->drv so attributes can pin current driver */
|
||||
struct mutex drv_mutex;
|
||||
|
||||
struct device dev;
|
||||
|
||||
struct list_head node;
|
||||
|
||||
/*
|
||||
* For use by PS/2 layer when several ports share hardware and
|
||||
* may get indigestion when exposed to concurrent access (i8042).
|
||||
*/
|
||||
struct mutex *ps2_cmd_mutex;
|
||||
};
|
||||
#define to_serio_port(d) container_of(d, struct serio, dev)
|
||||
|
||||
|
|
|
|||
|
|
@ -155,6 +155,18 @@ void kfree(const void *);
|
|||
void kzfree(const void *);
|
||||
size_t ksize(const void *);
|
||||
|
||||
#ifdef CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR
|
||||
const char *__check_heap_object(const void *ptr, unsigned long n,
|
||||
struct page *page);
|
||||
#else
|
||||
static inline const char *__check_heap_object(const void *ptr,
|
||||
unsigned long n,
|
||||
struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some archs want to perform DMA into kmalloc caches and need a guaranteed
|
||||
* alignment larger than the alignment of a 64-bit integer.
|
||||
|
|
|
|||
|
|
@ -78,8 +78,6 @@ struct cache_detail {
|
|||
struct hlist_head * hash_table;
|
||||
rwlock_t hash_lock;
|
||||
|
||||
atomic_t inuse; /* active user-space update or lookup */
|
||||
|
||||
char *name;
|
||||
void (*cache_put)(struct kref *);
|
||||
|
||||
|
|
|
|||
|
|
@ -195,6 +195,8 @@ int rpc_clnt_add_xprt(struct rpc_clnt *, struct xprt_create *,
|
|||
struct rpc_xprt *,
|
||||
void *),
|
||||
void *data);
|
||||
void rpc_cap_max_reconnect_timeout(struct rpc_clnt *clnt,
|
||||
unsigned long timeo);
|
||||
|
||||
const char *rpc_proc_name(const struct rpc_task *task);
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
|||
|
|
@ -268,6 +268,7 @@ struct svc_rqst {
|
|||
* cache pages */
|
||||
#define RQ_VICTIM (5) /* about to be shut down */
|
||||
#define RQ_BUSY (6) /* request is busy */
|
||||
#define RQ_DATA (7) /* request has data */
|
||||
unsigned long rq_flags; /* flags field */
|
||||
|
||||
void * rq_argp; /* decoded arguments */
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ struct svc_xprt_ops {
|
|||
void (*xpo_detach)(struct svc_xprt *);
|
||||
void (*xpo_free)(struct svc_xprt *);
|
||||
int (*xpo_secure_port)(struct svc_rqst *);
|
||||
void (*xpo_adjust_wspace)(struct svc_xprt *);
|
||||
};
|
||||
|
||||
struct svc_xprt_class {
|
||||
|
|
@ -69,6 +68,7 @@ struct svc_xprt {
|
|||
|
||||
struct svc_serv *xpt_server; /* service for transport */
|
||||
atomic_t xpt_reserved; /* space on outq that is rsvd */
|
||||
atomic_t xpt_nr_rqsts; /* Number of requests */
|
||||
struct mutex xpt_mutex; /* to serialize sending data */
|
||||
spinlock_t xpt_lock; /* protects sk_deferred
|
||||
* and xpt_auth_cache */
|
||||
|
|
|
|||
|
|
@ -218,7 +218,8 @@ struct rpc_xprt {
|
|||
struct work_struct task_cleanup;
|
||||
struct timer_list timer;
|
||||
unsigned long last_used,
|
||||
idle_timeout;
|
||||
idle_timeout,
|
||||
max_reconnect_timeout;
|
||||
|
||||
/*
|
||||
* Send stuff
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
struct dma_attrs;
|
||||
struct page;
|
||||
struct scatterlist;
|
||||
|
||||
|
|
@ -68,10 +67,10 @@ swiotlb_free_coherent(struct device *hwdev, size_t size,
|
|||
extern dma_addr_t swiotlb_map_page(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr,
|
||||
size_t size, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
|
||||
extern int
|
||||
swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
|
||||
|
|
@ -83,12 +82,13 @@ swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
|
|||
|
||||
extern int
|
||||
swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems,
|
||||
enum dma_data_direction dir, struct dma_attrs *attrs);
|
||||
enum dma_data_direction dir,
|
||||
unsigned long attrs);
|
||||
|
||||
extern void
|
||||
swiotlb_unmap_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
|
||||
int nelems, enum dma_data_direction dir,
|
||||
struct dma_attrs *attrs);
|
||||
unsigned long attrs);
|
||||
|
||||
extern void
|
||||
swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr,
|
||||
|
|
|
|||
|
|
@ -105,6 +105,30 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
|
|||
|
||||
#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
|
||||
|
||||
#ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
|
||||
static inline int arch_within_stack_frames(const void * const stack,
|
||||
const void * const stackend,
|
||||
const void *obj, unsigned long len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HARDENED_USERCOPY
|
||||
extern void __check_object_size(const void *ptr, unsigned long n,
|
||||
bool to_user);
|
||||
|
||||
static inline void check_object_size(const void *ptr, unsigned long n,
|
||||
bool to_user)
|
||||
{
|
||||
__check_object_size(ptr, n, to_user);
|
||||
}
|
||||
#else
|
||||
static inline void check_object_size(const void *ptr, unsigned long n,
|
||||
bool to_user)
|
||||
{ }
|
||||
#endif /* CONFIG_HARDENED_USERCOPY */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_THREAD_INFO_H */
|
||||
|
|
|
|||
|
|
@ -114,8 +114,8 @@ extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count);
|
|||
#ifndef user_access_begin
|
||||
#define user_access_begin() do { } while (0)
|
||||
#define user_access_end() do { } while (0)
|
||||
#define unsafe_get_user(x, ptr) __get_user(x, ptr)
|
||||
#define unsafe_put_user(x, ptr) __put_user(x, ptr)
|
||||
#define unsafe_get_user(x, ptr, err) do { if (unlikely(__get_user(x, ptr))) goto err; } while (0)
|
||||
#define unsafe_put_user(x, ptr, err) do { if (unlikely(__put_user(x, ptr))) goto err; } while (0)
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_UACCESS_H__ */
|
||||
|
|
|
|||
|
|
@ -149,6 +149,19 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,
|
|||
return __virtio_test_bit(vdev, fbit);
|
||||
}
|
||||
|
||||
/**
|
||||
* virtio_has_iommu_quirk - determine whether this device has the iommu quirk
|
||||
* @vdev: the device
|
||||
*/
|
||||
static inline bool virtio_has_iommu_quirk(const struct virtio_device *vdev)
|
||||
{
|
||||
/*
|
||||
* Note the reverse polarity of the quirk feature (compared to most
|
||||
* other features), this is for compatibility with legacy systems.
|
||||
*/
|
||||
return !virtio_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
||||
}
|
||||
|
||||
static inline
|
||||
struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
|
||||
vq_callback_t *c, const char *n)
|
||||
|
|
|
|||
154
include/linux/virtio_vsock.h
Normal file
154
include/linux/virtio_vsock.h
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
#ifndef _LINUX_VIRTIO_VSOCK_H
|
||||
#define _LINUX_VIRTIO_VSOCK_H
|
||||
|
||||
#include <uapi/linux/virtio_vsock.h>
|
||||
#include <linux/socket.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/af_vsock.h>
|
||||
|
||||
#define VIRTIO_VSOCK_DEFAULT_MIN_BUF_SIZE 128
|
||||
#define VIRTIO_VSOCK_DEFAULT_BUF_SIZE (1024 * 256)
|
||||
#define VIRTIO_VSOCK_DEFAULT_MAX_BUF_SIZE (1024 * 256)
|
||||
#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4)
|
||||
#define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL
|
||||
#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64)
|
||||
|
||||
enum {
|
||||
VSOCK_VQ_RX = 0, /* for host to guest data */
|
||||
VSOCK_VQ_TX = 1, /* for guest to host data */
|
||||
VSOCK_VQ_EVENT = 2,
|
||||
VSOCK_VQ_MAX = 3,
|
||||
};
|
||||
|
||||
/* Per-socket state (accessed via vsk->trans) */
|
||||
struct virtio_vsock_sock {
|
||||
struct vsock_sock *vsk;
|
||||
|
||||
/* Protected by lock_sock(sk_vsock(trans->vsk)) */
|
||||
u32 buf_size;
|
||||
u32 buf_size_min;
|
||||
u32 buf_size_max;
|
||||
|
||||
spinlock_t tx_lock;
|
||||
spinlock_t rx_lock;
|
||||
|
||||
/* Protected by tx_lock */
|
||||
u32 tx_cnt;
|
||||
u32 buf_alloc;
|
||||
u32 peer_fwd_cnt;
|
||||
u32 peer_buf_alloc;
|
||||
|
||||
/* Protected by rx_lock */
|
||||
u32 fwd_cnt;
|
||||
u32 rx_bytes;
|
||||
struct list_head rx_queue;
|
||||
};
|
||||
|
||||
struct virtio_vsock_pkt {
|
||||
struct virtio_vsock_hdr hdr;
|
||||
struct work_struct work;
|
||||
struct list_head list;
|
||||
void *buf;
|
||||
u32 len;
|
||||
u32 off;
|
||||
bool reply;
|
||||
};
|
||||
|
||||
struct virtio_vsock_pkt_info {
|
||||
u32 remote_cid, remote_port;
|
||||
struct msghdr *msg;
|
||||
u32 pkt_len;
|
||||
u16 type;
|
||||
u16 op;
|
||||
u32 flags;
|
||||
bool reply;
|
||||
};
|
||||
|
||||
struct virtio_transport {
|
||||
/* This must be the first field */
|
||||
struct vsock_transport transport;
|
||||
|
||||
/* Takes ownership of the packet */
|
||||
int (*send_pkt)(struct virtio_vsock_pkt *pkt);
|
||||
};
|
||||
|
||||
ssize_t
|
||||
virtio_transport_stream_dequeue(struct vsock_sock *vsk,
|
||||
struct msghdr *msg,
|
||||
size_t len,
|
||||
int type);
|
||||
int
|
||||
virtio_transport_dgram_dequeue(struct vsock_sock *vsk,
|
||||
struct msghdr *msg,
|
||||
size_t len, int flags);
|
||||
|
||||
s64 virtio_transport_stream_has_data(struct vsock_sock *vsk);
|
||||
s64 virtio_transport_stream_has_space(struct vsock_sock *vsk);
|
||||
|
||||
int virtio_transport_do_socket_init(struct vsock_sock *vsk,
|
||||
struct vsock_sock *psk);
|
||||
u64 virtio_transport_get_buffer_size(struct vsock_sock *vsk);
|
||||
u64 virtio_transport_get_min_buffer_size(struct vsock_sock *vsk);
|
||||
u64 virtio_transport_get_max_buffer_size(struct vsock_sock *vsk);
|
||||
void virtio_transport_set_buffer_size(struct vsock_sock *vsk, u64 val);
|
||||
void virtio_transport_set_min_buffer_size(struct vsock_sock *vsk, u64 val);
|
||||
void virtio_transport_set_max_buffer_size(struct vsock_sock *vs, u64 val);
|
||||
int
|
||||
virtio_transport_notify_poll_in(struct vsock_sock *vsk,
|
||||
size_t target,
|
||||
bool *data_ready_now);
|
||||
int
|
||||
virtio_transport_notify_poll_out(struct vsock_sock *vsk,
|
||||
size_t target,
|
||||
bool *space_available_now);
|
||||
|
||||
int virtio_transport_notify_recv_init(struct vsock_sock *vsk,
|
||||
size_t target, struct vsock_transport_recv_notify_data *data);
|
||||
int virtio_transport_notify_recv_pre_block(struct vsock_sock *vsk,
|
||||
size_t target, struct vsock_transport_recv_notify_data *data);
|
||||
int virtio_transport_notify_recv_pre_dequeue(struct vsock_sock *vsk,
|
||||
size_t target, struct vsock_transport_recv_notify_data *data);
|
||||
int virtio_transport_notify_recv_post_dequeue(struct vsock_sock *vsk,
|
||||
size_t target, ssize_t copied, bool data_read,
|
||||
struct vsock_transport_recv_notify_data *data);
|
||||
int virtio_transport_notify_send_init(struct vsock_sock *vsk,
|
||||
struct vsock_transport_send_notify_data *data);
|
||||
int virtio_transport_notify_send_pre_block(struct vsock_sock *vsk,
|
||||
struct vsock_transport_send_notify_data *data);
|
||||
int virtio_transport_notify_send_pre_enqueue(struct vsock_sock *vsk,
|
||||
struct vsock_transport_send_notify_data *data);
|
||||
int virtio_transport_notify_send_post_enqueue(struct vsock_sock *vsk,
|
||||
ssize_t written, struct vsock_transport_send_notify_data *data);
|
||||
|
||||
u64 virtio_transport_stream_rcvhiwat(struct vsock_sock *vsk);
|
||||
bool virtio_transport_stream_is_active(struct vsock_sock *vsk);
|
||||
bool virtio_transport_stream_allow(u32 cid, u32 port);
|
||||
int virtio_transport_dgram_bind(struct vsock_sock *vsk,
|
||||
struct sockaddr_vm *addr);
|
||||
bool virtio_transport_dgram_allow(u32 cid, u32 port);
|
||||
|
||||
int virtio_transport_connect(struct vsock_sock *vsk);
|
||||
|
||||
int virtio_transport_shutdown(struct vsock_sock *vsk, int mode);
|
||||
|
||||
void virtio_transport_release(struct vsock_sock *vsk);
|
||||
|
||||
ssize_t
|
||||
virtio_transport_stream_enqueue(struct vsock_sock *vsk,
|
||||
struct msghdr *msg,
|
||||
size_t len);
|
||||
int
|
||||
virtio_transport_dgram_enqueue(struct vsock_sock *vsk,
|
||||
struct sockaddr_vm *remote_addr,
|
||||
struct msghdr *msg,
|
||||
size_t len);
|
||||
|
||||
void virtio_transport_destruct(struct vsock_sock *vsk);
|
||||
|
||||
void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt);
|
||||
void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt);
|
||||
void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt);
|
||||
u32 virtio_transport_get_credit(struct virtio_vsock_sock *vvs, u32 wanted);
|
||||
void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit);
|
||||
|
||||
#endif /* _LINUX_VIRTIO_VSOCK_H */
|
||||
|
|
@ -173,14 +173,14 @@ static inline void ww_acquire_fini(struct ww_acquire_ctx *ctx)
|
|||
mutex_release(&ctx->dep_map, 0, _THIS_IP_);
|
||||
|
||||
DEBUG_LOCKS_WARN_ON(ctx->acquired);
|
||||
if (!config_enabled(CONFIG_PROVE_LOCKING))
|
||||
if (!IS_ENABLED(CONFIG_PROVE_LOCKING))
|
||||
/*
|
||||
* lockdep will normally handle this,
|
||||
* but fail without anyway
|
||||
*/
|
||||
ctx->done_acquire = 1;
|
||||
|
||||
if (!config_enabled(CONFIG_DEBUG_LOCK_ALLOC))
|
||||
if (!IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC))
|
||||
/* ensure ww_acquire_fini will still fail if called twice */
|
||||
ctx->acquired = ~0U;
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue