diff options
Diffstat (limited to 'include')
47 files changed, 466 insertions, 102 deletions
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index d7d50d7ee51e..aa00800adacc 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
| @@ -97,4 +97,8 @@ extern void setup_per_cpu_areas(void); | |||
| 97 | #define PER_CPU_ATTRIBUTES | 97 | #define PER_CPU_ATTRIBUTES |
| 98 | #endif | 98 | #endif |
| 99 | 99 | ||
| 100 | #ifndef PER_CPU_DEF_ATTRIBUTES | ||
| 101 | #define PER_CPU_DEF_ATTRIBUTES | ||
| 102 | #endif | ||
| 103 | |||
| 100 | #endif /* _ASM_GENERIC_PERCPU_H_ */ | 104 | #endif /* _ASM_GENERIC_PERCPU_H_ */ |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 92b73b6140ff..a553f1041cf1 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -191,7 +191,7 @@ | |||
| 191 | . = ALIGN(align); \ | 191 | . = ALIGN(align); \ |
| 192 | *(.data.cacheline_aligned) | 192 | *(.data.cacheline_aligned) |
| 193 | 193 | ||
| 194 | #define INIT_TASK(align) \ | 194 | #define INIT_TASK_DATA(align) \ |
| 195 | . = ALIGN(align); \ | 195 | . = ALIGN(align); \ |
| 196 | *(.data.init_task) | 196 | *(.data.init_task) |
| 197 | 197 | ||
| @@ -434,14 +434,15 @@ | |||
| 434 | /* | 434 | /* |
| 435 | * Init task | 435 | * Init task |
| 436 | */ | 436 | */ |
| 437 | #define INIT_TASK_DATA(align) \ | 437 | #define INIT_TASK_DATA_SECTION(align) \ |
| 438 | . = ALIGN(align); \ | 438 | . = ALIGN(align); \ |
| 439 | .data.init_task : { \ | 439 | .data.init_task : { \ |
| 440 | INIT_TASK \ | 440 | INIT_TASK_DATA(align) \ |
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | #ifdef CONFIG_CONSTRUCTORS | 443 | #ifdef CONFIG_CONSTRUCTORS |
| 444 | #define KERNEL_CTORS() VMLINUX_SYMBOL(__ctors_start) = .; \ | 444 | #define KERNEL_CTORS() . = ALIGN(8); \ |
| 445 | VMLINUX_SYMBOL(__ctors_start) = .; \ | ||
| 445 | *(.ctors) \ | 446 | *(.ctors) \ |
| 446 | VMLINUX_SYMBOL(__ctors_end) = .; | 447 | VMLINUX_SYMBOL(__ctors_end) = .; |
| 447 | #else | 448 | #else |
| @@ -704,15 +705,15 @@ | |||
| 704 | * matches the requirment of PAGE_ALIGNED_DATA. | 705 | * matches the requirment of PAGE_ALIGNED_DATA. |
| 705 | * | 706 | * |
| 706 | * use 0 as page_align if page_aligned data is not used */ | 707 | * use 0 as page_align if page_aligned data is not used */ |
| 707 | #define RW_DATA_SECTION(cacheline, nosave, pagealigned, inittask) \ | 708 | #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \ |
| 708 | . = ALIGN(PAGE_SIZE); \ | 709 | . = ALIGN(PAGE_SIZE); \ |
| 709 | .data : AT(ADDR(.data) - LOAD_OFFSET) { \ | 710 | .data : AT(ADDR(.data) - LOAD_OFFSET) { \ |
| 710 | INIT_TASK(inittask) \ | 711 | INIT_TASK_DATA(inittask) \ |
| 711 | CACHELINE_ALIGNED_DATA(cacheline) \ | 712 | CACHELINE_ALIGNED_DATA(cacheline) \ |
| 712 | READ_MOSTLY_DATA(cacheline) \ | 713 | READ_MOSTLY_DATA(cacheline) \ |
| 713 | DATA_DATA \ | 714 | DATA_DATA \ |
| 714 | CONSTRUCTORS \ | 715 | CONSTRUCTORS \ |
| 715 | NOSAVE_DATA(nosave) \ | 716 | NOSAVE_DATA \ |
| 716 | PAGE_ALIGNED_DATA(pagealigned) \ | 717 | PAGE_ALIGNED_DATA(pagealigned) \ |
| 717 | } | 718 | } |
| 718 | 719 | ||
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index c263e4d71754..7d6c9a2dfcbb 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h | |||
| @@ -35,11 +35,11 @@ struct est_timings { | |||
| 35 | } __attribute__((packed)); | 35 | } __attribute__((packed)); |
| 36 | 36 | ||
| 37 | /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ | 37 | /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ |
| 38 | #define EDID_TIMING_ASPECT_SHIFT 0 | 38 | #define EDID_TIMING_ASPECT_SHIFT 6 |
| 39 | #define EDID_TIMING_ASPECT_MASK (0x3 << EDID_TIMING_ASPECT_SHIFT) | 39 | #define EDID_TIMING_ASPECT_MASK (0x3 << EDID_TIMING_ASPECT_SHIFT) |
| 40 | 40 | ||
| 41 | /* need to add 60 */ | 41 | /* need to add 60 */ |
| 42 | #define EDID_TIMING_VFREQ_SHIFT 2 | 42 | #define EDID_TIMING_VFREQ_SHIFT 0 |
| 43 | #define EDID_TIMING_VFREQ_MASK (0x3f << EDID_TIMING_VFREQ_SHIFT) | 43 | #define EDID_TIMING_VFREQ_MASK (0x3f << EDID_TIMING_VFREQ_SHIFT) |
| 44 | 44 | ||
| 45 | struct std_timing { | 45 | struct std_timing { |
| @@ -47,11 +47,11 @@ struct std_timing { | |||
| 47 | u8 vfreq_aspect; | 47 | u8 vfreq_aspect; |
| 48 | } __attribute__((packed)); | 48 | } __attribute__((packed)); |
| 49 | 49 | ||
| 50 | #define DRM_EDID_PT_HSYNC_POSITIVE (1 << 6) | 50 | #define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1) |
| 51 | #define DRM_EDID_PT_VSYNC_POSITIVE (1 << 5) | 51 | #define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2) |
| 52 | #define DRM_EDID_PT_SEPARATE_SYNC (3 << 3) | 52 | #define DRM_EDID_PT_SEPARATE_SYNC (3 << 3) |
| 53 | #define DRM_EDID_PT_STEREO (1 << 2) | 53 | #define DRM_EDID_PT_STEREO (1 << 5) |
| 54 | #define DRM_EDID_PT_INTERLACED (1 << 1) | 54 | #define DRM_EDID_PT_INTERLACED (1 << 7) |
| 55 | 55 | ||
| 56 | /* If detailed data is pixel timing */ | 56 | /* If detailed data is pixel timing */ |
| 57 | struct detailed_pixel_timing { | 57 | struct detailed_pixel_timing { |
| @@ -93,7 +93,7 @@ struct detailed_data_monitor_range { | |||
| 93 | } __attribute__((packed)); | 93 | } __attribute__((packed)); |
| 94 | 94 | ||
| 95 | struct detailed_data_wpindex { | 95 | struct detailed_data_wpindex { |
| 96 | u8 white_xy_lo; /* Upper 2 bits each */ | 96 | u8 white_yx_lo; /* Lower 2 bits each */ |
| 97 | u8 white_x_hi; | 97 | u8 white_x_hi; |
| 98 | u8 white_y_hi; | 98 | u8 white_y_hi; |
| 99 | u8 gamma; /* need to divide by 100 then add 1 */ | 99 | u8 gamma; /* need to divide by 100 then add 1 */ |
| @@ -135,21 +135,21 @@ struct detailed_timing { | |||
| 135 | } data; | 135 | } data; |
| 136 | } __attribute__((packed)); | 136 | } __attribute__((packed)); |
| 137 | 137 | ||
| 138 | #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 7) | 138 | #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0) |
| 139 | #define DRM_EDID_INPUT_SYNC_ON_GREEN (1 << 5) | 139 | #define DRM_EDID_INPUT_SYNC_ON_GREEN (1 << 1) |
| 140 | #define DRM_EDID_INPUT_COMPOSITE_SYNC (1 << 4) | 140 | #define DRM_EDID_INPUT_COMPOSITE_SYNC (1 << 2) |
| 141 | #define DRM_EDID_INPUT_SEPARATE_SYNCS (1 << 3) | 141 | #define DRM_EDID_INPUT_SEPARATE_SYNCS (1 << 3) |
| 142 | #define DRM_EDID_INPUT_BLANK_TO_BLACK (1 << 2) | 142 | #define DRM_EDID_INPUT_BLANK_TO_BLACK (1 << 4) |
| 143 | #define DRM_EDID_INPUT_VIDEO_LEVEL (3 << 1) | 143 | #define DRM_EDID_INPUT_VIDEO_LEVEL (3 << 5) |
| 144 | #define DRM_EDID_INPUT_DIGITAL (1 << 0) /* bits above must be zero if set */ | 144 | #define DRM_EDID_INPUT_DIGITAL (1 << 7) /* bits below must be zero if set */ |
| 145 | 145 | ||
| 146 | #define DRM_EDID_FEATURE_DEFAULT_GTF (1 << 7) | 146 | #define DRM_EDID_FEATURE_DEFAULT_GTF (1 << 0) |
| 147 | #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 6) | 147 | #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1) |
| 148 | #define DRM_EDID_FEATURE_STANDARD_COLOR (1 << 5) | 148 | #define DRM_EDID_FEATURE_STANDARD_COLOR (1 << 2) |
| 149 | #define DRM_EDID_FEATURE_DISPLAY_TYPE (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ | 149 | #define DRM_EDID_FEATURE_DISPLAY_TYPE (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ |
| 150 | #define DRM_EDID_FEATURE_PM_ACTIVE_OFF (1 << 2) | 150 | #define DRM_EDID_FEATURE_PM_ACTIVE_OFF (1 << 5) |
| 151 | #define DRM_EDID_FEATURE_PM_SUSPEND (1 << 1) | 151 | #define DRM_EDID_FEATURE_PM_SUSPEND (1 << 6) |
| 152 | #define DRM_EDID_FEATURE_PM_STANDBY (1 << 0) | 152 | #define DRM_EDID_FEATURE_PM_STANDBY (1 << 7) |
| 153 | 153 | ||
| 154 | struct edid { | 154 | struct edid { |
| 155 | u8 header[8]; | 155 | u8 header[8]; |
diff --git a/include/linux/aio.h b/include/linux/aio.h index b16a957030f8..47f7d932a01d 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h | |||
| @@ -121,9 +121,9 @@ struct kiocb { | |||
| 121 | 121 | ||
| 122 | /* | 122 | /* |
| 123 | * If the aio_resfd field of the userspace iocb is not zero, | 123 | * If the aio_resfd field of the userspace iocb is not zero, |
| 124 | * this is the underlying file* to deliver event to. | 124 | * this is the underlying eventfd context to deliver events to. |
| 125 | */ | 125 | */ |
| 126 | struct file *ki_eventfd; | 126 | struct eventfd_ctx *ki_eventfd; |
| 127 | }; | 127 | }; |
| 128 | 128 | ||
| 129 | #define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY) | 129 | #define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY) |
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 0ec2c594868e..3a52a63c1351 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h | |||
| @@ -229,9 +229,9 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi) | |||
| 229 | (1 << BDI_async_congested)); | 229 | (1 << BDI_async_congested)); |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | void clear_bdi_congested(struct backing_dev_info *bdi, int rw); | 232 | void clear_bdi_congested(struct backing_dev_info *bdi, int sync); |
| 233 | void set_bdi_congested(struct backing_dev_info *bdi, int rw); | 233 | void set_bdi_congested(struct backing_dev_info *bdi, int sync); |
| 234 | long congestion_wait(int rw, long timeout); | 234 | long congestion_wait(int sync, long timeout); |
| 235 | 235 | ||
| 236 | 236 | ||
| 237 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) | 237 | static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi) |
diff --git a/include/linux/bio.h b/include/linux/bio.h index 2a04eb54c0dd..2892b710771c 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -319,7 +319,6 @@ static inline int bio_has_allocated_vec(struct bio *bio) | |||
| 319 | */ | 319 | */ |
| 320 | struct bio_integrity_payload { | 320 | struct bio_integrity_payload { |
| 321 | struct bio *bip_bio; /* parent bio */ | 321 | struct bio *bip_bio; /* parent bio */ |
| 322 | struct bio_vec *bip_vec; /* integrity data vector */ | ||
| 323 | 322 | ||
| 324 | sector_t bip_sector; /* virtual start sector */ | 323 | sector_t bip_sector; /* virtual start sector */ |
| 325 | 324 | ||
| @@ -328,11 +327,12 @@ struct bio_integrity_payload { | |||
| 328 | 327 | ||
| 329 | unsigned int bip_size; | 328 | unsigned int bip_size; |
| 330 | 329 | ||
| 331 | unsigned short bip_pool; /* pool the ivec came from */ | 330 | unsigned short bip_slab; /* slab the bip came from */ |
| 332 | unsigned short bip_vcnt; /* # of integrity bio_vecs */ | 331 | unsigned short bip_vcnt; /* # of integrity bio_vecs */ |
| 333 | unsigned short bip_idx; /* current bip_vec index */ | 332 | unsigned short bip_idx; /* current bip_vec index */ |
| 334 | 333 | ||
| 335 | struct work_struct bip_work; /* I/O completion */ | 334 | struct work_struct bip_work; /* I/O completion */ |
| 335 | struct bio_vec bip_vec[0]; /* embedded bvec array */ | ||
| 336 | }; | 336 | }; |
| 337 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 337 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
| 338 | 338 | ||
| @@ -430,6 +430,9 @@ struct bio_set { | |||
| 430 | unsigned int front_pad; | 430 | unsigned int front_pad; |
| 431 | 431 | ||
| 432 | mempool_t *bio_pool; | 432 | mempool_t *bio_pool; |
| 433 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | ||
| 434 | mempool_t *bio_integrity_pool; | ||
| 435 | #endif | ||
| 433 | mempool_t *bvec_pool; | 436 | mempool_t *bvec_pool; |
| 434 | }; | 437 | }; |
| 435 | 438 | ||
| @@ -634,8 +637,9 @@ static inline struct bio *bio_list_get(struct bio_list *bl) | |||
| 634 | 637 | ||
| 635 | #define bio_integrity(bio) (bio->bi_integrity != NULL) | 638 | #define bio_integrity(bio) (bio->bi_integrity != NULL) |
| 636 | 639 | ||
| 640 | extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); | ||
| 637 | extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int); | 641 | extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int); |
| 638 | extern void bio_integrity_free(struct bio *); | 642 | extern void bio_integrity_free(struct bio *, struct bio_set *); |
| 639 | extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int); | 643 | extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int); |
| 640 | extern int bio_integrity_enabled(struct bio *bio); | 644 | extern int bio_integrity_enabled(struct bio *bio); |
| 641 | extern int bio_integrity_set_tag(struct bio *, void *, unsigned int); | 645 | extern int bio_integrity_set_tag(struct bio *, void *, unsigned int); |
| @@ -645,21 +649,27 @@ extern void bio_integrity_endio(struct bio *, int); | |||
| 645 | extern void bio_integrity_advance(struct bio *, unsigned int); | 649 | extern void bio_integrity_advance(struct bio *, unsigned int); |
| 646 | extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int); | 650 | extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int); |
| 647 | extern void bio_integrity_split(struct bio *, struct bio_pair *, int); | 651 | extern void bio_integrity_split(struct bio *, struct bio_pair *, int); |
| 648 | extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t); | 652 | extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *); |
| 653 | extern int bioset_integrity_create(struct bio_set *, int); | ||
| 654 | extern void bioset_integrity_free(struct bio_set *); | ||
| 655 | extern void bio_integrity_init(void); | ||
| 649 | 656 | ||
| 650 | #else /* CONFIG_BLK_DEV_INTEGRITY */ | 657 | #else /* CONFIG_BLK_DEV_INTEGRITY */ |
| 651 | 658 | ||
| 652 | #define bio_integrity(a) (0) | 659 | #define bio_integrity(a) (0) |
| 660 | #define bioset_integrity_create(a, b) (0) | ||
| 653 | #define bio_integrity_prep(a) (0) | 661 | #define bio_integrity_prep(a) (0) |
| 654 | #define bio_integrity_enabled(a) (0) | 662 | #define bio_integrity_enabled(a) (0) |
| 655 | #define bio_integrity_clone(a, b, c) (0) | 663 | #define bio_integrity_clone(a, b, c, d) (0) |
| 656 | #define bio_integrity_free(a) do { } while (0) | 664 | #define bioset_integrity_free(a) do { } while (0) |
| 665 | #define bio_integrity_free(a, b) do { } while (0) | ||
| 657 | #define bio_integrity_endio(a, b) do { } while (0) | 666 | #define bio_integrity_endio(a, b) do { } while (0) |
| 658 | #define bio_integrity_advance(a, b) do { } while (0) | 667 | #define bio_integrity_advance(a, b) do { } while (0) |
| 659 | #define bio_integrity_trim(a, b, c) do { } while (0) | 668 | #define bio_integrity_trim(a, b, c) do { } while (0) |
| 660 | #define bio_integrity_split(a, b, c) do { } while (0) | 669 | #define bio_integrity_split(a, b, c) do { } while (0) |
| 661 | #define bio_integrity_set_tag(a, b, c) do { } while (0) | 670 | #define bio_integrity_set_tag(a, b, c) do { } while (0) |
| 662 | #define bio_integrity_get_tag(a, b, c) do { } while (0) | 671 | #define bio_integrity_get_tag(a, b, c) do { } while (0) |
| 672 | #define bio_integrity_init(a) do { } while (0) | ||
| 663 | 673 | ||
| 664 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 674 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
| 665 | 675 | ||
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 8963d9149b5f..0146e0fecf1a 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -301,12 +301,6 @@ struct blk_queue_tag { | |||
| 301 | #define BLK_SCSI_MAX_CMDS (256) | 301 | #define BLK_SCSI_MAX_CMDS (256) |
| 302 | #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) | 302 | #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) |
| 303 | 303 | ||
| 304 | struct blk_cmd_filter { | ||
| 305 | unsigned long read_ok[BLK_SCSI_CMD_PER_LONG]; | ||
| 306 | unsigned long write_ok[BLK_SCSI_CMD_PER_LONG]; | ||
| 307 | struct kobject kobj; | ||
| 308 | }; | ||
| 309 | |||
| 310 | struct queue_limits { | 304 | struct queue_limits { |
| 311 | unsigned long bounce_pfn; | 305 | unsigned long bounce_pfn; |
| 312 | unsigned long seg_boundary_mask; | 306 | unsigned long seg_boundary_mask; |
| @@ -445,7 +439,6 @@ struct request_queue | |||
| 445 | #if defined(CONFIG_BLK_DEV_BSG) | 439 | #if defined(CONFIG_BLK_DEV_BSG) |
| 446 | struct bsg_class_device bsg_dev; | 440 | struct bsg_class_device bsg_dev; |
| 447 | #endif | 441 | #endif |
| 448 | struct blk_cmd_filter cmd_filter; | ||
| 449 | }; | 442 | }; |
| 450 | 443 | ||
| 451 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ | 444 | #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ |
| @@ -730,6 +723,7 @@ struct rq_map_data { | |||
| 730 | int nr_entries; | 723 | int nr_entries; |
| 731 | unsigned long offset; | 724 | unsigned long offset; |
| 732 | int null_mapped; | 725 | int null_mapped; |
| 726 | int from_user; | ||
| 733 | }; | 727 | }; |
| 734 | 728 | ||
| 735 | struct req_iterator { | 729 | struct req_iterator { |
| @@ -786,18 +780,18 @@ extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, | |||
| 786 | * congested queues, and wake up anyone who was waiting for requests to be | 780 | * congested queues, and wake up anyone who was waiting for requests to be |
| 787 | * put back. | 781 | * put back. |
| 788 | */ | 782 | */ |
| 789 | static inline void blk_clear_queue_congested(struct request_queue *q, int rw) | 783 | static inline void blk_clear_queue_congested(struct request_queue *q, int sync) |
| 790 | { | 784 | { |
| 791 | clear_bdi_congested(&q->backing_dev_info, rw); | 785 | clear_bdi_congested(&q->backing_dev_info, sync); |
| 792 | } | 786 | } |
| 793 | 787 | ||
| 794 | /* | 788 | /* |
| 795 | * A queue has just entered congestion. Flag that in the queue's VM-visible | 789 | * A queue has just entered congestion. Flag that in the queue's VM-visible |
| 796 | * state flags and increment the global gounter of congested queues. | 790 | * state flags and increment the global gounter of congested queues. |
| 797 | */ | 791 | */ |
| 798 | static inline void blk_set_queue_congested(struct request_queue *q, int rw) | 792 | static inline void blk_set_queue_congested(struct request_queue *q, int sync) |
| 799 | { | 793 | { |
| 800 | set_bdi_congested(&q->backing_dev_info, rw); | 794 | set_bdi_congested(&q->backing_dev_info, sync); |
| 801 | } | 795 | } |
| 802 | 796 | ||
| 803 | extern void blk_start_queue(struct request_queue *q); | 797 | extern void blk_start_queue(struct request_queue *q); |
| @@ -998,13 +992,7 @@ static inline int sb_issue_discard(struct super_block *sb, | |||
| 998 | return blkdev_issue_discard(sb->s_bdev, block, nr_blocks, GFP_KERNEL); | 992 | return blkdev_issue_discard(sb->s_bdev, block, nr_blocks, GFP_KERNEL); |
| 999 | } | 993 | } |
| 1000 | 994 | ||
| 1001 | /* | 995 | extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); |
| 1002 | * command filter functions | ||
| 1003 | */ | ||
| 1004 | extern int blk_verify_command(struct blk_cmd_filter *filter, | ||
| 1005 | unsigned char *cmd, fmode_t has_write_perm); | ||
| 1006 | extern void blk_unregister_filter(struct gendisk *disk); | ||
| 1007 | extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); | ||
| 1008 | 996 | ||
| 1009 | #define MAX_PHYS_SEGMENTS 128 | 997 | #define MAX_PHYS_SEGMENTS 128 |
| 1010 | #define MAX_HW_SEGMENTS 128 | 998 | #define MAX_HW_SEGMENTS 128 |
diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index 7605c5e9589f..00d6a68d0421 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h | |||
| @@ -122,9 +122,10 @@ static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_r | |||
| 122 | 122 | ||
| 123 | static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) | 123 | static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) |
| 124 | { | 124 | { |
| 125 | #ifdef ELF_CORE_COPY_TASK_REGS | 125 | #if defined (ELF_CORE_COPY_TASK_REGS) |
| 126 | |||
| 127 | return ELF_CORE_COPY_TASK_REGS(t, elfregs); | 126 | return ELF_CORE_COPY_TASK_REGS(t, elfregs); |
| 127 | #elif defined (task_pt_regs) | ||
| 128 | elf_core_copy_regs(elfregs, task_pt_regs(t)); | ||
| 128 | #endif | 129 | #endif |
| 129 | return 0; | 130 | return 0; |
| 130 | } | 131 | } |
diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h index f45a8ae5f828..3b85ba6479f4 100644 --- a/include/linux/eventfd.h +++ b/include/linux/eventfd.h | |||
| @@ -8,10 +8,8 @@ | |||
| 8 | #ifndef _LINUX_EVENTFD_H | 8 | #ifndef _LINUX_EVENTFD_H |
| 9 | #define _LINUX_EVENTFD_H | 9 | #define _LINUX_EVENTFD_H |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_EVENTFD | ||
| 12 | |||
| 13 | /* For O_CLOEXEC and O_NONBLOCK */ | ||
| 14 | #include <linux/fcntl.h> | 11 | #include <linux/fcntl.h> |
| 12 | #include <linux/file.h> | ||
| 15 | 13 | ||
| 16 | /* | 14 | /* |
| 17 | * CAREFUL: Check include/asm-generic/fcntl.h when defining | 15 | * CAREFUL: Check include/asm-generic/fcntl.h when defining |
| @@ -27,16 +25,37 @@ | |||
| 27 | #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) | 25 | #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) |
| 28 | #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) | 26 | #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) |
| 29 | 27 | ||
| 28 | #ifdef CONFIG_EVENTFD | ||
| 29 | |||
| 30 | struct eventfd_ctx *eventfd_ctx_get(struct eventfd_ctx *ctx); | ||
| 31 | void eventfd_ctx_put(struct eventfd_ctx *ctx); | ||
| 30 | struct file *eventfd_fget(int fd); | 32 | struct file *eventfd_fget(int fd); |
| 31 | int eventfd_signal(struct file *file, int n); | 33 | struct eventfd_ctx *eventfd_ctx_fdget(int fd); |
| 34 | struct eventfd_ctx *eventfd_ctx_fileget(struct file *file); | ||
| 35 | int eventfd_signal(struct eventfd_ctx *ctx, int n); | ||
| 32 | 36 | ||
| 33 | #else /* CONFIG_EVENTFD */ | 37 | #else /* CONFIG_EVENTFD */ |
| 34 | 38 | ||
| 35 | #define eventfd_fget(fd) ERR_PTR(-ENOSYS) | 39 | /* |
| 36 | static inline int eventfd_signal(struct file *file, int n) | 40 | * Ugly ugly ugly error layer to support modules that uses eventfd but |
| 37 | { return 0; } | 41 | * pretend to work in !CONFIG_EVENTFD configurations. Namely, AIO. |
| 42 | */ | ||
| 43 | static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd) | ||
| 44 | { | ||
| 45 | return ERR_PTR(-ENOSYS); | ||
| 46 | } | ||
| 47 | |||
| 48 | static inline int eventfd_signal(struct eventfd_ctx *ctx, int n) | ||
| 49 | { | ||
| 50 | return -ENOSYS; | ||
| 51 | } | ||
| 52 | |||
| 53 | static inline void eventfd_ctx_put(struct eventfd_ctx *ctx) | ||
| 54 | { | ||
| 55 | |||
| 56 | } | ||
| 38 | 57 | ||
| 39 | #endif /* CONFIG_EVENTFD */ | 58 | #endif |
| 40 | 59 | ||
| 41 | #endif /* _LINUX_EVENTFD_H */ | 60 | #endif /* _LINUX_EVENTFD_H */ |
| 42 | 61 | ||
diff --git a/include/linux/fb.h b/include/linux/fb.h index dd68358996b7..f847df9e99b6 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
| @@ -819,6 +819,7 @@ struct fb_info { | |||
| 819 | int node; | 819 | int node; |
| 820 | int flags; | 820 | int flags; |
| 821 | struct mutex lock; /* Lock for open/release/ioctl funcs */ | 821 | struct mutex lock; /* Lock for open/release/ioctl funcs */ |
| 822 | struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */ | ||
| 822 | struct fb_var_screeninfo var; /* Current var */ | 823 | struct fb_var_screeninfo var; /* Current var */ |
| 823 | struct fb_fix_screeninfo fix; /* Current fix */ | 824 | struct fb_fix_screeninfo fix; /* Current fix */ |
| 824 | struct fb_monspecs monspecs; /* Current Monitor specs */ | 825 | struct fb_monspecs monspecs; /* Current Monitor specs */ |
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index 9823946adbc5..192d1e43c43c 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
| @@ -127,6 +127,7 @@ struct fw_card { | |||
| 127 | struct delayed_work work; | 127 | struct delayed_work work; |
| 128 | int bm_retries; | 128 | int bm_retries; |
| 129 | int bm_generation; | 129 | int bm_generation; |
| 130 | __be32 bm_transaction_data[2]; | ||
| 130 | 131 | ||
| 131 | bool broadcast_channel_allocated; | 132 | bool broadcast_channel_allocated; |
| 132 | u32 broadcast_channel; | 133 | u32 broadcast_channel; |
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 44848aa830dc..6c3de999fb34 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h | |||
| @@ -280,7 +280,7 @@ static inline void __fsnotify_update_dcache_flags(struct dentry *dentry) | |||
| 280 | assert_spin_locked(&dentry->d_lock); | 280 | assert_spin_locked(&dentry->d_lock); |
| 281 | 281 | ||
| 282 | parent = dentry->d_parent; | 282 | parent = dentry->d_parent; |
| 283 | if (fsnotify_inode_watches_children(parent->d_inode)) | 283 | if (parent->d_inode && fsnotify_inode_watches_children(parent->d_inode)) |
| 284 | dentry->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED; | 284 | dentry->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED; |
| 285 | else | 285 | else |
| 286 | dentry->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED; | 286 | dentry->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED; |
diff --git a/include/linux/fuse.h b/include/linux/fuse.h index d41ed593f79f..cf593bf9fd32 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h | |||
| @@ -25,6 +25,11 @@ | |||
| 25 | * - add IOCTL message | 25 | * - add IOCTL message |
| 26 | * - add unsolicited notification support | 26 | * - add unsolicited notification support |
| 27 | * - add POLL message and NOTIFY_POLL notification | 27 | * - add POLL message and NOTIFY_POLL notification |
| 28 | * | ||
| 29 | * 7.12 | ||
| 30 | * - add umask flag to input argument of open, mknod and mkdir | ||
| 31 | * - add notification messages for invalidation of inodes and | ||
| 32 | * directory entries | ||
| 28 | */ | 33 | */ |
| 29 | 34 | ||
| 30 | #ifndef _LINUX_FUSE_H | 35 | #ifndef _LINUX_FUSE_H |
| @@ -36,7 +41,7 @@ | |||
| 36 | #define FUSE_KERNEL_VERSION 7 | 41 | #define FUSE_KERNEL_VERSION 7 |
| 37 | 42 | ||
| 38 | /** Minor version number of this interface */ | 43 | /** Minor version number of this interface */ |
| 39 | #define FUSE_KERNEL_MINOR_VERSION 11 | 44 | #define FUSE_KERNEL_MINOR_VERSION 12 |
| 40 | 45 | ||
| 41 | /** The node ID of the root inode */ | 46 | /** The node ID of the root inode */ |
| 42 | #define FUSE_ROOT_ID 1 | 47 | #define FUSE_ROOT_ID 1 |
| @@ -112,6 +117,7 @@ struct fuse_file_lock { | |||
| 112 | * INIT request/reply flags | 117 | * INIT request/reply flags |
| 113 | * | 118 | * |
| 114 | * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." | 119 | * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".." |
| 120 | * FUSE_DONT_MASK: don't apply umask to file mode on create operations | ||
| 115 | */ | 121 | */ |
| 116 | #define FUSE_ASYNC_READ (1 << 0) | 122 | #define FUSE_ASYNC_READ (1 << 0) |
| 117 | #define FUSE_POSIX_LOCKS (1 << 1) | 123 | #define FUSE_POSIX_LOCKS (1 << 1) |
| @@ -119,6 +125,7 @@ struct fuse_file_lock { | |||
| 119 | #define FUSE_ATOMIC_O_TRUNC (1 << 3) | 125 | #define FUSE_ATOMIC_O_TRUNC (1 << 3) |
| 120 | #define FUSE_EXPORT_SUPPORT (1 << 4) | 126 | #define FUSE_EXPORT_SUPPORT (1 << 4) |
| 121 | #define FUSE_BIG_WRITES (1 << 5) | 127 | #define FUSE_BIG_WRITES (1 << 5) |
| 128 | #define FUSE_DONT_MASK (1 << 6) | ||
| 122 | 129 | ||
| 123 | /** | 130 | /** |
| 124 | * CUSE INIT request/reply flags | 131 | * CUSE INIT request/reply flags |
| @@ -224,6 +231,8 @@ enum fuse_opcode { | |||
| 224 | 231 | ||
| 225 | enum fuse_notify_code { | 232 | enum fuse_notify_code { |
| 226 | FUSE_NOTIFY_POLL = 1, | 233 | FUSE_NOTIFY_POLL = 1, |
| 234 | FUSE_NOTIFY_INVAL_INODE = 2, | ||
| 235 | FUSE_NOTIFY_INVAL_ENTRY = 3, | ||
| 227 | FUSE_NOTIFY_CODE_MAX, | 236 | FUSE_NOTIFY_CODE_MAX, |
| 228 | }; | 237 | }; |
| 229 | 238 | ||
| @@ -262,14 +271,18 @@ struct fuse_attr_out { | |||
| 262 | struct fuse_attr attr; | 271 | struct fuse_attr attr; |
| 263 | }; | 272 | }; |
| 264 | 273 | ||
| 274 | #define FUSE_COMPAT_MKNOD_IN_SIZE 8 | ||
| 275 | |||
| 265 | struct fuse_mknod_in { | 276 | struct fuse_mknod_in { |
| 266 | __u32 mode; | 277 | __u32 mode; |
| 267 | __u32 rdev; | 278 | __u32 rdev; |
| 279 | __u32 umask; | ||
| 280 | __u32 padding; | ||
| 268 | }; | 281 | }; |
| 269 | 282 | ||
| 270 | struct fuse_mkdir_in { | 283 | struct fuse_mkdir_in { |
| 271 | __u32 mode; | 284 | __u32 mode; |
| 272 | __u32 padding; | 285 | __u32 umask; |
| 273 | }; | 286 | }; |
| 274 | 287 | ||
| 275 | struct fuse_rename_in { | 288 | struct fuse_rename_in { |
| @@ -301,7 +314,14 @@ struct fuse_setattr_in { | |||
| 301 | 314 | ||
| 302 | struct fuse_open_in { | 315 | struct fuse_open_in { |
| 303 | __u32 flags; | 316 | __u32 flags; |
| 317 | __u32 unused; | ||
| 318 | }; | ||
| 319 | |||
| 320 | struct fuse_create_in { | ||
| 321 | __u32 flags; | ||
| 304 | __u32 mode; | 322 | __u32 mode; |
| 323 | __u32 umask; | ||
| 324 | __u32 padding; | ||
| 305 | }; | 325 | }; |
| 306 | 326 | ||
| 307 | struct fuse_open_out { | 327 | struct fuse_open_out { |
| @@ -508,4 +528,16 @@ struct fuse_dirent { | |||
| 508 | #define FUSE_DIRENT_SIZE(d) \ | 528 | #define FUSE_DIRENT_SIZE(d) \ |
| 509 | FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) | 529 | FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) |
| 510 | 530 | ||
| 531 | struct fuse_notify_inval_inode_out { | ||
| 532 | __u64 ino; | ||
| 533 | __s64 off; | ||
| 534 | __s64 len; | ||
| 535 | }; | ||
| 536 | |||
| 537 | struct fuse_notify_inval_entry_out { | ||
| 538 | __u64 parent; | ||
| 539 | __u32 namelen; | ||
| 540 | __u32 padding; | ||
| 541 | }; | ||
| 542 | |||
| 511 | #endif /* _LINUX_FUSE_H */ | 543 | #endif /* _LINUX_FUSE_H */ |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 7400900de94a..54648e625efd 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
| 22 | #include <linux/wait.h> | 22 | #include <linux/wait.h> |
| 23 | #include <linux/percpu.h> | 23 | #include <linux/percpu.h> |
| 24 | #include <linux/timer.h> | ||
| 24 | 25 | ||
| 25 | 26 | ||
| 26 | struct hrtimer_clock_base; | 27 | struct hrtimer_clock_base; |
| @@ -447,6 +448,8 @@ extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf, | |||
| 447 | 448 | ||
| 448 | static inline void timer_stats_account_hrtimer(struct hrtimer *timer) | 449 | static inline void timer_stats_account_hrtimer(struct hrtimer *timer) |
| 449 | { | 450 | { |
| 451 | if (likely(!timer->start_pid)) | ||
| 452 | return; | ||
| 450 | timer_stats_update_stats(timer, timer->start_pid, timer->start_site, | 453 | timer_stats_update_stats(timer, timer->start_pid, timer->start_site, |
| 451 | timer->function, timer->start_comm, 0); | 454 | timer->function, timer->start_comm, 0); |
| 452 | } | 455 | } |
| @@ -456,6 +459,8 @@ extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer, | |||
| 456 | 459 | ||
| 457 | static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer) | 460 | static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer) |
| 458 | { | 461 | { |
| 462 | if (likely(!timer_stats_active)) | ||
| 463 | return; | ||
| 459 | __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0)); | 464 | __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0)); |
| 460 | } | 465 | } |
| 461 | 466 | ||
diff --git a/include/linux/ide.h b/include/linux/ide.h index 95c6e00a72e8..edc93a6d931d 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1062,7 +1062,6 @@ int generic_ide_ioctl(ide_drive_t *, struct block_device *, unsigned, unsigned l | |||
| 1062 | extern int ide_vlb_clk; | 1062 | extern int ide_vlb_clk; |
| 1063 | extern int ide_pci_clk; | 1063 | extern int ide_pci_clk; |
| 1064 | 1064 | ||
| 1065 | unsigned int ide_rq_bytes(struct request *); | ||
| 1066 | int ide_end_rq(ide_drive_t *, struct request *, int, unsigned int); | 1065 | int ide_end_rq(ide_drive_t *, struct request *, int, unsigned int); |
| 1067 | void ide_kill_rq(ide_drive_t *, struct request *); | 1066 | void ide_kill_rq(ide_drive_t *, struct request *); |
| 1068 | 1067 | ||
| @@ -1361,7 +1360,6 @@ int ide_in_drive_list(u16 *, const struct drive_list_entry *); | |||
| 1361 | #ifdef CONFIG_BLK_DEV_IDEDMA | 1360 | #ifdef CONFIG_BLK_DEV_IDEDMA |
| 1362 | int ide_dma_good_drive(ide_drive_t *); | 1361 | int ide_dma_good_drive(ide_drive_t *); |
| 1363 | int __ide_dma_bad_drive(ide_drive_t *); | 1362 | int __ide_dma_bad_drive(ide_drive_t *); |
| 1364 | int ide_id_dma_bug(ide_drive_t *); | ||
| 1365 | 1363 | ||
| 1366 | u8 ide_find_dma_mode(ide_drive_t *, u8); | 1364 | u8 ide_find_dma_mode(ide_drive_t *, u8); |
| 1367 | 1365 | ||
| @@ -1402,7 +1400,6 @@ void ide_dma_lost_irq(ide_drive_t *); | |||
| 1402 | ide_startstop_t ide_dma_timeout_retry(ide_drive_t *, int); | 1400 | ide_startstop_t ide_dma_timeout_retry(ide_drive_t *, int); |
| 1403 | 1401 | ||
| 1404 | #else | 1402 | #else |
| 1405 | static inline int ide_id_dma_bug(ide_drive_t *drive) { return 0; } | ||
| 1406 | static inline u8 ide_find_dma_mode(ide_drive_t *drive, u8 speed) { return 0; } | 1403 | static inline u8 ide_find_dma_mode(ide_drive_t *drive, u8 speed) { return 0; } |
| 1407 | static inline u8 ide_max_dma_mode(ide_drive_t *drive) { return 0; } | 1404 | static inline u8 ide_max_dma_mode(ide_drive_t *drive) { return 0; } |
| 1408 | static inline void ide_dma_off_quietly(ide_drive_t *drive) { ; } | 1405 | static inline void ide_dma_off_quietly(ide_drive_t *drive) { ; } |
| @@ -1422,6 +1419,7 @@ static inline void ide_dma_unmap_sg(ide_drive_t *drive, | |||
| 1422 | 1419 | ||
| 1423 | #ifdef CONFIG_BLK_DEV_IDEACPI | 1420 | #ifdef CONFIG_BLK_DEV_IDEACPI |
| 1424 | int ide_acpi_init(void); | 1421 | int ide_acpi_init(void); |
| 1422 | bool ide_port_acpi(ide_hwif_t *hwif); | ||
| 1425 | extern int ide_acpi_exec_tfs(ide_drive_t *drive); | 1423 | extern int ide_acpi_exec_tfs(ide_drive_t *drive); |
| 1426 | extern void ide_acpi_get_timing(ide_hwif_t *hwif); | 1424 | extern void ide_acpi_get_timing(ide_hwif_t *hwif); |
| 1427 | extern void ide_acpi_push_timing(ide_hwif_t *hwif); | 1425 | extern void ide_acpi_push_timing(ide_hwif_t *hwif); |
| @@ -1430,6 +1428,7 @@ void ide_acpi_port_init_devices(ide_hwif_t *); | |||
| 1430 | extern void ide_acpi_set_state(ide_hwif_t *hwif, int on); | 1428 | extern void ide_acpi_set_state(ide_hwif_t *hwif, int on); |
| 1431 | #else | 1429 | #else |
| 1432 | static inline int ide_acpi_init(void) { return 0; } | 1430 | static inline int ide_acpi_init(void) { return 0; } |
| 1431 | static inline bool ide_port_acpi(ide_hwif_t *hwif) { return 0; } | ||
| 1433 | static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; } | 1432 | static inline int ide_acpi_exec_tfs(ide_drive_t *drive) { return 0; } |
| 1434 | static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; } | 1433 | static inline void ide_acpi_get_timing(ide_hwif_t *hwif) { ; } |
| 1435 | static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; } | 1434 | static inline void ide_acpi_push_timing(ide_hwif_t *hwif) { ; } |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index ae3a1871413d..70fdba2bbf71 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
| @@ -78,6 +78,7 @@ | |||
| 78 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ | 78 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ |
| 79 | #define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ | 79 | #define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ |
| 80 | #define ETH_P_TIPC 0x88CA /* TIPC */ | 80 | #define ETH_P_TIPC 0x88CA /* TIPC */ |
| 81 | #define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */ | ||
| 81 | #define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */ | 82 | #define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */ |
| 82 | #define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */ | 83 | #define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */ |
| 83 | #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ | 84 | #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ |
diff --git a/include/linux/ima.h b/include/linux/ima.h index b1b827d091a9..0e3f2a4c25f6 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h | |||
| @@ -24,6 +24,7 @@ extern int ima_path_check(struct path *path, int mask, int update_counts); | |||
| 24 | extern void ima_file_free(struct file *file); | 24 | extern void ima_file_free(struct file *file); |
| 25 | extern int ima_file_mmap(struct file *file, unsigned long prot); | 25 | extern int ima_file_mmap(struct file *file, unsigned long prot); |
| 26 | extern void ima_counts_get(struct file *file); | 26 | extern void ima_counts_get(struct file *file); |
| 27 | extern void ima_counts_put(struct path *path, int mask); | ||
| 27 | 28 | ||
| 28 | #else | 29 | #else |
| 29 | static inline int ima_bprm_check(struct linux_binprm *bprm) | 30 | static inline int ima_bprm_check(struct linux_binprm *bprm) |
| @@ -60,5 +61,10 @@ static inline void ima_counts_get(struct file *file) | |||
| 60 | { | 61 | { |
| 61 | return; | 62 | return; |
| 62 | } | 63 | } |
| 64 | |||
| 65 | static inline void ima_counts_put(struct path *path, int mask) | ||
| 66 | { | ||
| 67 | return; | ||
| 68 | } | ||
| 63 | #endif /* CONFIG_IMA_H */ | 69 | #endif /* CONFIG_IMA_H */ |
| 64 | #endif /* _LINUX_IMA_H */ | 70 | #endif /* _LINUX_IMA_H */ |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 5368fbdc7801..7fc01b13be43 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -183,5 +183,8 @@ extern struct cred init_cred; | |||
| 183 | LIST_HEAD_INIT(cpu_timers[2]), \ | 183 | LIST_HEAD_INIT(cpu_timers[2]), \ |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | /* Attach to the init_task data structure for proper alignment */ | ||
| 187 | #define __init_task_data __attribute__((__section__(".data.init_task"))) | ||
| 188 | |||
| 186 | 189 | ||
| 187 | #endif | 190 | #endif |
diff --git a/include/linux/input/matrix_keypad.h b/include/linux/input/matrix_keypad.h new file mode 100644 index 000000000000..7964516c6954 --- /dev/null +++ b/include/linux/input/matrix_keypad.h | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | #ifndef _MATRIX_KEYPAD_H | ||
| 2 | #define _MATRIX_KEYPAD_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | #include <linux/input.h> | ||
| 6 | |||
| 7 | #define MATRIX_MAX_ROWS 16 | ||
| 8 | #define MATRIX_MAX_COLS 16 | ||
| 9 | |||
| 10 | #define KEY(row, col, val) ((((row) & (MATRIX_MAX_ROWS - 1)) << 24) |\ | ||
| 11 | (((col) & (MATRIX_MAX_COLS - 1)) << 16) |\ | ||
| 12 | (val & 0xffff)) | ||
| 13 | |||
| 14 | #define KEY_ROW(k) (((k) >> 24) & 0xff) | ||
| 15 | #define KEY_COL(k) (((k) >> 16) & 0xff) | ||
| 16 | #define KEY_VAL(k) ((k) & 0xffff) | ||
| 17 | |||
| 18 | /** | ||
| 19 | * struct matrix_keymap_data - keymap for matrix keyboards | ||
| 20 | * @keymap: pointer to array of uint32 values encoded with KEY() macro | ||
| 21 | * representing keymap | ||
| 22 | * @keymap_size: number of entries (initialized) in this keymap | ||
| 23 | * @max_keymap_size: maximum size of keymap supported by the device | ||
| 24 | * | ||
| 25 | * This structure is supposed to be used by platform code to supply | ||
| 26 | * keymaps to drivers that implement matrix-like keypads/keyboards. | ||
| 27 | */ | ||
| 28 | struct matrix_keymap_data { | ||
| 29 | const uint32_t *keymap; | ||
| 30 | unsigned int keymap_size; | ||
| 31 | unsigned int max_keymap_size; | ||
| 32 | }; | ||
| 33 | |||
| 34 | /** | ||
| 35 | * struct matrix_keypad_platform_data - platform-dependent keypad data | ||
| 36 | * @keymap_data: pointer to &matrix_keymap_data | ||
| 37 | * @row_gpios: array of gpio numbers reporesenting rows | ||
| 38 | * @col_gpios: array of gpio numbers reporesenting colums | ||
| 39 | * @num_row_gpios: actual number of row gpios used by device | ||
| 40 | * @num_col_gpios: actual number of col gpios used by device | ||
| 41 | * @col_scan_delay_us: delay, measured in microseconds, that is | ||
| 42 | * needed before we can keypad after activating column gpio | ||
| 43 | * @debounce_ms: debounce interval in milliseconds | ||
| 44 | * | ||
| 45 | * This structure represents platform-specific data that use used by | ||
| 46 | * matrix_keypad driver to perform proper initialization. | ||
| 47 | */ | ||
| 48 | struct matrix_keypad_platform_data { | ||
| 49 | const struct matrix_keymap_data *keymap_data; | ||
| 50 | |||
| 51 | unsigned int row_gpios[MATRIX_MAX_ROWS]; | ||
| 52 | unsigned int col_gpios[MATRIX_MAX_COLS]; | ||
| 53 | unsigned int num_row_gpios; | ||
| 54 | unsigned int num_col_gpios; | ||
| 55 | |||
| 56 | unsigned int col_scan_delay_us; | ||
| 57 | |||
| 58 | /* key debounce interval in milli-second */ | ||
| 59 | unsigned int debounce_ms; | ||
| 60 | |||
| 61 | bool active_low; | ||
| 62 | bool wakeup; | ||
| 63 | }; | ||
| 64 | |||
| 65 | #endif /* _MATRIX_KEYPAD_H */ | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index fac104e7186a..d6320a3e8def 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -303,6 +303,7 @@ extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in | |||
| 303 | extern int panic_timeout; | 303 | extern int panic_timeout; |
| 304 | extern int panic_on_oops; | 304 | extern int panic_on_oops; |
| 305 | extern int panic_on_unrecovered_nmi; | 305 | extern int panic_on_unrecovered_nmi; |
| 306 | extern int panic_on_io_nmi; | ||
| 306 | extern const char *print_tainted(void); | 307 | extern const char *print_tainted(void); |
| 307 | extern void add_taint(unsigned flag); | 308 | extern void add_taint(unsigned flag); |
| 308 | extern int test_taint(unsigned flag); | 309 | extern int test_taint(unsigned flag); |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index aacc5449f586..16713dc672e4 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -125,6 +125,7 @@ struct kvm_kernel_irq_routing_entry { | |||
| 125 | struct kvm { | 125 | struct kvm { |
| 126 | struct mutex lock; /* protects the vcpus array and APIC accesses */ | 126 | struct mutex lock; /* protects the vcpus array and APIC accesses */ |
| 127 | spinlock_t mmu_lock; | 127 | spinlock_t mmu_lock; |
| 128 | spinlock_t requests_lock; | ||
| 128 | struct rw_semaphore slots_lock; | 129 | struct rw_semaphore slots_lock; |
| 129 | struct mm_struct *mm; /* userspace tied to this vm */ | 130 | struct mm_struct *mm; /* userspace tied to this vm */ |
| 130 | int nmemslots; | 131 | int nmemslots; |
diff --git a/include/linux/leds-lp3944.h b/include/linux/leds-lp3944.h new file mode 100644 index 000000000000..afc9f9fd70f5 --- /dev/null +++ b/include/linux/leds-lp3944.h | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | /* | ||
| 2 | * leds-lp3944.h - platform data structure for lp3944 led controller | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 Antonio Ospite <ospite@studenti.unina.it> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __LINUX_LEDS_LP3944_H | ||
| 13 | #define __LINUX_LEDS_LP3944_H | ||
| 14 | |||
| 15 | #include <linux/leds.h> | ||
| 16 | #include <linux/workqueue.h> | ||
| 17 | |||
| 18 | #define LP3944_LED0 0 | ||
| 19 | #define LP3944_LED1 1 | ||
| 20 | #define LP3944_LED2 2 | ||
| 21 | #define LP3944_LED3 3 | ||
| 22 | #define LP3944_LED4 4 | ||
| 23 | #define LP3944_LED5 5 | ||
| 24 | #define LP3944_LED6 6 | ||
| 25 | #define LP3944_LED7 7 | ||
| 26 | #define LP3944_LEDS_MAX 8 | ||
| 27 | |||
| 28 | #define LP3944_LED_STATUS_MASK 0x03 | ||
| 29 | enum lp3944_status { | ||
| 30 | LP3944_LED_STATUS_OFF = 0x0, | ||
| 31 | LP3944_LED_STATUS_ON = 0x1, | ||
| 32 | LP3944_LED_STATUS_DIM0 = 0x2, | ||
| 33 | LP3944_LED_STATUS_DIM1 = 0x3 | ||
| 34 | }; | ||
| 35 | |||
| 36 | enum lp3944_type { | ||
| 37 | LP3944_LED_TYPE_NONE, | ||
| 38 | LP3944_LED_TYPE_LED, | ||
| 39 | LP3944_LED_TYPE_LED_INVERTED, | ||
| 40 | }; | ||
| 41 | |||
| 42 | struct lp3944_led { | ||
| 43 | char *name; | ||
| 44 | enum lp3944_type type; | ||
| 45 | enum lp3944_status status; | ||
| 46 | }; | ||
| 47 | |||
| 48 | struct lp3944_platform_data { | ||
| 49 | struct lp3944_led leds[LP3944_LEDS_MAX]; | ||
| 50 | u8 leds_size; | ||
| 51 | }; | ||
| 52 | |||
| 53 | #endif /* __LINUX_LEDS_LP3944_H */ | ||
diff --git a/include/linux/leds.h b/include/linux/leds.h index 376fe07732ea..d8bf9665e70c 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
| @@ -45,7 +45,10 @@ struct led_classdev { | |||
| 45 | /* Get LED brightness level */ | 45 | /* Get LED brightness level */ |
| 46 | enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); | 46 | enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); |
| 47 | 47 | ||
| 48 | /* Activate hardware accelerated blink */ | 48 | /* Activate hardware accelerated blink, delays are in |
| 49 | * miliseconds and if none is provided then a sensible default | ||
| 50 | * should be chosen. The call can adjust the timings if it can't | ||
| 51 | * match the values specified exactly. */ | ||
| 49 | int (*blink_set)(struct led_classdev *led_cdev, | 52 | int (*blink_set)(struct led_classdev *led_cdev, |
| 50 | unsigned long *delay_on, | 53 | unsigned long *delay_on, |
| 51 | unsigned long *delay_off); | 54 | unsigned long *delay_off); |
| @@ -141,9 +144,14 @@ struct gpio_led { | |||
| 141 | const char *name; | 144 | const char *name; |
| 142 | const char *default_trigger; | 145 | const char *default_trigger; |
| 143 | unsigned gpio; | 146 | unsigned gpio; |
| 144 | u8 active_low : 1; | 147 | unsigned active_low : 1; |
| 145 | u8 retain_state_suspended : 1; | 148 | unsigned retain_state_suspended : 1; |
| 149 | unsigned default_state : 2; | ||
| 150 | /* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */ | ||
| 146 | }; | 151 | }; |
| 152 | #define LEDS_GPIO_DEFSTATE_OFF 0 | ||
| 153 | #define LEDS_GPIO_DEFSTATE_ON 1 | ||
| 154 | #define LEDS_GPIO_DEFSTATE_KEEP 2 | ||
| 147 | 155 | ||
| 148 | struct gpio_led_platform_data { | 156 | struct gpio_led_platform_data { |
| 149 | int num_leds; | 157 | int num_leds; |
diff --git a/include/linux/linkage.h b/include/linux/linkage.h index fee9e59649c1..691f59171c6c 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h | |||
| @@ -22,6 +22,15 @@ | |||
| 22 | #define __page_aligned_bss __section(.bss.page_aligned) __aligned(PAGE_SIZE) | 22 | #define __page_aligned_bss __section(.bss.page_aligned) __aligned(PAGE_SIZE) |
| 23 | 23 | ||
| 24 | /* | 24 | /* |
| 25 | * For assembly routines. | ||
| 26 | * | ||
| 27 | * Note when using these that you must specify the appropriate | ||
| 28 | * alignment directives yourself | ||
| 29 | */ | ||
| 30 | #define __PAGE_ALIGNED_DATA .section ".data.page_aligned", "aw" | ||
| 31 | #define __PAGE_ALIGNED_BSS .section ".bss.page_aligned", "aw" | ||
| 32 | |||
| 33 | /* | ||
| 25 | * This is used by architectures to keep arguments on the stack | 34 | * This is used by architectures to keep arguments on the stack |
| 26 | * untouched by the compiler by keeping them live until the end. | 35 | * untouched by the compiler by keeping them live until the end. |
| 27 | * The argument stack may be owned by the assembly-language | 36 | * The argument stack may be owned by the assembly-language |
diff --git a/include/linux/mm.h b/include/linux/mm.h index d006e93d5c93..ba3a7cb1eaa0 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -826,7 +826,7 @@ extern int make_pages_present(unsigned long addr, unsigned long end); | |||
| 826 | extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); | 826 | extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); |
| 827 | 827 | ||
| 828 | int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | 828 | int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, |
| 829 | unsigned long start, int len, int write, int force, | 829 | unsigned long start, int nr_pages, int write, int force, |
| 830 | struct page **pages, struct vm_area_struct **vmas); | 830 | struct page **pages, struct vm_area_struct **vmas); |
| 831 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 831 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
| 832 | struct page **pages); | 832 | struct page **pages); |
diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h index 3beb2592b03f..d74785c2393a 100644 --- a/include/linux/mnt_namespace.h +++ b/include/linux/mnt_namespace.h | |||
| @@ -2,10 +2,9 @@ | |||
| 2 | #define _NAMESPACE_H_ | 2 | #define _NAMESPACE_H_ |
| 3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
| 4 | 4 | ||
| 5 | #include <linux/mount.h> | 5 | #include <linux/path.h> |
| 6 | #include <linux/sched.h> | ||
| 7 | #include <linux/nsproxy.h> | ||
| 8 | #include <linux/seq_file.h> | 6 | #include <linux/seq_file.h> |
| 7 | #include <linux/wait.h> | ||
| 9 | 8 | ||
| 10 | struct mnt_namespace { | 9 | struct mnt_namespace { |
| 11 | atomic_t count; | 10 | atomic_t count; |
| @@ -28,14 +27,6 @@ extern struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt); | |||
| 28 | extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, | 27 | extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, |
| 29 | struct fs_struct *); | 28 | struct fs_struct *); |
| 30 | extern void put_mnt_ns(struct mnt_namespace *ns); | 29 | extern void put_mnt_ns(struct mnt_namespace *ns); |
| 31 | |||
| 32 | static inline void exit_mnt_ns(struct task_struct *p) | ||
| 33 | { | ||
| 34 | struct mnt_namespace *ns = p->nsproxy->mnt_ns; | ||
| 35 | if (ns) | ||
| 36 | put_mnt_ns(ns); | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline void get_mnt_ns(struct mnt_namespace *ns) | 30 | static inline void get_mnt_ns(struct mnt_namespace *ns) |
| 40 | { | 31 | { |
| 41 | atomic_inc(&ns->count); | 32 | atomic_inc(&ns->count); |
diff --git a/include/linux/netfilter/xt_conntrack.h b/include/linux/netfilter/xt_conntrack.h index 3430c7751948..7ae05338e94c 100644 --- a/include/linux/netfilter/xt_conntrack.h +++ b/include/linux/netfilter/xt_conntrack.h | |||
| @@ -81,4 +81,17 @@ struct xt_conntrack_mtinfo1 { | |||
| 81 | __u8 state_mask, status_mask; | 81 | __u8 state_mask, status_mask; |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | struct xt_conntrack_mtinfo2 { | ||
| 85 | union nf_inet_addr origsrc_addr, origsrc_mask; | ||
| 86 | union nf_inet_addr origdst_addr, origdst_mask; | ||
| 87 | union nf_inet_addr replsrc_addr, replsrc_mask; | ||
| 88 | union nf_inet_addr repldst_addr, repldst_mask; | ||
| 89 | __u32 expires_min, expires_max; | ||
| 90 | __u16 l4proto; | ||
| 91 | __be16 origsrc_port, origdst_port; | ||
| 92 | __be16 replsrc_port, repldst_port; | ||
| 93 | __u16 match_flags, invert_flags; | ||
| 94 | __u16 state_mask, status_mask; | ||
| 95 | }; | ||
| 96 | |||
| 84 | #endif /*_XT_CONNTRACK_H*/ | 97 | #endif /*_XT_CONNTRACK_H*/ |
diff --git a/include/linux/netfilter/xt_osf.h b/include/linux/netfilter/xt_osf.h index fd2272e0959a..18afa495f973 100644 --- a/include/linux/netfilter/xt_osf.h +++ b/include/linux/netfilter/xt_osf.h | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #ifndef _XT_OSF_H | 20 | #ifndef _XT_OSF_H |
| 21 | #define _XT_OSF_H | 21 | #define _XT_OSF_H |
| 22 | 22 | ||
| 23 | #include <linux/types.h> | ||
| 24 | |||
| 23 | #define MAXGENRELEN 32 | 25 | #define MAXGENRELEN 32 |
| 24 | 26 | ||
| 25 | #define XT_OSF_GENRE (1<<0) | 27 | #define XT_OSF_GENRE (1<<0) |
diff --git a/include/linux/pci.h b/include/linux/pci.h index d304ddf412d0..115fb7ba5089 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -1145,7 +1145,7 @@ static inline void pci_set_drvdata(struct pci_dev *pdev, void *data) | |||
| 1145 | /* If you want to know what to call your pci_dev, ask this function. | 1145 | /* If you want to know what to call your pci_dev, ask this function. |
| 1146 | * Again, it's a wrapper around the generic device. | 1146 | * Again, it's a wrapper around the generic device. |
| 1147 | */ | 1147 | */ |
| 1148 | static inline const char *pci_name(struct pci_dev *pdev) | 1148 | static inline const char *pci_name(const struct pci_dev *pdev) |
| 1149 | { | 1149 | { |
| 1150 | return dev_name(&pdev->dev); | 1150 | return dev_name(&pdev->dev); |
| 1151 | } | 1151 | } |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index a3b000365795..73b46b6b904f 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2645,6 +2645,7 @@ | |||
| 2645 | #define PCI_DEVICE_ID_NETMOS_9835 0x9835 | 2645 | #define PCI_DEVICE_ID_NETMOS_9835 0x9835 |
| 2646 | #define PCI_DEVICE_ID_NETMOS_9845 0x9845 | 2646 | #define PCI_DEVICE_ID_NETMOS_9845 0x9845 |
| 2647 | #define PCI_DEVICE_ID_NETMOS_9855 0x9855 | 2647 | #define PCI_DEVICE_ID_NETMOS_9855 0x9855 |
| 2648 | #define PCI_DEVICE_ID_NETMOS_9901 0x9901 | ||
| 2648 | 2649 | ||
| 2649 | #define PCI_VENDOR_ID_3COM_2 0xa727 | 2650 | #define PCI_VENDOR_ID_3COM_2 0xa727 |
| 2650 | 2651 | ||
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index 8f921d74f49f..68438e18fff4 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h | |||
| @@ -24,7 +24,8 @@ | |||
| 24 | 24 | ||
| 25 | #define DEFINE_PER_CPU_SECTION(type, name, section) \ | 25 | #define DEFINE_PER_CPU_SECTION(type, name, section) \ |
| 26 | __attribute__((__section__(PER_CPU_BASE_SECTION section))) \ | 26 | __attribute__((__section__(PER_CPU_BASE_SECTION section))) \ |
| 27 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | 27 | PER_CPU_ATTRIBUTES PER_CPU_DEF_ATTRIBUTES \ |
| 28 | __typeof__(type) per_cpu__##name | ||
| 28 | 29 | ||
| 29 | /* | 30 | /* |
| 30 | * Variant on the per-CPU variable declaration/definition theme used for | 31 | * Variant on the per-CPU variable declaration/definition theme used for |
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h index 89698d8aba5c..5e970c7d3fd5 100644 --- a/include/linux/perf_counter.h +++ b/include/linux/perf_counter.h | |||
| @@ -178,8 +178,10 @@ struct perf_counter_attr { | |||
| 178 | mmap : 1, /* include mmap data */ | 178 | mmap : 1, /* include mmap data */ |
| 179 | comm : 1, /* include comm data */ | 179 | comm : 1, /* include comm data */ |
| 180 | freq : 1, /* use freq, not period */ | 180 | freq : 1, /* use freq, not period */ |
| 181 | inherit_stat : 1, /* per task counts */ | ||
| 182 | enable_on_exec : 1, /* next exec enables */ | ||
| 181 | 183 | ||
| 182 | __reserved_1 : 53; | 184 | __reserved_1 : 51; |
| 183 | 185 | ||
| 184 | __u32 wakeup_events; /* wakeup every n events */ | 186 | __u32 wakeup_events; /* wakeup every n events */ |
| 185 | __u32 __reserved_2; | 187 | __u32 __reserved_2; |
| @@ -232,6 +234,14 @@ struct perf_counter_mmap_page { | |||
| 232 | __u32 lock; /* seqlock for synchronization */ | 234 | __u32 lock; /* seqlock for synchronization */ |
| 233 | __u32 index; /* hardware counter identifier */ | 235 | __u32 index; /* hardware counter identifier */ |
| 234 | __s64 offset; /* add to hardware counter value */ | 236 | __s64 offset; /* add to hardware counter value */ |
| 237 | __u64 time_enabled; /* time counter active */ | ||
| 238 | __u64 time_running; /* time counter on cpu */ | ||
| 239 | |||
| 240 | /* | ||
| 241 | * Hole for extension of the self monitor capabilities | ||
| 242 | */ | ||
| 243 | |||
| 244 | __u64 __reserved[123]; /* align to 1k */ | ||
| 235 | 245 | ||
| 236 | /* | 246 | /* |
| 237 | * Control data for the mmap() data buffer. | 247 | * Control data for the mmap() data buffer. |
| @@ -253,7 +263,6 @@ struct perf_counter_mmap_page { | |||
| 253 | #define PERF_EVENT_MISC_KERNEL (1 << 0) | 263 | #define PERF_EVENT_MISC_KERNEL (1 << 0) |
| 254 | #define PERF_EVENT_MISC_USER (2 << 0) | 264 | #define PERF_EVENT_MISC_USER (2 << 0) |
| 255 | #define PERF_EVENT_MISC_HYPERVISOR (3 << 0) | 265 | #define PERF_EVENT_MISC_HYPERVISOR (3 << 0) |
| 256 | #define PERF_EVENT_MISC_OVERFLOW (1 << 2) | ||
| 257 | 266 | ||
| 258 | struct perf_event_header { | 267 | struct perf_event_header { |
| 259 | __u32 type; | 268 | __u32 type; |
| @@ -327,9 +336,18 @@ enum perf_event_type { | |||
| 327 | PERF_EVENT_FORK = 7, | 336 | PERF_EVENT_FORK = 7, |
| 328 | 337 | ||
| 329 | /* | 338 | /* |
| 330 | * When header.misc & PERF_EVENT_MISC_OVERFLOW the event_type field | 339 | * struct { |
| 331 | * will be PERF_SAMPLE_* | 340 | * struct perf_event_header header; |
| 332 | * | 341 | * u32 pid, tid; |
| 342 | * u64 value; | ||
| 343 | * { u64 time_enabled; } && PERF_FORMAT_ENABLED | ||
| 344 | * { u64 time_running; } && PERF_FORMAT_RUNNING | ||
| 345 | * { u64 parent_id; } && PERF_FORMAT_ID | ||
| 346 | * }; | ||
| 347 | */ | ||
| 348 | PERF_EVENT_READ = 8, | ||
| 349 | |||
| 350 | /* | ||
| 333 | * struct { | 351 | * struct { |
| 334 | * struct perf_event_header header; | 352 | * struct perf_event_header header; |
| 335 | * | 353 | * |
| @@ -337,8 +355,9 @@ enum perf_event_type { | |||
| 337 | * { u32 pid, tid; } && PERF_SAMPLE_TID | 355 | * { u32 pid, tid; } && PERF_SAMPLE_TID |
| 338 | * { u64 time; } && PERF_SAMPLE_TIME | 356 | * { u64 time; } && PERF_SAMPLE_TIME |
| 339 | * { u64 addr; } && PERF_SAMPLE_ADDR | 357 | * { u64 addr; } && PERF_SAMPLE_ADDR |
| 340 | * { u64 config; } && PERF_SAMPLE_CONFIG | 358 | * { u64 id; } && PERF_SAMPLE_ID |
| 341 | * { u32 cpu, res; } && PERF_SAMPLE_CPU | 359 | * { u32 cpu, res; } && PERF_SAMPLE_CPU |
| 360 | * { u64 period; } && PERF_SAMPLE_PERIOD | ||
| 342 | * | 361 | * |
| 343 | * { u64 nr; | 362 | * { u64 nr; |
| 344 | * { u64 id, val; } cnt[nr]; } && PERF_SAMPLE_GROUP | 363 | * { u64 id, val; } cnt[nr]; } && PERF_SAMPLE_GROUP |
| @@ -347,6 +366,9 @@ enum perf_event_type { | |||
| 347 | * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN | 366 | * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN |
| 348 | * }; | 367 | * }; |
| 349 | */ | 368 | */ |
| 369 | PERF_EVENT_SAMPLE = 9, | ||
| 370 | |||
| 371 | PERF_EVENT_MAX, /* non-ABI */ | ||
| 350 | }; | 372 | }; |
| 351 | 373 | ||
| 352 | enum perf_callchain_context { | 374 | enum perf_callchain_context { |
| @@ -582,6 +604,7 @@ struct perf_counter_context { | |||
| 582 | int nr_counters; | 604 | int nr_counters; |
| 583 | int nr_active; | 605 | int nr_active; |
| 584 | int is_active; | 606 | int is_active; |
| 607 | int nr_stat; | ||
| 585 | atomic_t refcount; | 608 | atomic_t refcount; |
| 586 | struct task_struct *task; | 609 | struct task_struct *task; |
| 587 | 610 | ||
| @@ -669,7 +692,16 @@ static inline int is_software_counter(struct perf_counter *counter) | |||
| 669 | (counter->attr.type != PERF_TYPE_HW_CACHE); | 692 | (counter->attr.type != PERF_TYPE_HW_CACHE); |
| 670 | } | 693 | } |
| 671 | 694 | ||
| 672 | extern void perf_swcounter_event(u32, u64, int, struct pt_regs *, u64); | 695 | extern atomic_t perf_swcounter_enabled[PERF_COUNT_SW_MAX]; |
| 696 | |||
| 697 | extern void __perf_swcounter_event(u32, u64, int, struct pt_regs *, u64); | ||
| 698 | |||
| 699 | static inline void | ||
| 700 | perf_swcounter_event(u32 event, u64 nr, int nmi, struct pt_regs *regs, u64 addr) | ||
| 701 | { | ||
| 702 | if (atomic_read(&perf_swcounter_enabled[event])) | ||
| 703 | __perf_swcounter_event(event, nr, nmi, regs, addr); | ||
| 704 | } | ||
| 673 | 705 | ||
| 674 | extern void __perf_counter_mmap(struct vm_area_struct *vma); | 706 | extern void __perf_counter_mmap(struct vm_area_struct *vma); |
| 675 | 707 | ||
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index e73e2429a1b1..2ce29831feb6 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
| @@ -99,7 +99,6 @@ enum rfkill_user_states { | |||
| 99 | #undef RFKILL_STATE_UNBLOCKED | 99 | #undef RFKILL_STATE_UNBLOCKED |
| 100 | #undef RFKILL_STATE_HARD_BLOCKED | 100 | #undef RFKILL_STATE_HARD_BLOCKED |
| 101 | 101 | ||
| 102 | #include <linux/types.h> | ||
| 103 | #include <linux/kernel.h> | 102 | #include <linux/kernel.h> |
| 104 | #include <linux/list.h> | 103 | #include <linux/list.h> |
| 105 | #include <linux/mutex.h> | 104 | #include <linux/mutex.h> |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4d0754269884..16a982e389fb 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -349,8 +349,20 @@ extern int mutex_spin_on_owner(struct mutex *lock, struct thread_info *owner); | |||
| 349 | struct nsproxy; | 349 | struct nsproxy; |
| 350 | struct user_namespace; | 350 | struct user_namespace; |
| 351 | 351 | ||
| 352 | /* Maximum number of active map areas.. This is a random (large) number */ | 352 | /* |
| 353 | #define DEFAULT_MAX_MAP_COUNT 65536 | 353 | * Default maximum number of active map areas, this limits the number of vmas |
| 354 | * per mm struct. Users can overwrite this number by sysctl but there is a | ||
| 355 | * problem. | ||
| 356 | * | ||
| 357 | * When a program's coredump is generated as ELF format, a section is created | ||
| 358 | * per a vma. In ELF, the number of sections is represented in unsigned short. | ||
| 359 | * This means the number of sections should be smaller than 65535 at coredump. | ||
| 360 | * Because the kernel adds some informative sections to a image of program at | ||
| 361 | * generating coredump, we need some margin. The number of extra sections is | ||
| 362 | * 1-3 now and depends on arch. We use "5" as safe margin, here. | ||
| 363 | */ | ||
| 364 | #define MAPCOUNT_ELF_CORE_MARGIN (5) | ||
| 365 | #define DEFAULT_MAX_MAP_COUNT (USHORT_MAX - MAPCOUNT_ELF_CORE_MARGIN) | ||
| 354 | 366 | ||
| 355 | extern int sysctl_max_map_count; | 367 | extern int sysctl_max_map_count; |
| 356 | 368 | ||
| @@ -486,6 +498,15 @@ struct task_cputime { | |||
| 486 | .sum_exec_runtime = 0, \ | 498 | .sum_exec_runtime = 0, \ |
| 487 | } | 499 | } |
| 488 | 500 | ||
| 501 | /* | ||
| 502 | * Disable preemption until the scheduler is running. | ||
| 503 | * Reset by start_kernel()->sched_init()->init_idle(). | ||
| 504 | * | ||
| 505 | * We include PREEMPT_ACTIVE to avoid cond_resched() from working | ||
| 506 | * before the scheduler is active -- see should_resched(). | ||
| 507 | */ | ||
| 508 | #define INIT_PREEMPT_COUNT (1 + PREEMPT_ACTIVE) | ||
| 509 | |||
| 489 | /** | 510 | /** |
| 490 | * struct thread_group_cputimer - thread group interval timer counts | 511 | * struct thread_group_cputimer - thread group interval timer counts |
| 491 | * @cputime: thread group interval timers. | 512 | * @cputime: thread group interval timers. |
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 9c4cd27f4685..c47c4b4da97e 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
| @@ -80,6 +80,8 @@ struct spi_device { | |||
| 80 | #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */ | 80 | #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */ |
| 81 | #define SPI_3WIRE 0x10 /* SI/SO signals shared */ | 81 | #define SPI_3WIRE 0x10 /* SI/SO signals shared */ |
| 82 | #define SPI_LOOP 0x20 /* loopback mode */ | 82 | #define SPI_LOOP 0x20 /* loopback mode */ |
| 83 | #define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */ | ||
| 84 | #define SPI_READY 0x80 /* slave pulls low to pause */ | ||
| 83 | u8 bits_per_word; | 85 | u8 bits_per_word; |
| 84 | int irq; | 86 | int irq; |
| 85 | void *controller_state; | 87 | void *controller_state; |
| @@ -248,6 +250,10 @@ struct spi_master { | |||
| 248 | /* spi_device.mode flags understood by this controller driver */ | 250 | /* spi_device.mode flags understood by this controller driver */ |
| 249 | u16 mode_bits; | 251 | u16 mode_bits; |
| 250 | 252 | ||
| 253 | /* other constraints relevant to this driver */ | ||
| 254 | u16 flags; | ||
| 255 | #define SPI_MASTER_HALF_DUPLEX BIT(0) /* can't do full duplex */ | ||
| 256 | |||
| 251 | /* Setup mode and clock, etc (spi driver may call many times). | 257 | /* Setup mode and clock, etc (spi driver may call many times). |
| 252 | * | 258 | * |
| 253 | * IMPORTANT: this may be called when transfers to another | 259 | * IMPORTANT: this may be called when transfers to another |
diff --git a/include/linux/spi/spidev.h b/include/linux/spi/spidev.h index 95251ccd5a07..bf0570a84f7a 100644 --- a/include/linux/spi/spidev.h +++ b/include/linux/spi/spidev.h | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | #define SPI_LSB_FIRST 0x08 | 40 | #define SPI_LSB_FIRST 0x08 |
| 41 | #define SPI_3WIRE 0x10 | 41 | #define SPI_3WIRE 0x10 |
| 42 | #define SPI_LOOP 0x20 | 42 | #define SPI_LOOP 0x20 |
| 43 | #define SPI_NO_CS 0x40 | ||
| 44 | #define SPI_READY 0x80 | ||
| 43 | 45 | ||
| 44 | /*---------------------------------------------------------------------------*/ | 46 | /*---------------------------------------------------------------------------*/ |
| 45 | 47 | ||
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index 252b245cfcf4..4be57ab03478 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h | |||
| @@ -132,6 +132,11 @@ do { \ | |||
| 132 | #endif /*__raw_spin_is_contended*/ | 132 | #endif /*__raw_spin_is_contended*/ |
| 133 | #endif | 133 | #endif |
| 134 | 134 | ||
| 135 | /* The lock does not imply full memory barrier. */ | ||
| 136 | #ifndef ARCH_HAS_SMP_MB_AFTER_LOCK | ||
| 137 | static inline void smp_mb__after_lock(void) { smp_mb(); } | ||
| 138 | #endif | ||
| 139 | |||
| 135 | /** | 140 | /** |
| 136 | * spin_unlock_wait - wait until the spinlock gets unlocked | 141 | * spin_unlock_wait - wait until the spinlock gets unlocked |
| 137 | * @lock: the spinlock in question. | 142 | * @lock: the spinlock in question. |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index fa4242cdade8..80de7003d8c2 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -321,6 +321,8 @@ asmlinkage long sys_rt_sigtimedwait(const sigset_t __user *uthese, | |||
| 321 | siginfo_t __user *uinfo, | 321 | siginfo_t __user *uinfo, |
| 322 | const struct timespec __user *uts, | 322 | const struct timespec __user *uts, |
| 323 | size_t sigsetsize); | 323 | size_t sigsetsize); |
| 324 | asmlinkage long sys_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, | ||
| 325 | siginfo_t __user *uinfo); | ||
| 324 | asmlinkage long sys_kill(int pid, int sig); | 326 | asmlinkage long sys_kill(int pid, int sig); |
| 325 | asmlinkage long sys_tgkill(int tgid, int pid, int sig); | 327 | asmlinkage long sys_tgkill(int tgid, int pid, int sig); |
| 326 | asmlinkage long sys_tkill(int pid, int sig); | 328 | asmlinkage long sys_tkill(int pid, int sig); |
diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 98a1d8cfb73d..99adcdc0d3ca 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #ifndef _LINUX_SYSRQ_H | 14 | #ifndef _LINUX_SYSRQ_H |
| 15 | #define _LINUX_SYSRQ_H | 15 | #define _LINUX_SYSRQ_H |
| 16 | 16 | ||
| 17 | #include <linux/errno.h> | ||
| 18 | |||
| 17 | struct pt_regs; | 19 | struct pt_regs; |
| 18 | struct tty_struct; | 20 | struct tty_struct; |
| 19 | 21 | ||
diff --git a/include/linux/timer.h b/include/linux/timer.h index ccf882eed8f8..be62ec2ebea5 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h | |||
| @@ -190,6 +190,8 @@ extern unsigned long get_next_timer_interrupt(unsigned long now); | |||
| 190 | */ | 190 | */ |
| 191 | #ifdef CONFIG_TIMER_STATS | 191 | #ifdef CONFIG_TIMER_STATS |
| 192 | 192 | ||
| 193 | extern int timer_stats_active; | ||
| 194 | |||
| 193 | #define TIMER_STATS_FLAG_DEFERRABLE 0x1 | 195 | #define TIMER_STATS_FLAG_DEFERRABLE 0x1 |
| 194 | 196 | ||
| 195 | extern void init_timer_stats(void); | 197 | extern void init_timer_stats(void); |
| @@ -203,6 +205,8 @@ extern void __timer_stats_timer_set_start_info(struct timer_list *timer, | |||
| 203 | 205 | ||
| 204 | static inline void timer_stats_timer_set_start_info(struct timer_list *timer) | 206 | static inline void timer_stats_timer_set_start_info(struct timer_list *timer) |
| 205 | { | 207 | { |
| 208 | if (likely(!timer_stats_active)) | ||
| 209 | return; | ||
| 206 | __timer_stats_timer_set_start_info(timer, __builtin_return_address(0)); | 210 | __timer_stats_timer_set_start_info(timer, __builtin_return_address(0)); |
| 207 | } | 211 | } |
| 208 | 212 | ||
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index 44801d26a37a..0ec50ba62139 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
| @@ -317,7 +317,8 @@ extern int usb_serial_generic_register(int debug); | |||
| 317 | extern void usb_serial_generic_deregister(void); | 317 | extern void usb_serial_generic_deregister(void); |
| 318 | extern void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port, | 318 | extern void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port, |
| 319 | gfp_t mem_flags); | 319 | gfp_t mem_flags); |
| 320 | extern int usb_serial_handle_sysrq_char(struct usb_serial_port *port, | 320 | extern int usb_serial_handle_sysrq_char(struct tty_struct *tty, |
| 321 | struct usb_serial_port *port, | ||
| 321 | unsigned int ch); | 322 | unsigned int ch); |
| 322 | extern int usb_serial_handle_break(struct usb_serial_port *port); | 323 | extern int usb_serial_handle_break(struct usb_serial_port *port); |
| 323 | 324 | ||
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 5d44059f6d63..310e18a880ff 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h | |||
| @@ -42,7 +42,6 @@ struct usbnet { | |||
| 42 | 42 | ||
| 43 | /* protocol/interface state */ | 43 | /* protocol/interface state */ |
| 44 | struct net_device *net; | 44 | struct net_device *net; |
| 45 | struct net_device_stats stats; | ||
| 46 | int msg_enable; | 45 | int msg_enable; |
| 47 | unsigned long data [5]; | 46 | unsigned long data [5]; |
| 48 | u32 xid; | 47 | u32 xid; |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 8a025d510904..95846d988011 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -318,6 +318,8 @@ struct v4l2_pix_format { | |||
| 318 | /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ | 318 | /* see http://www.siliconimaging.com/RGB%20Bayer.htm */ |
| 319 | #define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B', 'A', '8', '1') /* 8 BGBG.. GRGR.. */ | 319 | #define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B', 'A', '8', '1') /* 8 BGBG.. GRGR.. */ |
| 320 | #define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G', 'B', 'R', 'G') /* 8 GBGB.. RGRG.. */ | 320 | #define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G', 'B', 'R', 'G') /* 8 GBGB.. RGRG.. */ |
| 321 | #define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G', 'R', 'B', 'G') /* 8 GRGR.. BGBG.. */ | ||
| 322 | |||
| 321 | /* | 323 | /* |
| 322 | * 10bit raw bayer, expanded to 16 bits | 324 | * 10bit raw bayer, expanded to 16 bits |
| 323 | * xxxxrrrrrrrrrrxxxxgggggggggg xxxxggggggggggxxxxbbbbbbbbbb... | 325 | * xxxxrrrrrrrrrrxxxxgggggggggg xxxxggggggggggxxxxbbbbbbbbbb... |
diff --git a/include/media/v4l2-chip-ident.h b/include/media/v4l2-chip-ident.h index 4d7e2272c42f..11a4a2d3e364 100644 --- a/include/media/v4l2-chip-ident.h +++ b/include/media/v4l2-chip-ident.h | |||
| @@ -155,6 +155,9 @@ enum { | |||
| 155 | /* module cafe_ccic, just ident 8801 */ | 155 | /* module cafe_ccic, just ident 8801 */ |
| 156 | V4L2_IDENT_CAFE = 8801, | 156 | V4L2_IDENT_CAFE = 8801, |
| 157 | 157 | ||
| 158 | /* module mt9v011, just ident 8243 */ | ||
| 159 | V4L2_IDENT_MT9V011 = 8243, | ||
| 160 | |||
| 158 | /* module tw9910: just ident 9910 */ | 161 | /* module tw9910: just ident 9910 */ |
| 159 | V4L2_IDENT_TW9910 = 9910, | 162 | V4L2_IDENT_TW9910 = 9910, |
| 160 | 163 | ||
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index a632689b61b4..cbdd6284996d 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
| @@ -258,8 +258,8 @@ static inline bool nf_ct_kill(struct nf_conn *ct) | |||
| 258 | /* Update TCP window tracking data when NAT mangles the packet */ | 258 | /* Update TCP window tracking data when NAT mangles the packet */ |
| 259 | extern void nf_conntrack_tcp_update(const struct sk_buff *skb, | 259 | extern void nf_conntrack_tcp_update(const struct sk_buff *skb, |
| 260 | unsigned int dataoff, | 260 | unsigned int dataoff, |
| 261 | struct nf_conn *ct, | 261 | struct nf_conn *ct, int dir, |
| 262 | int dir); | 262 | s16 offset); |
| 263 | 263 | ||
| 264 | /* Fake conntrack entry for untracked connections */ | 264 | /* Fake conntrack entry for untracked connections */ |
| 265 | extern struct nf_conn nf_conntrack_untracked; | 265 | extern struct nf_conn nf_conntrack_untracked; |
diff --git a/include/net/phonet/pn_dev.h b/include/net/phonet/pn_dev.h index 5054dc5ea2c2..29d126736611 100644 --- a/include/net/phonet/pn_dev.h +++ b/include/net/phonet/pn_dev.h | |||
| @@ -45,6 +45,7 @@ int phonet_address_add(struct net_device *dev, u8 addr); | |||
| 45 | int phonet_address_del(struct net_device *dev, u8 addr); | 45 | int phonet_address_del(struct net_device *dev, u8 addr); |
| 46 | u8 phonet_address_get(struct net_device *dev, u8 addr); | 46 | u8 phonet_address_get(struct net_device *dev, u8 addr); |
| 47 | int phonet_address_lookup(struct net *net, u8 addr); | 47 | int phonet_address_lookup(struct net *net, u8 addr); |
| 48 | void phonet_address_notify(int event, struct net_device *dev, u8 addr); | ||
| 48 | 49 | ||
| 49 | #define PN_NO_ADDR 0xff | 50 | #define PN_NO_ADDR 0xff |
| 50 | 51 | ||
diff --git a/include/net/sock.h b/include/net/sock.h index 352f06bbd7a9..2c0da9239b95 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include <linux/filter.h> | 55 | #include <linux/filter.h> |
| 56 | #include <linux/rculist_nulls.h> | 56 | #include <linux/rculist_nulls.h> |
| 57 | #include <linux/poll.h> | ||
| 57 | 58 | ||
| 58 | #include <asm/atomic.h> | 59 | #include <asm/atomic.h> |
| 59 | #include <net/dst.h> | 60 | #include <net/dst.h> |
| @@ -1241,6 +1242,74 @@ static inline int sk_has_allocations(const struct sock *sk) | |||
| 1241 | return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk); | 1242 | return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk); |
| 1242 | } | 1243 | } |
| 1243 | 1244 | ||
| 1245 | /** | ||
| 1246 | * sk_has_sleeper - check if there are any waiting processes | ||
| 1247 | * @sk: socket | ||
| 1248 | * | ||
| 1249 | * Returns true if socket has waiting processes | ||
| 1250 | * | ||
| 1251 | * The purpose of the sk_has_sleeper and sock_poll_wait is to wrap the memory | ||
| 1252 | * barrier call. They were added due to the race found within the tcp code. | ||
| 1253 | * | ||
| 1254 | * Consider following tcp code paths: | ||
| 1255 | * | ||
| 1256 | * CPU1 CPU2 | ||
| 1257 | * | ||
| 1258 | * sys_select receive packet | ||
| 1259 | * ... ... | ||
| 1260 | * __add_wait_queue update tp->rcv_nxt | ||
| 1261 | * ... ... | ||
| 1262 | * tp->rcv_nxt check sock_def_readable | ||
| 1263 | * ... { | ||
| 1264 | * schedule ... | ||
| 1265 | * if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) | ||
| 1266 | * wake_up_interruptible(sk->sk_sleep) | ||
| 1267 | * ... | ||
| 1268 | * } | ||
| 1269 | * | ||
| 1270 | * The race for tcp fires when the __add_wait_queue changes done by CPU1 stay | ||
| 1271 | * in its cache, and so does the tp->rcv_nxt update on CPU2 side. The CPU1 | ||
| 1272 | * could then endup calling schedule and sleep forever if there are no more | ||
| 1273 | * data on the socket. | ||
| 1274 | * | ||
| 1275 | * The sk_has_sleeper is always called right after a call to read_lock, so we | ||
| 1276 | * can use smp_mb__after_lock barrier. | ||
| 1277 | */ | ||
| 1278 | static inline int sk_has_sleeper(struct sock *sk) | ||
| 1279 | { | ||
| 1280 | /* | ||
| 1281 | * We need to be sure we are in sync with the | ||
| 1282 | * add_wait_queue modifications to the wait queue. | ||
| 1283 | * | ||
| 1284 | * This memory barrier is paired in the sock_poll_wait. | ||
| 1285 | */ | ||
| 1286 | smp_mb__after_lock(); | ||
| 1287 | return sk->sk_sleep && waitqueue_active(sk->sk_sleep); | ||
| 1288 | } | ||
| 1289 | |||
| 1290 | /** | ||
| 1291 | * sock_poll_wait - place memory barrier behind the poll_wait call. | ||
| 1292 | * @filp: file | ||
| 1293 | * @wait_address: socket wait queue | ||
| 1294 | * @p: poll_table | ||
| 1295 | * | ||
| 1296 | * See the comments in the sk_has_sleeper function. | ||
| 1297 | */ | ||
| 1298 | static inline void sock_poll_wait(struct file *filp, | ||
| 1299 | wait_queue_head_t *wait_address, poll_table *p) | ||
| 1300 | { | ||
| 1301 | if (p && wait_address) { | ||
| 1302 | poll_wait(filp, wait_address, p); | ||
| 1303 | /* | ||
| 1304 | * We need to be sure we are in sync with the | ||
| 1305 | * socket flags modification. | ||
| 1306 | * | ||
| 1307 | * This memory barrier is paired in the sk_has_sleeper. | ||
| 1308 | */ | ||
| 1309 | smp_mb(); | ||
| 1310 | } | ||
| 1311 | } | ||
| 1312 | |||
| 1244 | /* | 1313 | /* |
| 1245 | * Queue a received datagram if it will fit. Stream and sequenced | 1314 | * Queue a received datagram if it will fit. Stream and sequenced |
| 1246 | * protocols can't normally use this as they need to fit buffers in | 1315 | * protocols can't normally use this as they need to fit buffers in |
