commit: 20f00980e88516e9663fcebc708948c1824b56b2 Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org> AuthorDate: Sun Jul 5 16:33:00 2015 +0000 Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org> CommitDate: Sun Jul 5 16:33:19 2015 +0000 URL: https://gitweb.gentoo.org/proj/hardened-patchset.git/commit/?id=20f00980
Grsec/PaX: 3.1-{3.2.69,3.14.47,4.0.7}-201507050833 3.14.46/1045_linux-3.14.46.patch | 829 ------------ {3.14.46 => 3.14.47}/0000_README | 6 +- 3.14.47/1046_linux-3.14.47.patch | 1395 ++++++++++++++++++++ .../4420_grsecurity-3.1-3.14.47-201507050832.patch | 154 ++- .../4425_grsec_remove_EI_PAX.patch | 0 .../4427_force_XATTR_PAX_tmpfs.patch | 0 .../4430_grsec-remove-localversion-grsec.patch | 0 .../4435_grsec-mute-warnings.patch | 0 .../4440_grsec-remove-protected-paths.patch | 0 .../4450_grsec-kconfig-default-gids.patch | 0 .../4465_selinux-avc_audit-log-curr_ip.patch | 0 .../4470_disable-compat_vdso.patch | 0 .../4475_emutramp_default_on.patch | 0 3.2.69/0000_README | 2 +- ... 4420_grsecurity-3.1-3.2.69-201507050830.patch} | 37 +- 4.0.7/0000_README | 6 +- 4.0.7/1006_linux-4.0.7.patch | 707 ---------- ...> 4420_grsecurity-3.1-4.0.7-201507050833.patch} | 103 +- 18 files changed, 1630 insertions(+), 1609 deletions(-) diff --git a/3.14.46/1045_linux-3.14.46.patch b/3.14.46/1045_linux-3.14.46.patch deleted file mode 100644 index 12790dc..0000000 --- a/3.14.46/1045_linux-3.14.46.patch +++ /dev/null @@ -1,829 +0,0 @@ -diff --git a/Makefile b/Makefile -index c92186c..def39fd 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 3 - PATCHLEVEL = 14 --SUBLEVEL = 45 -+SUBLEVEL = 46 - EXTRAVERSION = - NAME = Remembering Coco - -diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h -index 09af149..530f56e 100644 ---- a/arch/arm/include/asm/kvm_host.h -+++ b/arch/arm/include/asm/kvm_host.h -@@ -42,7 +42,7 @@ - - struct kvm_vcpu; - u32 *kvm_vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num, u32 mode); --int kvm_target_cpu(void); -+int __attribute_const__ kvm_target_cpu(void); - int kvm_reset_vcpu(struct kvm_vcpu *vcpu); - void kvm_reset_coprocs(struct kvm_vcpu *vcpu); - -diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h -index 7b362bc..0cbdb8e 100644 ---- a/arch/arm/include/asm/kvm_mmu.h -+++ b/arch/arm/include/asm/kvm_mmu.h -@@ -127,6 +127,18 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) - (__boundary - 1 < (end) - 1)? __boundary: (end); \ - }) - -+static inline bool kvm_page_empty(void *ptr) -+{ -+ struct page *ptr_page = virt_to_page(ptr); -+ return page_count(ptr_page) == 1; -+} -+ -+ -+#define kvm_pte_table_empty(ptep) kvm_page_empty(ptep) -+#define kvm_pmd_table_empty(pmdp) kvm_page_empty(pmdp) -+#define kvm_pud_table_empty(pudp) (0) -+ -+ - struct kvm; - - #define kvm_flush_dcache_to_poc(a,l) __cpuc_flush_dcache_area((a), (l)) -diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S -index 797b1a6..7e666cf 100644 ---- a/arch/arm/kernel/hyp-stub.S -+++ b/arch/arm/kernel/hyp-stub.S -@@ -134,9 +134,7 @@ ENTRY(__hyp_stub_install_secondary) - mcr p15, 4, r7, c1, c1, 3 @ HSTR - - THUMB( orr r7, #(1 << 30) ) @ HSCTLR.TE --#ifdef CONFIG_CPU_BIG_ENDIAN -- orr r7, #(1 << 9) @ HSCTLR.EE --#endif -+ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE - mcr p15, 4, r7, c1, c0, 0 @ HSCTLR - - mrc p15, 4, r7, c1, c1, 1 @ HDCR -diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c -index bd18bb8..df6e75e 100644 ---- a/arch/arm/kvm/arm.c -+++ b/arch/arm/kvm/arm.c -@@ -82,7 +82,7 @@ struct kvm_vcpu *kvm_arm_get_running_vcpu(void) - /** - * kvm_arm_get_running_vcpus - get the per-CPU array of currently running vcpus. - */ --struct kvm_vcpu __percpu **kvm_get_running_vcpus(void) -+struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void) - { - return &kvm_arm_running_vcpu; - } -@@ -155,16 +155,6 @@ int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) - return VM_FAULT_SIGBUS; - } - --void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, -- struct kvm_memory_slot *dont) --{ --} -- --int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, -- unsigned long npages) --{ -- return 0; --} - - /** - * kvm_arch_destroy_vm - destroy the VM data structure -@@ -224,33 +214,6 @@ long kvm_arch_dev_ioctl(struct file *filp, - return -EINVAL; - } - --void kvm_arch_memslots_updated(struct kvm *kvm) --{ --} -- --int kvm_arch_prepare_memory_region(struct kvm *kvm, -- struct kvm_memory_slot *memslot, -- struct kvm_userspace_memory_region *mem, -- enum kvm_mr_change change) --{ -- return 0; --} -- --void kvm_arch_commit_memory_region(struct kvm *kvm, -- struct kvm_userspace_memory_region *mem, -- const struct kvm_memory_slot *old, -- enum kvm_mr_change change) --{ --} -- --void kvm_arch_flush_shadow_all(struct kvm *kvm) --{ --} -- --void kvm_arch_flush_shadow_memslot(struct kvm *kvm, -- struct kvm_memory_slot *slot) --{ --} - - struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) - { -diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c -index c58a351..7c73290 100644 ---- a/arch/arm/kvm/coproc.c -+++ b/arch/arm/kvm/coproc.c -@@ -742,7 +742,7 @@ static bool is_valid_cache(u32 val) - u32 level, ctype; - - if (val >= CSSELR_MAX) -- return -ENOENT; -+ return false; - - /* Bottom bit is Instruction or Data bit. Next 3 bits are level. */ - level = (val >> 1); -diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c -index c93ef38..70ed2c1 100644 ---- a/arch/arm/kvm/mmu.c -+++ b/arch/arm/kvm/mmu.c -@@ -90,103 +90,115 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc) - return p; - } - --static bool page_empty(void *ptr) -+static void clear_pgd_entry(struct kvm *kvm, pgd_t *pgd, phys_addr_t addr) - { -- struct page *ptr_page = virt_to_page(ptr); -- return page_count(ptr_page) == 1; -+ pud_t *pud_table __maybe_unused = pud_offset(pgd, 0); -+ pgd_clear(pgd); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ pud_free(NULL, pud_table); -+ put_page(virt_to_page(pgd)); - } - - static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr) - { -- if (pud_huge(*pud)) { -- pud_clear(pud); -- kvm_tlb_flush_vmid_ipa(kvm, addr); -- } else { -- pmd_t *pmd_table = pmd_offset(pud, 0); -- pud_clear(pud); -- kvm_tlb_flush_vmid_ipa(kvm, addr); -- pmd_free(NULL, pmd_table); -- } -+ pmd_t *pmd_table = pmd_offset(pud, 0); -+ VM_BUG_ON(pud_huge(*pud)); -+ pud_clear(pud); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ pmd_free(NULL, pmd_table); - put_page(virt_to_page(pud)); - } - - static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr) - { -- if (kvm_pmd_huge(*pmd)) { -- pmd_clear(pmd); -- kvm_tlb_flush_vmid_ipa(kvm, addr); -- } else { -- pte_t *pte_table = pte_offset_kernel(pmd, 0); -- pmd_clear(pmd); -- kvm_tlb_flush_vmid_ipa(kvm, addr); -- pte_free_kernel(NULL, pte_table); -- } -+ pte_t *pte_table = pte_offset_kernel(pmd, 0); -+ VM_BUG_ON(kvm_pmd_huge(*pmd)); -+ pmd_clear(pmd); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ pte_free_kernel(NULL, pte_table); - put_page(virt_to_page(pmd)); - } - --static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) -+static void unmap_ptes(struct kvm *kvm, pmd_t *pmd, -+ phys_addr_t addr, phys_addr_t end) - { -- if (pte_present(*pte)) { -- kvm_set_pte(pte, __pte(0)); -- put_page(virt_to_page(pte)); -- kvm_tlb_flush_vmid_ipa(kvm, addr); -+ phys_addr_t start_addr = addr; -+ pte_t *pte, *start_pte; -+ -+ start_pte = pte = pte_offset_kernel(pmd, addr); -+ do { -+ if (!pte_none(*pte)) { -+ kvm_set_pte(pte, __pte(0)); -+ put_page(virt_to_page(pte)); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ } -+ } while (pte++, addr += PAGE_SIZE, addr != end); -+ -+ if (kvm_pte_table_empty(start_pte)) -+ clear_pmd_entry(kvm, pmd, start_addr); - } --} - --static void unmap_range(struct kvm *kvm, pgd_t *pgdp, -- unsigned long long start, u64 size) -+static void unmap_pmds(struct kvm *kvm, pud_t *pud, -+ phys_addr_t addr, phys_addr_t end) - { -- pgd_t *pgd; -- pud_t *pud; -- pmd_t *pmd; -- pte_t *pte; -- unsigned long long addr = start, end = start + size; -- u64 next; -- -- while (addr < end) { -- pgd = pgdp + pgd_index(addr); -- pud = pud_offset(pgd, addr); -- if (pud_none(*pud)) { -- addr = kvm_pud_addr_end(addr, end); -- continue; -- } -+ phys_addr_t next, start_addr = addr; -+ pmd_t *pmd, *start_pmd; - -- if (pud_huge(*pud)) { -- /* -- * If we are dealing with a huge pud, just clear it and -- * move on. -- */ -- clear_pud_entry(kvm, pud, addr); -- addr = kvm_pud_addr_end(addr, end); -- continue; -+ start_pmd = pmd = pmd_offset(pud, addr); -+ do { -+ next = kvm_pmd_addr_end(addr, end); -+ if (!pmd_none(*pmd)) { -+ if (kvm_pmd_huge(*pmd)) { -+ pmd_clear(pmd); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ put_page(virt_to_page(pmd)); -+ } else { -+ unmap_ptes(kvm, pmd, addr, next); -+ } - } -+ } while (pmd++, addr = next, addr != end); - -- pmd = pmd_offset(pud, addr); -- if (pmd_none(*pmd)) { -- addr = kvm_pmd_addr_end(addr, end); -- continue; -- } -+ if (kvm_pmd_table_empty(start_pmd)) -+ clear_pud_entry(kvm, pud, start_addr); -+} - -- if (!kvm_pmd_huge(*pmd)) { -- pte = pte_offset_kernel(pmd, addr); -- clear_pte_entry(kvm, pte, addr); -- next = addr + PAGE_SIZE; -- } -+static void unmap_puds(struct kvm *kvm, pgd_t *pgd, -+ phys_addr_t addr, phys_addr_t end) -+{ -+ phys_addr_t next, start_addr = addr; -+ pud_t *pud, *start_pud; - -- /* -- * If the pmd entry is to be cleared, walk back up the ladder -- */ -- if (kvm_pmd_huge(*pmd) || page_empty(pte)) { -- clear_pmd_entry(kvm, pmd, addr); -- next = kvm_pmd_addr_end(addr, end); -- if (page_empty(pmd) && !page_empty(pud)) { -- clear_pud_entry(kvm, pud, addr); -- next = kvm_pud_addr_end(addr, end); -+ start_pud = pud = pud_offset(pgd, addr); -+ do { -+ next = kvm_pud_addr_end(addr, end); -+ if (!pud_none(*pud)) { -+ if (pud_huge(*pud)) { -+ pud_clear(pud); -+ kvm_tlb_flush_vmid_ipa(kvm, addr); -+ put_page(virt_to_page(pud)); -+ } else { -+ unmap_pmds(kvm, pud, addr, next); - } - } -+ } while (pud++, addr = next, addr != end); - -- addr = next; -- } -+ if (kvm_pud_table_empty(start_pud)) -+ clear_pgd_entry(kvm, pgd, start_addr); -+} -+ -+ -+static void unmap_range(struct kvm *kvm, pgd_t *pgdp, -+ phys_addr_t start, u64 size) -+{ -+ pgd_t *pgd; -+ phys_addr_t addr = start, end = start + size; -+ phys_addr_t next; -+ -+ pgd = pgdp + pgd_index(addr); -+ do { -+ next = kvm_pgd_addr_end(addr, end); -+ unmap_puds(kvm, pgd, addr, next); -+ } while (pgd++, addr = next, addr != end); - } - - static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd, -@@ -747,6 +759,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, - struct kvm_mmu_memory_cache *memcache = &vcpu->arch.mmu_page_cache; - struct vm_area_struct *vma; - pfn_t pfn; -+ pgprot_t mem_type = PAGE_S2; - - write_fault = kvm_is_write_fault(kvm_vcpu_get_hsr(vcpu)); - if (fault_status == FSC_PERM && !write_fault) { -@@ -797,6 +810,9 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, - if (is_error_pfn(pfn)) - return -EFAULT; - -+ if (kvm_is_mmio_pfn(pfn)) -+ mem_type = PAGE_S2_DEVICE; -+ - spin_lock(&kvm->mmu_lock); - if (mmu_notifier_retry(kvm, mmu_seq)) - goto out_unlock; -@@ -804,7 +820,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, - hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa); - - if (hugetlb) { -- pmd_t new_pmd = pfn_pmd(pfn, PAGE_S2); -+ pmd_t new_pmd = pfn_pmd(pfn, mem_type); - new_pmd = pmd_mkhuge(new_pmd); - if (writable) { - kvm_set_s2pmd_writable(&new_pmd); -@@ -813,13 +829,14 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, - coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE); - ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); - } else { -- pte_t new_pte = pfn_pte(pfn, PAGE_S2); -+ pte_t new_pte = pfn_pte(pfn, mem_type); - if (writable) { - kvm_set_s2pte_writable(&new_pte); - kvm_set_pfn_dirty(pfn); - } - coherent_cache_guest_page(vcpu, hva, PAGE_SIZE); -- ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, false); -+ ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, -+ mem_type == PAGE_S2_DEVICE); - } - - -@@ -1099,3 +1116,49 @@ out: - free_hyp_pgds(); - return err; - } -+ -+void kvm_arch_commit_memory_region(struct kvm *kvm, -+ struct kvm_userspace_memory_region *mem, -+ const struct kvm_memory_slot *old, -+ enum kvm_mr_change change) -+{ -+ gpa_t gpa = old->base_gfn << PAGE_SHIFT; -+ phys_addr_t size = old->npages << PAGE_SHIFT; -+ if (change == KVM_MR_DELETE || change == KVM_MR_MOVE) { -+ spin_lock(&kvm->mmu_lock); -+ unmap_stage2_range(kvm, gpa, size); -+ spin_unlock(&kvm->mmu_lock); -+ } -+} -+ -+int kvm_arch_prepare_memory_region(struct kvm *kvm, -+ struct kvm_memory_slot *memslot, -+ struct kvm_userspace_memory_region *mem, -+ enum kvm_mr_change change) -+{ -+ return 0; -+} -+ -+void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, -+ struct kvm_memory_slot *dont) -+{ -+} -+ -+int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, -+ unsigned long npages) -+{ -+ return 0; -+} -+ -+void kvm_arch_memslots_updated(struct kvm *kvm) -+{ -+} -+ -+void kvm_arch_flush_shadow_all(struct kvm *kvm) -+{ -+} -+ -+void kvm_arch_flush_shadow_memslot(struct kvm *kvm, -+ struct kvm_memory_slot *slot) -+{ -+} -diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h -index 0a1d697..3fb0946 100644 ---- a/arch/arm64/include/asm/kvm_host.h -+++ b/arch/arm64/include/asm/kvm_host.h -@@ -42,7 +42,7 @@ - #define KVM_VCPU_MAX_FEATURES 2 - - struct kvm_vcpu; --int kvm_target_cpu(void); -+int __attribute_const__ kvm_target_cpu(void); - int kvm_reset_vcpu(struct kvm_vcpu *vcpu); - int kvm_arch_dev_ioctl_check_extension(long ext); - -@@ -177,7 +177,7 @@ static inline int kvm_test_age_hva(struct kvm *kvm, unsigned long hva) - } - - struct kvm_vcpu *kvm_arm_get_running_vcpu(void); --struct kvm_vcpu __percpu **kvm_get_running_vcpus(void); -+struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void); - - u64 kvm_call_hyp(void *hypfn, ...); - -diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h -index 7d29847..8e138c7 100644 ---- a/arch/arm64/include/asm/kvm_mmu.h -+++ b/arch/arm64/include/asm/kvm_mmu.h -@@ -125,6 +125,21 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) - #define kvm_pud_addr_end(addr, end) pud_addr_end(addr, end) - #define kvm_pmd_addr_end(addr, end) pmd_addr_end(addr, end) - -+static inline bool kvm_page_empty(void *ptr) -+{ -+ struct page *ptr_page = virt_to_page(ptr); -+ return page_count(ptr_page) == 1; -+} -+ -+#define kvm_pte_table_empty(ptep) kvm_page_empty(ptep) -+#ifndef CONFIG_ARM64_64K_PAGES -+#define kvm_pmd_table_empty(pmdp) kvm_page_empty(pmdp) -+#else -+#define kvm_pmd_table_empty(pmdp) (0) -+#endif -+#define kvm_pud_table_empty(pudp) (0) -+ -+ - struct kvm; - - #define kvm_flush_dcache_to_poc(a,l) __flush_dcache_area((a), (l)) -diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S -index b0d1512..5dfc8331 100644 ---- a/arch/arm64/kvm/hyp.S -+++ b/arch/arm64/kvm/hyp.S -@@ -830,7 +830,7 @@ el1_trap: - mrs x2, far_el2 - - 2: mrs x0, tpidr_el2 -- str x1, [x0, #VCPU_ESR_EL2] -+ str w1, [x0, #VCPU_ESR_EL2] - str x2, [x0, #VCPU_FAR_EL2] - str x3, [x0, #VCPU_HPFAR_EL2] - -diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c -index 0324458..7691b25 100644 ---- a/arch/arm64/kvm/sys_regs.c -+++ b/arch/arm64/kvm/sys_regs.c -@@ -836,7 +836,7 @@ static bool is_valid_cache(u32 val) - u32 level, ctype; - - if (val >= CSSELR_MAX) -- return -ENOENT; -+ return false; - - /* Bottom bit is Instruction or Data bit. Next 3 bits are level. */ - level = (val >> 1); -@@ -962,7 +962,7 @@ static unsigned int num_demux_regs(void) - - static int write_demux_regids(u64 __user *uindices) - { -- u64 val = KVM_REG_ARM | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX; -+ u64 val = KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX; - unsigned int i; - - val |= KVM_REG_ARM_DEMUX_ID_CCSIDR; -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 26b03e1..8ff2b3c 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -79,6 +79,7 @@ static const struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x0489, 0xe057) }, - { USB_DEVICE(0x0489, 0xe056) }, - { USB_DEVICE(0x0489, 0xe05f) }, -+ { USB_DEVICE(0x0489, 0xe076) }, - { USB_DEVICE(0x0489, 0xe078) }, - { USB_DEVICE(0x04c5, 0x1330) }, - { USB_DEVICE(0x04CA, 0x3004) }, -@@ -109,6 +110,7 @@ static const struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x13d3, 0x3402) }, - { USB_DEVICE(0x13d3, 0x3408) }, - { USB_DEVICE(0x13d3, 0x3432) }, -+ { USB_DEVICE(0x13d3, 0x3474) }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, -@@ -133,6 +135,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, -@@ -163,6 +166,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU22 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 9eb1669..c0e7a9aa9 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -157,6 +157,7 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, -@@ -187,6 +188,7 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, -diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c -index 28486b1..ae6dae8 100644 ---- a/drivers/crypto/caam/caamrng.c -+++ b/drivers/crypto/caam/caamrng.c -@@ -56,7 +56,7 @@ - - /* Buffer, its dma address and lock */ - struct buf_data { -- u8 buf[RN_BUF_SIZE]; -+ u8 buf[RN_BUF_SIZE] ____cacheline_aligned; - dma_addr_t addr; - struct completion filled; - u32 hw_desc[DESC_JOB_O_LEN]; -diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c -index 9683747..f2511a0 100644 ---- a/drivers/gpu/drm/mgag200/mgag200_mode.c -+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c -@@ -1529,6 +1529,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector, - return MODE_BANDWIDTH; - } - -+ if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 || -+ (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) { -+ return MODE_H_ILLEGAL; -+ } -+ - if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || - mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || - mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 || -diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c -index 8f580fd..ce21132 100644 ---- a/drivers/scsi/lpfc/lpfc_sli.c -+++ b/drivers/scsi/lpfc/lpfc_sli.c -@@ -265,6 +265,16 @@ lpfc_sli4_eq_get(struct lpfc_queue *q) - return NULL; - - q->hba_index = idx; -+ -+ /* -+ * insert barrier for instruction interlock : data from the hardware -+ * must have the valid bit checked before it can be copied and acted -+ * upon. Given what was seen in lpfc_sli4_cq_get() of speculative -+ * instructions allowing action on content before valid bit checked, -+ * add barrier here as well. May not be needed as "content" is a -+ * single 32-bit entity here (vs multi word structure for cq's). -+ */ -+ mb(); - return eqe; - } - -@@ -370,6 +380,17 @@ lpfc_sli4_cq_get(struct lpfc_queue *q) - - cqe = q->qe[q->hba_index].cqe; - q->hba_index = idx; -+ -+ /* -+ * insert barrier for instruction interlock : data from the hardware -+ * must have the valid bit checked before it can be copied and acted -+ * upon. Speculative instructions were allowing a bcopy at the start -+ * of lpfc_sli4_fp_handle_wcqe(), which is called immediately -+ * after our return, to copy data before the valid bit check above -+ * was done. As such, some of the copied data was stale. The barrier -+ * ensures the check is before any data is copied. -+ */ -+ mb(); - return cqe; - } - -diff --git a/fs/pipe.c b/fs/pipe.c -index 78fd0d0..46f1ab2 100644 ---- a/fs/pipe.c -+++ b/fs/pipe.c -@@ -117,25 +117,27 @@ void pipe_wait(struct pipe_inode_info *pipe) - } - - static int --pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len, -- int atomic) -+pipe_iov_copy_from_user(void *addr, int *offset, struct iovec *iov, -+ size_t *remaining, int atomic) - { - unsigned long copy; - -- while (len > 0) { -+ while (*remaining > 0) { - while (!iov->iov_len) - iov++; -- copy = min_t(unsigned long, len, iov->iov_len); -+ copy = min_t(unsigned long, *remaining, iov->iov_len); - - if (atomic) { -- if (__copy_from_user_inatomic(to, iov->iov_base, copy)) -+ if (__copy_from_user_inatomic(addr + *offset, -+ iov->iov_base, copy)) - return -EFAULT; - } else { -- if (copy_from_user(to, iov->iov_base, copy)) -+ if (copy_from_user(addr + *offset, -+ iov->iov_base, copy)) - return -EFAULT; - } -- to += copy; -- len -= copy; -+ *offset += copy; -+ *remaining -= copy; - iov->iov_base += copy; - iov->iov_len -= copy; - } -@@ -143,25 +145,27 @@ pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len, - } - - static int --pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len, -- int atomic) -+pipe_iov_copy_to_user(struct iovec *iov, void *addr, int *offset, -+ size_t *remaining, int atomic) - { - unsigned long copy; - -- while (len > 0) { -+ while (*remaining > 0) { - while (!iov->iov_len) - iov++; -- copy = min_t(unsigned long, len, iov->iov_len); -+ copy = min_t(unsigned long, *remaining, iov->iov_len); - - if (atomic) { -- if (__copy_to_user_inatomic(iov->iov_base, from, copy)) -+ if (__copy_to_user_inatomic(iov->iov_base, -+ addr + *offset, copy)) - return -EFAULT; - } else { -- if (copy_to_user(iov->iov_base, from, copy)) -+ if (copy_to_user(iov->iov_base, -+ addr + *offset, copy)) - return -EFAULT; - } -- from += copy; -- len -= copy; -+ *offset += copy; -+ *remaining -= copy; - iov->iov_base += copy; - iov->iov_len -= copy; - } -@@ -395,7 +399,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov, - struct pipe_buffer *buf = pipe->bufs + curbuf; - const struct pipe_buf_operations *ops = buf->ops; - void *addr; -- size_t chars = buf->len; -+ size_t chars = buf->len, remaining; - int error, atomic; - - if (chars > total_len) -@@ -409,9 +413,11 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov, - } - - atomic = !iov_fault_in_pages_write(iov, chars); -+ remaining = chars; - redo: - addr = ops->map(pipe, buf, atomic); -- error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic); -+ error = pipe_iov_copy_to_user(iov, addr, &buf->offset, -+ &remaining, atomic); - ops->unmap(pipe, buf, addr); - if (unlikely(error)) { - /* -@@ -426,7 +432,6 @@ redo: - break; - } - ret += chars; -- buf->offset += chars; - buf->len -= chars; - - /* Was it a packet buffer? Clean up and exit */ -@@ -531,6 +536,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov, - if (ops->can_merge && offset + chars <= PAGE_SIZE) { - int error, atomic = 1; - void *addr; -+ size_t remaining = chars; - - error = ops->confirm(pipe, buf); - if (error) -@@ -539,8 +545,8 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov, - iov_fault_in_pages_read(iov, chars); - redo1: - addr = ops->map(pipe, buf, atomic); -- error = pipe_iov_copy_from_user(offset + addr, iov, -- chars, atomic); -+ error = pipe_iov_copy_from_user(addr, &offset, iov, -+ &remaining, atomic); - ops->unmap(pipe, buf, addr); - ret = error; - do_wakeup = 1; -@@ -575,6 +581,8 @@ redo1: - struct page *page = pipe->tmp_page; - char *src; - int error, atomic = 1; -+ int offset = 0; -+ size_t remaining; - - if (!page) { - page = alloc_page(GFP_HIGHUSER); -@@ -595,14 +603,15 @@ redo1: - chars = total_len; - - iov_fault_in_pages_read(iov, chars); -+ remaining = chars; - redo2: - if (atomic) - src = kmap_atomic(page); - else - src = kmap(page); - -- error = pipe_iov_copy_from_user(src, iov, chars, -- atomic); -+ error = pipe_iov_copy_from_user(src, &offset, iov, -+ &remaining, atomic); - if (atomic) - kunmap_atomic(src); - else -diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c -index 8a86319..cb347e8 100644 ---- a/kernel/trace/trace_events_filter.c -+++ b/kernel/trace/trace_events_filter.c -@@ -1399,19 +1399,24 @@ static int check_preds(struct filter_parse_state *ps) - { - int n_normal_preds = 0, n_logical_preds = 0; - struct postfix_elt *elt; -+ int cnt = 0; - - list_for_each_entry(elt, &ps->postfix, list) { -- if (elt->op == OP_NONE) -+ if (elt->op == OP_NONE) { -+ cnt++; - continue; -+ } - -+ cnt--; - if (elt->op == OP_AND || elt->op == OP_OR) { - n_logical_preds++; - continue; - } - n_normal_preds++; -+ WARN_ON_ONCE(cnt < 0); - } - -- if (!n_normal_preds || n_logical_preds >= n_normal_preds) { -+ if (cnt != 1 || !n_normal_preds || n_logical_preds >= n_normal_preds) { - parse_error(ps, FILT_ERR_INVALID_FILTER, 0); - return -EINVAL; - } -diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c -index 4eec2d4..1316e55 100644 ---- a/virt/kvm/arm/vgic.c -+++ b/virt/kvm/arm/vgic.c -@@ -1654,7 +1654,7 @@ out: - return ret; - } - --static bool vgic_ioaddr_overlap(struct kvm *kvm) -+static int vgic_ioaddr_overlap(struct kvm *kvm) - { - phys_addr_t dist = kvm->arch.vgic.vgic_dist_base; - phys_addr_t cpu = kvm->arch.vgic.vgic_cpu_base; diff --git a/3.14.46/0000_README b/3.14.47/0000_README similarity index 93% rename from 3.14.46/0000_README rename to 3.14.47/0000_README index de59c28..b3b9e28 100644 --- a/3.14.46/0000_README +++ b/3.14.47/0000_README @@ -2,11 +2,11 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 1045_linux-3.14.46.patch +Patch: 1046_linux-3.14.47.patch From: http://www.kernel.org -Desc: Linux 3.14.46 +Desc: Linux 3.14.47 -Patch: 4420_grsecurity-3.1-3.14.46-201506300711.patch +Patch: 4420_grsecurity-3.1-3.14.47-201507050832.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.14.47/1046_linux-3.14.47.patch b/3.14.47/1046_linux-3.14.47.patch new file mode 100644 index 0000000..4dc0c5a --- /dev/null +++ b/3.14.47/1046_linux-3.14.47.patch @@ -0,0 +1,1395 @@ +diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt +index 6cd63a9..bc6d617 100644 +--- a/Documentation/virtual/kvm/api.txt ++++ b/Documentation/virtual/kvm/api.txt +@@ -2344,7 +2344,8 @@ should be created before this ioctl is invoked. + + Possible features: + - KVM_ARM_VCPU_POWER_OFF: Starts the CPU in a power-off state. +- Depends on KVM_CAP_ARM_PSCI. ++ Depends on KVM_CAP_ARM_PSCI. If not set, the CPU will be powered on ++ and execute guest code when KVM_RUN is called. + - KVM_ARM_VCPU_EL1_32BIT: Starts the CPU in a 32bit mode. + Depends on KVM_CAP_ARM_EL1_32BIT (arm64 only). + +diff --git a/Makefile b/Makefile +index def39fd..f9041e6 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 3 + PATCHLEVEL = 14 +-SUBLEVEL = 46 ++SUBLEVEL = 47 + EXTRAVERSION = + NAME = Remembering Coco + +diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h +index 0fa90c9..853e2be 100644 +--- a/arch/arm/include/asm/kvm_emulate.h ++++ b/arch/arm/include/asm/kvm_emulate.h +@@ -33,6 +33,11 @@ void kvm_inject_undefined(struct kvm_vcpu *vcpu); + void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr); + void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr); + ++static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) ++{ ++ vcpu->arch.hcr = HCR_GUEST_MASK; ++} ++ + static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu) + { + return 1; +diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h +index 0cbdb8e..9f79231 100644 +--- a/arch/arm/include/asm/kvm_mmu.h ++++ b/arch/arm/include/asm/kvm_mmu.h +@@ -47,6 +47,7 @@ int create_hyp_io_mappings(void *from, void *to, phys_addr_t); + void free_boot_hyp_pgd(void); + void free_hyp_pgds(void); + ++void stage2_unmap_vm(struct kvm *kvm); + int kvm_alloc_stage2_pgd(struct kvm *kvm); + void kvm_free_stage2_pgd(struct kvm *kvm); + int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, +@@ -78,17 +79,6 @@ static inline void kvm_set_pte(pte_t *pte, pte_t new_pte) + flush_pmd_entry(pte); + } + +-static inline bool kvm_is_write_fault(unsigned long hsr) +-{ +- unsigned long hsr_ec = hsr >> HSR_EC_SHIFT; +- if (hsr_ec == HSR_EC_IABT) +- return false; +- else if ((hsr & HSR_ISV) && !(hsr & HSR_WNR)) +- return false; +- else +- return true; +-} +- + static inline void kvm_clean_pgd(pgd_t *pgd) + { + clean_dcache_area(pgd, PTRS_PER_S2_PGD * sizeof(pgd_t)); +diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c +index df6e75e..2e74a61 100644 +--- a/arch/arm/kvm/arm.c ++++ b/arch/arm/kvm/arm.c +@@ -220,6 +220,11 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) + int err; + struct kvm_vcpu *vcpu; + ++ if (irqchip_in_kernel(kvm) && vgic_initialized(kvm)) { ++ err = -EBUSY; ++ goto out; ++ } ++ + vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL); + if (!vcpu) { + err = -ENOMEM; +@@ -427,9 +432,9 @@ static void update_vttbr(struct kvm *kvm) + + /* update vttbr to be used with the new vmid */ + pgd_phys = virt_to_phys(kvm->arch.pgd); ++ BUG_ON(pgd_phys & ~VTTBR_BADDR_MASK); + vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK; +- kvm->arch.vttbr = pgd_phys & VTTBR_BADDR_MASK; +- kvm->arch.vttbr |= vmid; ++ kvm->arch.vttbr = pgd_phys | vmid; + + spin_unlock(&kvm_vmid_lock); + } +@@ -676,10 +681,21 @@ static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu, + return ret; + + /* ++ * Ensure a rebooted VM will fault in RAM pages and detect if the ++ * guest MMU is turned off and flush the caches as needed. ++ */ ++ if (vcpu->arch.has_run_once) ++ stage2_unmap_vm(vcpu->kvm); ++ ++ vcpu_reset_hcr(vcpu); ++ ++ /* + * Handle the "start in power-off" case by marking the VCPU as paused. + */ +- if (__test_and_clear_bit(KVM_ARM_VCPU_POWER_OFF, vcpu->arch.features)) ++ if (test_bit(KVM_ARM_VCPU_POWER_OFF, vcpu->arch.features)) + vcpu->arch.pause = true; ++ else ++ vcpu->arch.pause = false; + + return 0; + } +@@ -825,7 +841,8 @@ static int hyp_init_cpu_notify(struct notifier_block *self, + switch (action) { + case CPU_STARTING: + case CPU_STARTING_FROZEN: +- cpu_init_hyp_mode(NULL); ++ if (__hyp_get_vectors() == hyp_default_vectors) ++ cpu_init_hyp_mode(NULL); + break; + } + +diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c +index b23a59c..2786eae 100644 +--- a/arch/arm/kvm/guest.c ++++ b/arch/arm/kvm/guest.c +@@ -38,7 +38,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { + + int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) + { +- vcpu->arch.hcr = HCR_GUEST_MASK; + return 0; + } + +diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c +index 70ed2c1..524b4b5 100644 +--- a/arch/arm/kvm/mmu.c ++++ b/arch/arm/kvm/mmu.c +@@ -197,7 +197,8 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp, + pgd = pgdp + pgd_index(addr); + do { + next = kvm_pgd_addr_end(addr, end); +- unmap_puds(kvm, pgd, addr, next); ++ if (!pgd_none(*pgd)) ++ unmap_puds(kvm, pgd, addr, next); + } while (pgd++, addr = next, addr != end); + } + +@@ -555,6 +556,71 @@ static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) + unmap_range(kvm, kvm->arch.pgd, start, size); + } + ++static void stage2_unmap_memslot(struct kvm *kvm, ++ struct kvm_memory_slot *memslot) ++{ ++ hva_t hva = memslot->userspace_addr; ++ phys_addr_t addr = memslot->base_gfn << PAGE_SHIFT; ++ phys_addr_t size = PAGE_SIZE * memslot->npages; ++ hva_t reg_end = hva + size; ++ ++ /* ++ * A memory region could potentially cover multiple VMAs, and any holes ++ * between them, so iterate over all of them to find out if we should ++ * unmap any of them. ++ * ++ * +--------------------------------------------+ ++ * +---------------+----------------+ +----------------+ ++ * | : VMA 1 | VMA 2 | | VMA 3 : | ++ * +---------------+----------------+ +----------------+ ++ * | memory region | ++ * +--------------------------------------------+ ++ */ ++ do { ++ struct vm_area_struct *vma = find_vma(current->mm, hva); ++ hva_t vm_start, vm_end; ++ ++ if (!vma || vma->vm_start >= reg_end) ++ break; ++ ++ /* ++ * Take the intersection of this VMA with the memory region ++ */ ++ vm_start = max(hva, vma->vm_start); ++ vm_end = min(reg_end, vma->vm_end); ++ ++ if (!(vma->vm_flags & VM_PFNMAP)) { ++ gpa_t gpa = addr + (vm_start - memslot->userspace_addr); ++ unmap_stage2_range(kvm, gpa, vm_end - vm_start); ++ } ++ hva = vm_end; ++ } while (hva < reg_end); ++} ++ ++/** ++ * stage2_unmap_vm - Unmap Stage-2 RAM mappings ++ * @kvm: The struct kvm pointer ++ * ++ * Go through the memregions and unmap any reguler RAM ++ * backing memory already mapped to the VM. ++ */ ++void stage2_unmap_vm(struct kvm *kvm) ++{ ++ struct kvm_memslots *slots; ++ struct kvm_memory_slot *memslot; ++ int idx; ++ ++ idx = srcu_read_lock(&kvm->srcu); ++ spin_lock(&kvm->mmu_lock); ++ ++ slots = kvm_memslots(kvm); ++ kvm_for_each_memslot(memslot, slots) ++ stage2_unmap_memslot(kvm, memslot); ++ ++ spin_unlock(&kvm->mmu_lock); ++ srcu_read_unlock(&kvm->srcu, idx); ++} ++ + /** + * kvm_free_stage2_pgd - free all stage-2 tables + * @kvm: The KVM struct pointer for the VM. +@@ -746,6 +812,19 @@ static bool transparent_hugepage_adjust(pfn_t *pfnp, phys_addr_t *ipap) + return false; + } + ++static bool kvm_is_write_fault(struct kvm_vcpu *vcpu) ++{ ++ if (kvm_vcpu_trap_is_iabt(vcpu)) ++ return false; ++ ++ return kvm_vcpu_dabt_iswrite(vcpu); ++} ++ ++static bool kvm_is_device_pfn(unsigned long pfn) ++{ ++ return !pfn_valid(pfn); ++} ++ + static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, + struct kvm_memory_slot *memslot, + unsigned long fault_status) +@@ -761,7 +840,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, + pfn_t pfn; + pgprot_t mem_type = PAGE_S2; + +- write_fault = kvm_is_write_fault(kvm_vcpu_get_hsr(vcpu)); ++ write_fault = kvm_is_write_fault(vcpu); + if (fault_status == FSC_PERM && !write_fault) { + kvm_err("Unexpected L2 read permission error\n"); + return -EFAULT; +@@ -770,6 +849,12 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, + /* Let's check if we will get back a huge page backed by hugetlbfs */ + down_read(¤t->mm->mmap_sem); + vma = find_vma_intersection(current->mm, hva, hva + 1); ++ if (unlikely(!vma)) { ++ kvm_err("Failed to find VMA for hva 0x%lx\n", hva); ++ up_read(¤t->mm->mmap_sem); ++ return -EFAULT; ++ } ++ + if (is_vm_hugetlb_page(vma)) { + hugetlb = true; + gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; +@@ -810,7 +895,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, + if (is_error_pfn(pfn)) + return -EFAULT; + +- if (kvm_is_mmio_pfn(pfn)) ++ if (kvm_is_device_pfn(pfn)) + mem_type = PAGE_S2_DEVICE; + + spin_lock(&kvm->mmu_lock); +@@ -836,7 +921,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, + } + coherent_cache_guest_page(vcpu, hva, PAGE_SIZE); + ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, +- mem_type == PAGE_S2_DEVICE); ++ pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE)); + } + + +@@ -912,6 +997,9 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run) + + memslot = gfn_to_memslot(vcpu->kvm, gfn); + ++ /* Userspace should not be able to register out-of-bounds IPAs */ ++ VM_BUG_ON(fault_ipa >= KVM_PHYS_SIZE); ++ + ret = user_mem_abort(vcpu, fault_ipa, memslot, fault_status); + if (ret == 0) + ret = 1; +@@ -1136,6 +1224,14 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, + struct kvm_userspace_memory_region *mem, + enum kvm_mr_change change) + { ++ /* ++ * Prevent userspace from creating a memory region outside of the IPA ++ * space addressable by the KVM guest IPA space. ++ */ ++ if (memslot->base_gfn + memslot->npages >= ++ (KVM_PHYS_SIZE >> PAGE_SHIFT)) ++ return -EFAULT; ++ + return 0; + } + +diff --git a/arch/arm/mach-dove/board-dt.c b/arch/arm/mach-dove/board-dt.c +index 49fa9ab..7a7a09a5 100644 +--- a/arch/arm/mach-dove/board-dt.c ++++ b/arch/arm/mach-dove/board-dt.c +@@ -26,7 +26,7 @@ static void __init dove_dt_init(void) + #ifdef CONFIG_CACHE_TAUROS2 + tauros2_init(0); + #endif +- BUG_ON(mvebu_mbus_dt_init()); ++ BUG_ON(mvebu_mbus_dt_init(false)); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); + } + +diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c +index 01a5765..b509556 100644 +--- a/arch/arm/mach-imx/clk-imx6q.c ++++ b/arch/arm/mach-imx/clk-imx6q.c +@@ -406,7 +406,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) + clk[gpmi_io] = imx_clk_gate2("gpmi_io", "enfc", base + 0x78, 28); + clk[gpmi_apb] = imx_clk_gate2("gpmi_apb", "usdhc3", base + 0x78, 30); + clk[rom] = imx_clk_gate2("rom", "ahb", base + 0x7c, 0); +- clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4); ++ clk[sata] = imx_clk_gate2("sata", "ahb", base + 0x7c, 4); + clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6); + clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12); + clk[spdif] = imx_clk_gate2("spdif", "spdif_podf", base + 0x7c, 14); +diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c +index 7818815..79e629d 100644 +--- a/arch/arm/mach-kirkwood/board-dt.c ++++ b/arch/arm/mach-kirkwood/board-dt.c +@@ -116,7 +116,7 @@ static void __init kirkwood_dt_init(void) + */ + writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG); + +- BUG_ON(mvebu_mbus_dt_init()); ++ BUG_ON(mvebu_mbus_dt_init(false)); + + kirkwood_l2_init(); + +diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c +index f6c9d1d..79c3766a 100644 +--- a/arch/arm/mach-mvebu/armada-370-xp.c ++++ b/arch/arm/mach-mvebu/armada-370-xp.c +@@ -41,7 +41,7 @@ static void __init armada_370_xp_timer_and_clk_init(void) + of_clk_init(NULL); + clocksource_of_init(); + coherency_init(); +- BUG_ON(mvebu_mbus_dt_init()); ++ BUG_ON(mvebu_mbus_dt_init(coherency_available())); + #ifdef CONFIG_CACHE_L2X0 + l2x0_of_init(0, ~0UL); + #endif +diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c +index c295c10..49bad4d 100644 +--- a/arch/arm/mach-mvebu/coherency.c ++++ b/arch/arm/mach-mvebu/coherency.c +@@ -121,6 +121,20 @@ static struct notifier_block mvebu_hwcc_platform_nb = { + .notifier_call = mvebu_hwcc_platform_notifier, + }; + ++/* ++ * Keep track of whether we have IO hardware coherency enabled or not. ++ * On Armada 370's we will not be using it for example. We need to make ++ * that available [through coherency_available()] so the mbus controller ++ * doesn't enable the IO coherency bit in the attribute bits of the ++ * chip selects. ++ */ ++static int coherency_enabled; ++ ++int coherency_available(void) ++{ ++ return coherency_enabled; ++} ++ + int __init coherency_init(void) + { + struct device_node *np; +@@ -164,6 +178,7 @@ int __init coherency_init(void) + coherency_base = of_iomap(np, 0); + coherency_cpu_base = of_iomap(np, 1); + set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0); ++ coherency_enabled = 1; + of_node_put(np); + } + +diff --git a/arch/arm/mach-mvebu/coherency.h b/arch/arm/mach-mvebu/coherency.h +index 760226c..63e18c6 100644 +--- a/arch/arm/mach-mvebu/coherency.h ++++ b/arch/arm/mach-mvebu/coherency.h +@@ -17,6 +17,7 @@ + extern unsigned long coherency_phys_base; + + int set_cpu_coherent(unsigned int cpu_id, int smp_group_id); ++int coherency_available(void); + int coherency_init(void); + + #endif /* __MACH_370_XP_COHERENCY_H */ +diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h +index 00fbaa7..ea68925 100644 +--- a/arch/arm64/include/asm/kvm_arm.h ++++ b/arch/arm64/include/asm/kvm_arm.h +@@ -18,6 +18,7 @@ + #ifndef __ARM64_KVM_ARM_H__ + #define __ARM64_KVM_ARM_H__ + ++#include <asm/memory.h> + #include <asm/types.h> + + /* Hyp Configuration Register (HCR) bits */ +@@ -122,6 +123,17 @@ + #define VTCR_EL2_T0SZ_MASK 0x3f + #define VTCR_EL2_T0SZ_40B 24 + ++/* ++ * We configure the Stage-2 page tables to always restrict the IPA space to be ++ * 40 bits wide (T0SZ = 24). Systems with a PARange smaller than 40 bits are ++ * not known to exist and will break with this configuration. ++ * ++ * Note that when using 4K pages, we concatenate two first level page tables ++ * together. ++ * ++ * The magic numbers used for VTTBR_X in this patch can be found in Tables ++ * D4-23 and D4-25 in ARM DDI 0487A.b. ++ */ + #ifdef CONFIG_ARM64_64K_PAGES + /* + * Stage2 translation configuration: +@@ -151,9 +163,9 @@ + #endif + + #define VTTBR_BADDR_SHIFT (VTTBR_X - 1) +-#define VTTBR_BADDR_MASK (((1LLU << (40 - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT) +-#define VTTBR_VMID_SHIFT (48LLU) +-#define VTTBR_VMID_MASK (0xffLLU << VTTBR_VMID_SHIFT) ++#define VTTBR_BADDR_MASK (((UL(1) << (PHYS_MASK_SHIFT - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT) ++#define VTTBR_VMID_SHIFT (UL(48)) ++#define VTTBR_VMID_MASK (UL(0xFF) << VTTBR_VMID_SHIFT) + + /* Hyp System Trap Register */ + #define HSTR_EL2_TTEE (1 << 16) +@@ -176,13 +188,13 @@ + + /* Exception Syndrome Register (ESR) bits */ + #define ESR_EL2_EC_SHIFT (26) +-#define ESR_EL2_EC (0x3fU << ESR_EL2_EC_SHIFT) +-#define ESR_EL2_IL (1U << 25) ++#define ESR_EL2_EC (UL(0x3f) << ESR_EL2_EC_SHIFT) ++#define ESR_EL2_IL (UL(1) << 25) + #define ESR_EL2_ISS (ESR_EL2_IL - 1) + #define ESR_EL2_ISV_SHIFT (24) +-#define ESR_EL2_ISV (1U << ESR_EL2_ISV_SHIFT) ++#define ESR_EL2_ISV (UL(1) << ESR_EL2_ISV_SHIFT) + #define ESR_EL2_SAS_SHIFT (22) +-#define ESR_EL2_SAS (3U << ESR_EL2_SAS_SHIFT) ++#define ESR_EL2_SAS (UL(3) << ESR_EL2_SAS_SHIFT) + #define ESR_EL2_SSE (1 << 21) + #define ESR_EL2_SRT_SHIFT (16) + #define ESR_EL2_SRT_MASK (0x1f << ESR_EL2_SRT_SHIFT) +@@ -196,16 +208,16 @@ + #define ESR_EL2_FSC_TYPE (0x3c) + + #define ESR_EL2_CV_SHIFT (24) +-#define ESR_EL2_CV (1U << ESR_EL2_CV_SHIFT) ++#define ESR_EL2_CV (UL(1) << ESR_EL2_CV_SHIFT) + #define ESR_EL2_COND_SHIFT (20) +-#define ESR_EL2_COND (0xfU << ESR_EL2_COND_SHIFT) ++#define ESR_EL2_COND (UL(0xf) << ESR_EL2_COND_SHIFT) + + + #define FSC_FAULT (0x04) + #define FSC_PERM (0x0c) + + /* Hyp Prefetch Fault Address Register (HPFAR/HDFAR) */ +-#define HPFAR_MASK (~0xFUL) ++#define HPFAR_MASK (~UL(0xf)) + + #define ESR_EL2_EC_UNKNOWN (0x00) + #define ESR_EL2_EC_WFI (0x01) +diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h +index dd8ecfc3..681cb90 100644 +--- a/arch/arm64/include/asm/kvm_emulate.h ++++ b/arch/arm64/include/asm/kvm_emulate.h +@@ -38,6 +38,11 @@ void kvm_inject_undefined(struct kvm_vcpu *vcpu); + void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr); + void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr); + ++static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) ++{ ++ vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS; ++} ++ + static inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) + { + return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.pc; +diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h +index 8e138c7..0d51874 100644 +--- a/arch/arm64/include/asm/kvm_mmu.h ++++ b/arch/arm64/include/asm/kvm_mmu.h +@@ -59,10 +59,9 @@ + #define KERN_TO_HYP(kva) ((unsigned long)kva - PAGE_OFFSET + HYP_PAGE_OFFSET) + + /* +- * Align KVM with the kernel's view of physical memory. Should be +- * 40bit IPA, with PGD being 8kB aligned in the 4KB page configuration. ++ * We currently only support a 40bit IPA. + */ +-#define KVM_PHYS_SHIFT PHYS_MASK_SHIFT ++#define KVM_PHYS_SHIFT (40) + #define KVM_PHYS_SIZE (1UL << KVM_PHYS_SHIFT) + #define KVM_PHYS_MASK (KVM_PHYS_SIZE - 1UL) + +@@ -75,6 +74,7 @@ int create_hyp_io_mappings(void *from, void *to, phys_addr_t); + void free_boot_hyp_pgd(void); + void free_hyp_pgds(void); + ++void stage2_unmap_vm(struct kvm *kvm); + int kvm_alloc_stage2_pgd(struct kvm *kvm); + void kvm_free_stage2_pgd(struct kvm *kvm); + int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, +@@ -93,19 +93,6 @@ void kvm_clear_hyp_idmap(void); + #define kvm_set_pte(ptep, pte) set_pte(ptep, pte) + #define kvm_set_pmd(pmdp, pmd) set_pmd(pmdp, pmd) + +-static inline bool kvm_is_write_fault(unsigned long esr) +-{ +- unsigned long esr_ec = esr >> ESR_EL2_EC_SHIFT; +- +- if (esr_ec == ESR_EL2_EC_IABT) +- return false; +- +- if ((esr & ESR_EL2_ISV) && !(esr & ESR_EL2_WNR)) +- return false; +- +- return true; +-} +- + static inline void kvm_clean_pgd(pgd_t *pgd) {} + static inline void kvm_clean_pmd_entry(pmd_t *pmd) {} + static inline void kvm_clean_pte(pte_t *pte) {} +diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c +index 0874557..a8d81fa 100644 +--- a/arch/arm64/kvm/guest.c ++++ b/arch/arm64/kvm/guest.c +@@ -38,7 +38,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { + + int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) + { +- vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS; + return 0; + } + +diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c +index 3974881..b76159a 100644 +--- a/arch/arm64/mm/dma-mapping.c ++++ b/arch/arm64/mm/dma-mapping.c +@@ -54,8 +54,7 @@ static void *arm64_swiotlb_alloc_coherent(struct device *dev, size_t size, + + *dma_handle = phys_to_dma(dev, page_to_phys(page)); + addr = page_address(page); +- if (flags & __GFP_ZERO) +- memset(addr, 0, size); ++ memset(addr, 0, size); + return addr; + } else { + return swiotlb_alloc_coherent(dev, size, dma_handle, flags); +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 2f645c9..5dab54a 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -160,7 +160,7 @@ config SBUS + + config NEED_DMA_MAP_STATE + def_bool y +- depends on X86_64 || INTEL_IOMMU || DMA_API_DEBUG ++ depends on X86_64 || INTEL_IOMMU || DMA_API_DEBUG || SWIOTLB + + config NEED_SG_DMA_LENGTH + def_bool y +diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c +index 18f7391..43a07bf 100644 +--- a/arch/x86/kernel/cpu/microcode/intel_early.c ++++ b/arch/x86/kernel/cpu/microcode/intel_early.c +@@ -321,7 +321,7 @@ get_matching_model_microcode(int cpu, unsigned long start, + unsigned int mc_saved_count = mc_saved_data->mc_saved_count; + int i; + +- while (leftover) { ++ while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) { + mc_header = (struct microcode_header_intel *)ucode_ptr; + + mc_size = get_totalsize(mc_header); +diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c +index a1f5b18..490fee1 100644 +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -326,13 +326,16 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) + { + struct insn insn; + kprobe_opcode_t buf[MAX_INSN_SIZE]; ++ int length; + + kernel_insn_init(&insn, (void *)recover_probed_instruction(buf, (unsigned long)src)); + insn_get_length(&insn); ++ length = insn.length; ++ + /* Another subsystem puts a breakpoint, failed to recover */ + if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION) + return 0; +- memcpy(dest, insn.kaddr, insn.length); ++ memcpy(dest, insn.kaddr, length); + + #ifdef CONFIG_X86_64 + if (insn_rip_relative(&insn)) { +@@ -362,7 +365,7 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) + *(s32 *) disp = (s32) newdisp; + } + #endif +- return insn.length; ++ return length; + } + + static int __kprobes arch_copy_kprobe(struct kprobe *p) +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index 9643eda6..0746334 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -495,8 +495,10 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) + { + struct vcpu_svm *svm = to_svm(vcpu); + +- if (svm->vmcb->control.next_rip != 0) ++ if (svm->vmcb->control.next_rip != 0) { ++ WARN_ON(!static_cpu_has(X86_FEATURE_NRIPS)); + svm->next_rip = svm->vmcb->control.next_rip; ++ } + + if (!svm->next_rip) { + if (emulate_instruction(vcpu, EMULTYPE_SKIP) != +@@ -4246,7 +4248,9 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu, + break; + } + +- vmcb->control.next_rip = info->next_rip; ++ /* TODO: Advertise NRIPS to guest hypervisor unconditionally */ ++ if (static_cpu_has(X86_FEATURE_NRIPS)) ++ vmcb->control.next_rip = info->next_rip; + vmcb->control.exit_code = icpt_info.exit_code; + vmexit = nested_svm_exit_handled(svm); + +diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c +index e990dee..1aa0130 100644 +--- a/drivers/bus/mvebu-mbus.c ++++ b/drivers/bus/mvebu-mbus.c +@@ -701,7 +701,6 @@ static int __init mvebu_mbus_common_init(struct mvebu_mbus_state *mbus, + phys_addr_t sdramwins_phys_base, + size_t sdramwins_size) + { +- struct device_node *np; + int win; + + mbus->mbuswins_base = ioremap(mbuswins_phys_base, mbuswins_size); +@@ -714,12 +713,6 @@ static int __init mvebu_mbus_common_init(struct mvebu_mbus_state *mbus, + return -ENOMEM; + } + +- np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric"); +- if (np) { +- mbus->hw_io_coherency = 1; +- of_node_put(np); +- } +- + for (win = 0; win < mbus->soc->num_wins; win++) + mvebu_mbus_disable_window(mbus, win); + +@@ -889,7 +882,7 @@ static void __init mvebu_mbus_get_pcie_resources(struct device_node *np, + } + } + +-int __init mvebu_mbus_dt_init(void) ++int __init mvebu_mbus_dt_init(bool is_coherent) + { + struct resource mbuswins_res, sdramwins_res; + struct device_node *np, *controller; +@@ -928,6 +921,8 @@ int __init mvebu_mbus_dt_init(void) + return -EINVAL; + } + ++ mbus_state.hw_io_coherency = is_coherent; ++ + /* Get optional pcie-{mem,io}-aperture properties */ + mvebu_mbus_get_pcie_resources(np, &mbus_state.pcie_mem_aperture, + &mbus_state.pcie_io_aperture); +diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c +index c611bcc..3e623ab 100644 +--- a/drivers/edac/sb_edac.c ++++ b/drivers/edac/sb_edac.c +@@ -765,7 +765,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + u32 reg; + u64 limit, prv = 0; + u64 tmp_mb; +- u32 mb, kb; ++ u32 gb, mb; + u32 rir_way; + + /* +@@ -775,15 +775,17 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + pvt->tolm = pvt->info.get_tolm(pvt); + tmp_mb = (1 + pvt->tolm) >> 20; + +- mb = div_u64_rem(tmp_mb, 1000, &kb); +- edac_dbg(0, "TOLM: %u.%03u GB (0x%016Lx)\n", mb, kb, (u64)pvt->tolm); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); ++ edac_dbg(0, "TOLM: %u.%03u GB (0x%016Lx)\n", ++ gb, (mb*1000)/1024, (u64)pvt->tolm); + + /* Address range is already 45:25 */ + pvt->tohm = pvt->info.get_tohm(pvt); + tmp_mb = (1 + pvt->tohm) >> 20; + +- mb = div_u64_rem(tmp_mb, 1000, &kb); +- edac_dbg(0, "TOHM: %u.%03u GB (0x%016Lx)\n", mb, kb, (u64)pvt->tohm); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); ++ edac_dbg(0, "TOHM: %u.%03u GB (0x%016Lx)\n", ++ gb, (mb*1000)/1024, (u64)pvt->tohm); + + /* + * Step 2) Get SAD range and SAD Interleave list +@@ -805,11 +807,11 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + break; + + tmp_mb = (limit + 1) >> 20; +- mb = div_u64_rem(tmp_mb, 1000, &kb); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); + edac_dbg(0, "SAD#%d %s up to %u.%03u GB (0x%016Lx) Interleave: %s reg=0x%08x\n", + n_sads, + get_dram_attr(reg), +- mb, kb, ++ gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, + INTERLEAVE_MODE(reg) ? "8:6" : "[8:6]XOR[18:16]", + reg); +@@ -840,9 +842,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + break; + tmp_mb = (limit + 1) >> 20; + +- mb = div_u64_rem(tmp_mb, 1000, &kb); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); + edac_dbg(0, "TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n", +- n_tads, mb, kb, ++ n_tads, gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, + (u32)TAD_SOCK(reg), + (u32)TAD_CH(reg), +@@ -865,10 +867,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + tad_ch_nilv_offset[j], + ®); + tmp_mb = TAD_OFFSET(reg) >> 20; +- mb = div_u64_rem(tmp_mb, 1000, &kb); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); + edac_dbg(0, "TAD CH#%d, offset #%d: %u.%03u GB (0x%016Lx), reg=0x%08x\n", + i, j, +- mb, kb, ++ gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, + reg); + } +@@ -890,10 +892,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + + tmp_mb = RIR_LIMIT(reg) >> 20; + rir_way = 1 << RIR_WAY(reg); +- mb = div_u64_rem(tmp_mb, 1000, &kb); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); + edac_dbg(0, "CH#%d RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d, reg=0x%08x\n", + i, j, +- mb, kb, ++ gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, + rir_way, + reg); +@@ -904,10 +906,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + ®); + tmp_mb = RIR_OFFSET(reg) << 6; + +- mb = div_u64_rem(tmp_mb, 1000, &kb); ++ gb = div_u64_rem(tmp_mb, 1024, &mb); + edac_dbg(0, "CH#%d RIR#%d INTL#%d, offset %u.%03u GB (0x%016Lx), tgt: %d, reg=0x%08x\n", + i, j, k, +- mb, kb, ++ gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, + (u32)RIR_RNK_TGT(reg), + reg); +@@ -945,7 +947,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci, + u8 ch_way, sck_way, pkg, sad_ha = 0; + u32 tad_offset; + u32 rir_way; +- u32 mb, kb; ++ u32 mb, gb; + u64 ch_addr, offset, limit = 0, prv = 0; + + +@@ -1183,10 +1185,10 @@ static int get_memory_error_data(struct mem_ctl_info *mci, + continue; + + limit = RIR_LIMIT(reg); +- mb = div_u64_rem(limit >> 20, 1000, &kb); ++ gb = div_u64_rem(limit >> 20, 1024, &mb); + edac_dbg(0, "RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d\n", + n_rir, +- mb, kb, ++ gb, (mb*1000)/1024, + limit, + 1 << RIR_WAY(reg)); + if (ch_addr <= limit) +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +index 019a04a..a467261 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +@@ -810,8 +810,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) + tx_desc->ctrl.fence_size = (real_size / 16) & 0x3f; + tx_desc->ctrl.srcrb_flags = priv->ctrl_flags; + if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { +- tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | +- MLX4_WQE_CTRL_TCP_UDP_CSUM); ++ if (!skb->encapsulation) ++ tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | ++ MLX4_WQE_CTRL_TCP_UDP_CSUM); ++ else ++ tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM); + ring->tx_csum++; + } + +diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c +index 528bff5..85d370e 100644 +--- a/drivers/scsi/hpsa.c ++++ b/drivers/scsi/hpsa.c +@@ -3984,10 +3984,6 @@ static int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev) + + /* Save the PCI command register */ + pci_read_config_word(pdev, 4, &command_register); +- /* Turn the board off. This is so that later pci_restore_state() +- * won't turn the board on before the rest of config space is ready. +- */ +- pci_disable_device(pdev); + pci_save_state(pdev); + + /* find the first memory BAR, so we can find the cfg table */ +@@ -4035,11 +4031,6 @@ static int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev) + goto unmap_cfgtable; + + pci_restore_state(pdev); +- rc = pci_enable_device(pdev); +- if (rc) { +- dev_warn(&pdev->dev, "failed to enable device.\n"); +- goto unmap_cfgtable; +- } + pci_write_config_word(pdev, 4, command_register); + + /* Some devices (notably the HP Smart Array 5i Controller) +@@ -4525,6 +4516,23 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev) + if (!reset_devices) + return 0; + ++ /* kdump kernel is loading, we don't know in which state is ++ * the pci interface. The dev->enable_cnt is equal zero ++ * so we call enable+disable, wait a while and switch it on. ++ */ ++ rc = pci_enable_device(pdev); ++ if (rc) { ++ dev_warn(&pdev->dev, "Failed to enable PCI device\n"); ++ return -ENODEV; ++ } ++ pci_disable_device(pdev); ++ msleep(260); /* a randomly chosen number */ ++ rc = pci_enable_device(pdev); ++ if (rc) { ++ dev_warn(&pdev->dev, "failed to enable device.\n"); ++ return -ENODEV; ++ } ++ pci_set_master(pdev); + /* Reset the controller with a PCI power-cycle or via doorbell */ + rc = hpsa_kdump_hard_reset_controller(pdev); + +@@ -4533,10 +4541,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev) + * "performant mode". Or, it might be 640x, which can't reset + * due to concerns about shared bbwc between 6402/6404 pair. + */ +- if (rc == -ENOTSUPP) +- return rc; /* just try to do the kdump anyhow. */ +- if (rc) +- return -ENODEV; ++ if (rc) { ++ if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */ ++ rc = -ENODEV; ++ goto out_disable; ++ } + + /* Now try to get the controller to respond to a no-op */ + dev_warn(&pdev->dev, "Waiting for controller to respond to no-op\n"); +@@ -4547,7 +4556,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev) + dev_warn(&pdev->dev, "no-op failed%s\n", + (i < 11 ? "; re-trying" : "")); + } +- return 0; ++ ++out_disable: ++ ++ pci_disable_device(pdev); ++ return rc; + } + + static int hpsa_allocate_cmd_pool(struct ctlr_info *h) +@@ -4690,6 +4703,7 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h) + iounmap(h->transtable); + if (h->cfgtable) + iounmap(h->cfgtable); ++ pci_disable_device(h->pdev); + pci_release_regions(h->pdev); + kfree(h); + } +diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c +index 93de3ba..f8ffee4 100644 +--- a/fs/btrfs/ctree.c ++++ b/fs/btrfs/ctree.c +@@ -2963,7 +2963,7 @@ done: + */ + if (!p->leave_spinning) + btrfs_set_path_blocking(p); +- if (ret < 0) ++ if (ret < 0 && !p->skip_release_on_error) + btrfs_release_path(p); + return ret; + } +diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h +index d3511cc..3b39eb4 100644 +--- a/fs/btrfs/ctree.h ++++ b/fs/btrfs/ctree.h +@@ -608,6 +608,7 @@ struct btrfs_path { + unsigned int skip_locking:1; + unsigned int leave_spinning:1; + unsigned int search_commit_root:1; ++ unsigned int skip_release_on_error:1; + }; + + /* +@@ -3609,6 +3610,10 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans, + int verify_dir_item(struct btrfs_root *root, + struct extent_buffer *leaf, + struct btrfs_dir_item *dir_item); ++struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root, ++ struct btrfs_path *path, ++ const char *name, ++ int name_len); + + /* orphan.c */ + int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans, +diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c +index a0691df..9521a93 100644 +--- a/fs/btrfs/dir-item.c ++++ b/fs/btrfs/dir-item.c +@@ -21,10 +21,6 @@ + #include "hash.h" + #include "transaction.h" + +-static struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root, +- struct btrfs_path *path, +- const char *name, int name_len); +- + /* + * insert a name into a directory, doing overflow properly if there is a hash + * collision. data_size indicates how big the item inserted should be. On +@@ -383,9 +379,9 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans, + * this walks through all the entries in a dir item and finds one + * for a specific name. + */ +-static struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root, +- struct btrfs_path *path, +- const char *name, int name_len) ++struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root, ++ struct btrfs_path *path, ++ const char *name, int name_len) + { + struct btrfs_dir_item *dir_item; + unsigned long name_ptr; +diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c +index 488e987..618e86c 100644 +--- a/fs/btrfs/xattr.c ++++ b/fs/btrfs/xattr.c +@@ -29,6 +29,7 @@ + #include "xattr.h" + #include "disk-io.h" + #include "props.h" ++#include "locking.h" + + + ssize_t __btrfs_getxattr(struct inode *inode, const char *name, +@@ -91,7 +92,7 @@ static int do_setxattr(struct btrfs_trans_handle *trans, + struct inode *inode, const char *name, + const void *value, size_t size, int flags) + { +- struct btrfs_dir_item *di; ++ struct btrfs_dir_item *di = NULL; + struct btrfs_root *root = BTRFS_I(inode)->root; + struct btrfs_path *path; + size_t name_len = strlen(name); +@@ -103,84 +104,119 @@ static int do_setxattr(struct btrfs_trans_handle *trans, + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; ++ path->skip_release_on_error = 1; ++ ++ if (!value) { ++ di = btrfs_lookup_xattr(trans, root, path, btrfs_ino(inode), ++ name, name_len, -1); ++ if (!di && (flags & XATTR_REPLACE)) ++ ret = -ENODATA; ++ else if (di) ++ ret = btrfs_delete_one_dir_name(trans, root, path, di); ++ goto out; ++ } + ++ /* ++ * For a replace we can't just do the insert blindly. ++ * Do a lookup first (read-only btrfs_search_slot), and return if xattr ++ * doesn't exist. If it exists, fall down below to the insert/replace ++ * path - we can't race with a concurrent xattr delete, because the VFS ++ * locks the inode's i_mutex before calling setxattr or removexattr. ++ */ + if (flags & XATTR_REPLACE) { +- di = btrfs_lookup_xattr(trans, root, path, btrfs_ino(inode), name, +- name_len, -1); +- if (IS_ERR(di)) { +- ret = PTR_ERR(di); +- goto out; +- } else if (!di) { ++ ASSERT(mutex_is_locked(&inode->i_mutex)); ++ di = btrfs_lookup_xattr(NULL, root, path, btrfs_ino(inode), ++ name, name_len, 0); ++ if (!di) { + ret = -ENODATA; + goto out; + } +- ret = btrfs_delete_one_dir_name(trans, root, path, di); +- if (ret) +- goto out; + btrfs_release_path(path); ++ di = NULL; ++ } + ++ ret = btrfs_insert_xattr_item(trans, root, path, btrfs_ino(inode), ++ name, name_len, value, size); ++ if (ret == -EOVERFLOW) { + /* +- * remove the attribute ++ * We have an existing item in a leaf, split_leaf couldn't ++ * expand it. That item might have or not a dir_item that ++ * matches our target xattr, so lets check. + */ +- if (!value) +- goto out; +- } else { +- di = btrfs_lookup_xattr(NULL, root, path, btrfs_ino(inode), +- name, name_len, 0); +- if (IS_ERR(di)) { +- ret = PTR_ERR(di); ++ ret = 0; ++ btrfs_assert_tree_locked(path->nodes[0]); ++ di = btrfs_match_dir_item_name(root, path, name, name_len); ++ if (!di && !(flags & XATTR_REPLACE)) { ++ ret = -ENOSPC; + goto out; + } +- if (!di && !value) +- goto out; +- btrfs_release_path(path); ++ } else if (ret == -EEXIST) { ++ ret = 0; ++ di = btrfs_match_dir_item_name(root, path, name, name_len); ++ ASSERT(di); /* logic error */ ++ } else if (ret) { ++ goto out; + } + +-again: +- ret = btrfs_insert_xattr_item(trans, root, path, btrfs_ino(inode), +- name, name_len, value, size); +- /* +- * If we're setting an xattr to a new value but the new value is say +- * exactly BTRFS_MAX_XATTR_SIZE, we could end up with EOVERFLOW getting +- * back from split_leaf. This is because it thinks we'll be extending +- * the existing item size, but we're asking for enough space to add the +- * item itself. So if we get EOVERFLOW just set ret to EEXIST and let +- * the rest of the function figure it out. +- */ +- if (ret == -EOVERFLOW) ++ if (di && (flags & XATTR_CREATE)) { + ret = -EEXIST; ++ goto out; ++ } + +- if (ret == -EEXIST) { +- if (flags & XATTR_CREATE) +- goto out; ++ if (di) { + /* +- * We can't use the path we already have since we won't have the +- * proper locking for a delete, so release the path and +- * re-lookup to delete the thing. ++ * We're doing a replace, and it must be atomic, that is, at ++ * any point in time we have either the old or the new xattr ++ * value in the tree. We don't want readers (getxattr and ++ * listxattrs) to miss a value, this is specially important ++ * for ACLs. + */ +- btrfs_release_path(path); +- di = btrfs_lookup_xattr(trans, root, path, btrfs_ino(inode), +- name, name_len, -1); +- if (IS_ERR(di)) { +- ret = PTR_ERR(di); +- goto out; +- } else if (!di) { +- /* Shouldn't happen but just in case... */ +- btrfs_release_path(path); +- goto again; ++ const int slot = path->slots[0]; ++ struct extent_buffer *leaf = path->nodes[0]; ++ const u16 old_data_len = btrfs_dir_data_len(leaf, di); ++ const u32 item_size = btrfs_item_size_nr(leaf, slot); ++ const u32 data_size = sizeof(*di) + name_len + size; ++ struct btrfs_item *item; ++ unsigned long data_ptr; ++ char *ptr; ++ ++ if (size > old_data_len) { ++ if (btrfs_leaf_free_space(root, leaf) < ++ (size - old_data_len)) { ++ ret = -ENOSPC; ++ goto out; ++ } + } + +- ret = btrfs_delete_one_dir_name(trans, root, path, di); +- if (ret) +- goto out; ++ if (old_data_len + name_len + sizeof(*di) == item_size) { ++ /* No other xattrs packed in the same leaf item. */ ++ if (size > old_data_len) ++ btrfs_extend_item(root, path, ++ size - old_data_len); ++ else if (size < old_data_len) ++ btrfs_truncate_item(root, path, data_size, 1); ++ } else { ++ /* There are other xattrs packed in the same item. */ ++ ret = btrfs_delete_one_dir_name(trans, root, path, di); ++ if (ret) ++ goto out; ++ btrfs_extend_item(root, path, data_size); ++ } + ++ item = btrfs_item_nr(slot); ++ ptr = btrfs_item_ptr(leaf, slot, char); ++ ptr += btrfs_item_size(leaf, item) - data_size; ++ di = (struct btrfs_dir_item *)ptr; ++ btrfs_set_dir_data_len(leaf, di, size); ++ data_ptr = ((unsigned long)(di + 1)) + name_len; ++ write_extent_buffer(leaf, value, data_ptr, size); ++ btrfs_mark_buffer_dirty(leaf); ++ } else { + /* +- * We have a value to set, so go back and try to insert it now. ++ * Insert, and we had space for the xattr, so path->slots[0] is ++ * where our xattr dir_item is and btrfs_insert_xattr_item() ++ * filled it. + */ +- if (value) { +- btrfs_release_path(path); +- goto again; +- } + } + out: + btrfs_free_path(path); +diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c +index 7fe30f6..35f54bc 100644 +--- a/fs/ocfs2/file.c ++++ b/fs/ocfs2/file.c +@@ -2478,9 +2478,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, + struct address_space *mapping = out->f_mapping; + struct inode *inode = mapping->host; + struct splice_desc sd = { +- .total_len = len, + .flags = flags, +- .pos = *ppos, + .u.file = out, + }; + +@@ -2490,6 +2488,12 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, + out->f_path.dentry->d_name.len, + out->f_path.dentry->d_name.name, len); + ++ ret = generic_write_checks(out, ppos, &len, 0); ++ if (ret) ++ return ret; ++ sd.total_len = len; ++ sd.pos = *ppos; ++ + pipe_lock(pipe); + + splice_from_pipe_begin(&sd); +diff --git a/fs/splice.c b/fs/splice.c +index 12028fa..f345d53 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -1012,13 +1012,17 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, + struct address_space *mapping = out->f_mapping; + struct inode *inode = mapping->host; + struct splice_desc sd = { +- .total_len = len, + .flags = flags, +- .pos = *ppos, + .u.file = out, + }; + ssize_t ret; + ++ ret = generic_write_checks(out, ppos, &len, S_ISBLK(inode->i_mode)); ++ if (ret) ++ return ret; ++ sd.total_len = len; ++ sd.pos = *ppos; ++ + pipe_lock(pipe); + + splice_from_pipe_begin(&sd); +diff --git a/include/linux/mbus.h b/include/linux/mbus.h +index 345b8c5..550c88f 100644 +--- a/include/linux/mbus.h ++++ b/include/linux/mbus.h +@@ -73,6 +73,6 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size); + int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base, + size_t mbus_size, phys_addr_t sdram_phys_base, + size_t sdram_size); +-int mvebu_mbus_dt_init(void); ++int mvebu_mbus_dt_init(bool is_coherent); + + #endif /* __LINUX_MBUS_H */ +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index c68e5e0..99de240 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -855,7 +855,10 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, + + if (nla[NFTA_CHAIN_POLICY]) { + if ((chain != NULL && +- !(chain->flags & NFT_BASE_CHAIN)) || ++ !(chain->flags & NFT_BASE_CHAIN))) ++ return -EOPNOTSUPP; ++ ++ if (chain == NULL && + nla[NFTA_CHAIN_HOOK] == NULL) + return -EOPNOTSUPP; + +diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c +index 9e287cb..54330fb 100644 +--- a/net/netfilter/nfnetlink_cthelper.c ++++ b/net/netfilter/nfnetlink_cthelper.c +@@ -77,6 +77,9 @@ nfnl_cthelper_parse_tuple(struct nf_conntrack_tuple *tuple, + if (!tb[NFCTH_TUPLE_L3PROTONUM] || !tb[NFCTH_TUPLE_L4PROTONUM]) + return -EINVAL; + ++ /* Not all fields are initialized so first zero the tuple */ ++ memset(tuple, 0, sizeof(struct nf_conntrack_tuple)); ++ + tuple->src.l3num = ntohs(nla_get_be16(tb[NFCTH_TUPLE_L3PROTONUM])); + tuple->dst.protonum = nla_get_u8(tb[NFCTH_TUPLE_L4PROTONUM]); + +@@ -86,7 +89,7 @@ nfnl_cthelper_parse_tuple(struct nf_conntrack_tuple *tuple, + static int + nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct) + { +- const struct nf_conn_help *help = nfct_help(ct); ++ struct nf_conn_help *help = nfct_help(ct); + + if (attr == NULL) + return -EINVAL; +@@ -94,7 +97,7 @@ nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct) + if (help->helper->data_len == 0) + return -EINVAL; + +- memcpy(&help->data, nla_data(attr), help->helper->data_len); ++ memcpy(help->data, nla_data(attr), help->helper->data_len); + return 0; + } + +diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c +index 7350723..9695895 100644 +--- a/net/netfilter/nft_compat.c ++++ b/net/netfilter/nft_compat.c +@@ -82,6 +82,9 @@ nft_target_set_tgchk_param(struct xt_tgchk_param *par, + entry->e4.ip.invflags = inv ? IPT_INV_PROTO : 0; + break; + case AF_INET6: ++ if (proto) ++ entry->e6.ipv6.flags |= IP6T_F_PROTO; ++ + entry->e6.ipv6.proto = proto; + entry->e6.ipv6.invflags = inv ? IP6T_INV_PROTO : 0; + break; +@@ -313,6 +316,9 @@ nft_match_set_mtchk_param(struct xt_mtchk_param *par, const struct nft_ctx *ctx, + entry->e4.ip.invflags = inv ? IPT_INV_PROTO : 0; + break; + case AF_INET6: ++ if (proto) ++ entry->e6.ipv6.flags |= IP6T_F_PROTO; ++ + entry->e6.ipv6.proto = proto; + entry->e6.ipv6.invflags = inv ? IP6T_INV_PROTO : 0; + break; +diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c +index 1316e55..c324a52 100644 +--- a/virt/kvm/arm/vgic.c ++++ b/virt/kvm/arm/vgic.c +@@ -674,7 +674,7 @@ static bool read_set_clear_sgi_pend_reg(struct kvm_vcpu *vcpu, + { + struct vgic_dist *dist = &vcpu->kvm->arch.vgic; + int sgi; +- int min_sgi = (offset & ~0x3) * 4; ++ int min_sgi = (offset & ~0x3); + int max_sgi = min_sgi + 3; + int vcpu_id = vcpu->vcpu_id; + u32 reg = 0; +@@ -695,7 +695,7 @@ static bool write_set_clear_sgi_pend_reg(struct kvm_vcpu *vcpu, + { + struct vgic_dist *dist = &vcpu->kvm->arch.vgic; + int sgi; +- int min_sgi = (offset & ~0x3) * 4; ++ int min_sgi = (offset & ~0x3); + int max_sgi = min_sgi + 3; + int vcpu_id = vcpu->vcpu_id; + u32 reg; +@@ -1387,7 +1387,8 @@ out: + int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, + bool level) + { +- if (vgic_update_irq_state(kvm, cpuid, irq_num, level)) ++ if (likely(vgic_initialized(kvm)) && ++ vgic_update_irq_state(kvm, cpuid, irq_num, level)) + vgic_kick_vcpus(kvm); + + return 0; +@@ -1610,7 +1611,7 @@ out: + + int kvm_vgic_create(struct kvm *kvm) + { +- int i, vcpu_lock_idx = -1, ret = 0; ++ int i, vcpu_lock_idx = -1, ret; + struct kvm_vcpu *vcpu; + + mutex_lock(&kvm->lock); +@@ -1625,6 +1626,7 @@ int kvm_vgic_create(struct kvm *kvm) + * vcpu->mutex. By grabbing the vcpu->mutex of all VCPUs we ensure + * that no other VCPUs are run while we create the vgic. + */ ++ ret = -EBUSY; + kvm_for_each_vcpu(i, vcpu, kvm) { + if (!mutex_trylock(&vcpu->mutex)) + goto out_unlock; +@@ -1632,11 +1634,10 @@ int kvm_vgic_create(struct kvm *kvm) + } + + kvm_for_each_vcpu(i, vcpu, kvm) { +- if (vcpu->arch.has_run_once) { +- ret = -EBUSY; ++ if (vcpu->arch.has_run_once) + goto out_unlock; +- } + } ++ ret = 0; + + spin_lock_init(&kvm->arch.vgic.lock); + kvm->arch.vgic.vctrl_base = vgic_vctrl_base; diff --git a/3.14.46/4420_grsecurity-3.1-3.14.46-201506300711.patch b/3.14.47/4420_grsecurity-3.1-3.14.47-201507050832.patch similarity index 99% rename from 3.14.46/4420_grsecurity-3.1-3.14.46-201506300711.patch rename to 3.14.47/4420_grsecurity-3.1-3.14.47-201507050832.patch index 008971f..f646996 100644 --- a/3.14.46/4420_grsecurity-3.1-3.14.46-201506300711.patch +++ b/3.14.47/4420_grsecurity-3.1-3.14.47-201507050832.patch @@ -295,7 +295,7 @@ index 5d91ba1..ef1d374 100644 pcd. [PARIDE] diff --git a/Makefile b/Makefile -index def39fd..4636aea 100644 +index f9041e6..46bcf1d 100644 --- a/Makefile +++ b/Makefile @@ -244,8 +244,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ @@ -3307,7 +3307,7 @@ index 7bcee5c..e2f3249 100644 __data_loc = .; #endif diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c -index df6e75e..1858aa0 100644 +index 2e74a61..14d0a66 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -57,7 +57,7 @@ static unsigned long hyp_default_vectors; @@ -3319,7 +3319,7 @@ index df6e75e..1858aa0 100644 static u8 kvm_next_vmid; static DEFINE_SPINLOCK(kvm_vmid_lock); -@@ -371,7 +371,7 @@ void force_vm_exit(const cpumask_t *mask) +@@ -376,7 +376,7 @@ void force_vm_exit(const cpumask_t *mask) */ static bool need_new_vmid_gen(struct kvm *kvm) { @@ -3328,7 +3328,7 @@ index df6e75e..1858aa0 100644 } /** -@@ -404,7 +404,7 @@ static void update_vttbr(struct kvm *kvm) +@@ -409,7 +409,7 @@ static void update_vttbr(struct kvm *kvm) /* First user of a new VMID generation? */ if (unlikely(kvm_next_vmid == 0)) { @@ -3337,7 +3337,7 @@ index df6e75e..1858aa0 100644 kvm_next_vmid = 1; /* -@@ -421,7 +421,7 @@ static void update_vttbr(struct kvm *kvm) +@@ -426,7 +426,7 @@ static void update_vttbr(struct kvm *kvm) kvm_call_hyp(__kvm_flush_vm_context); } @@ -3346,7 +3346,7 @@ index df6e75e..1858aa0 100644 kvm->arch.vmid = kvm_next_vmid; kvm_next_vmid++; -@@ -996,7 +996,7 @@ static void check_kvm_target_cpu(void *ret) +@@ -1013,7 +1013,7 @@ static void check_kvm_target_cpu(void *ret) /** * Initialize Hyp-mode and memory mappings on all CPUs. */ @@ -12396,7 +12396,7 @@ index ad8f795..2c7eec6 100644 /* * Memory returned by kmalloc() may be used for DMA, so we must make diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index 2f645c9..7e2933c 100644 +index 5dab54a..a20467d 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -22,6 +22,7 @@ config X86_64 @@ -21769,15 +21769,13 @@ index a276fa7..3ef18f0 100644 static void microcode_fini_cpu(int cpu) diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c -index 18f7391..8c5225d 100644 +index 43a07bf..8c5225d 100644 --- a/arch/x86/kernel/cpu/microcode/intel_early.c +++ b/arch/x86/kernel/cpu/microcode/intel_early.c -@@ -321,7 +321,11 @@ get_matching_model_microcode(int cpu, unsigned long start, - unsigned int mc_saved_count = mc_saved_data->mc_saved_count; +@@ -322,6 +322,10 @@ get_matching_model_microcode(int cpu, unsigned long start, int i; -- while (leftover) { -+ while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) { + while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) { + + if (leftover < sizeof(mc_header)) + break; @@ -25816,7 +25814,7 @@ index 7ec1d5f..5a7d130 100644 } diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c -index a1f5b18..9d9e077 100644 +index 490fee1..d7eb482 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c @@ -119,9 +119,12 @@ static void __kprobes __synthesize_relative_insn(void *from, void *to, u8 op) @@ -25854,17 +25852,17 @@ index a1f5b18..9d9e077 100644 } /* -@@ -332,7 +335,9 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) +@@ -335,7 +338,9 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) /* Another subsystem puts a breakpoint, failed to recover */ if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION) return 0; + pax_open_kernel(); - memcpy(dest, insn.kaddr, insn.length); + memcpy(dest, insn.kaddr, length); + pax_close_kernel(); #ifdef CONFIG_X86_64 if (insn_rip_relative(&insn)) { -@@ -359,7 +364,9 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) +@@ -362,7 +367,9 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) return 0; } disp = (u8 *) dest + insn_offset_displacement(&insn); @@ -25873,8 +25871,8 @@ index a1f5b18..9d9e077 100644 + pax_close_kernel(); } #endif - return insn.length; -@@ -498,7 +505,7 @@ setup_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *k + return length; +@@ -501,7 +508,7 @@ setup_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *k * nor set current_kprobe, because it doesn't use single * stepping. */ @@ -25883,7 +25881,7 @@ index a1f5b18..9d9e077 100644 preempt_enable_no_resched(); return; } -@@ -515,9 +522,9 @@ setup_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *k +@@ -518,9 +525,9 @@ setup_singlestep(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *k regs->flags &= ~X86_EFLAGS_IF; /* single step inline if the instruction is an int3 */ if (p->opcode == BREAKPOINT_INSTRUCTION) @@ -25895,7 +25893,7 @@ index a1f5b18..9d9e077 100644 } /* -@@ -596,7 +603,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) +@@ -599,7 +606,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) setup_singlestep(p, regs, kcb, 0); return 1; } @@ -25904,7 +25902,7 @@ index a1f5b18..9d9e077 100644 /* * The breakpoint instruction was removed right * after we hit it. Another cpu has removed -@@ -642,6 +649,9 @@ static void __used __kprobes kretprobe_trampoline_holder(void) +@@ -645,6 +652,9 @@ static void __used __kprobes kretprobe_trampoline_holder(void) " movq %rax, 152(%rsp)\n" RESTORE_REGS_STRING " popfq\n" @@ -25914,7 +25912,7 @@ index a1f5b18..9d9e077 100644 #else " pushf\n" SAVE_REGS_STRING -@@ -779,7 +789,7 @@ static void __kprobes +@@ -782,7 +792,7 @@ static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb) { unsigned long *tos = stack_addr(regs); @@ -25923,7 +25921,7 @@ index a1f5b18..9d9e077 100644 unsigned long orig_ip = (unsigned long)p->addr; kprobe_opcode_t *insn = p->ainsn.insn; -@@ -961,7 +971,7 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d +@@ -964,7 +974,7 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d struct die_args *args = data; int ret = NOTIFY_DONE; @@ -28893,10 +28891,10 @@ index cba218a..1cc1bed 100644 goto error; walker->ptep_user[walker->level - 1] = ptep_user; diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c -index 9643eda6..c9cb765 100644 +index 0746334..f6c04e8 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c -@@ -3508,7 +3508,11 @@ static void reload_tss(struct kvm_vcpu *vcpu) +@@ -3510,7 +3510,11 @@ static void reload_tss(struct kvm_vcpu *vcpu) int cpu = raw_smp_processor_id(); struct svm_cpu_data *sd = per_cpu(svm_data, cpu); @@ -28908,7 +28906,7 @@ index 9643eda6..c9cb765 100644 load_TR_desc(); } -@@ -3911,6 +3915,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) +@@ -3913,6 +3917,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) #endif #endif @@ -51585,7 +51583,7 @@ index f28ea07..34b16d3 100644 /* These three are default values which can be overridden */ diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c -index 528bff5..84963854 100644 +index 85d370e..7374c8c 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -571,7 +571,7 @@ static inline u32 next_command(struct ctlr_info *h, u8 q) @@ -51636,7 +51634,7 @@ index 528bff5..84963854 100644 (h->interrupts_enabled == 0); } -@@ -4442,7 +4442,7 @@ static int hpsa_pci_init(struct ctlr_info *h) +@@ -4433,7 +4433,7 @@ static int hpsa_pci_init(struct ctlr_info *h) if (prod_index < 0) return -ENODEV; h->product_name = products[prod_index].product_name; @@ -51645,7 +51643,7 @@ index 528bff5..84963854 100644 pci_disable_link_state(h->pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM); -@@ -4712,7 +4712,7 @@ static void controller_lockup_detected(struct ctlr_info *h) +@@ -4726,7 +4726,7 @@ static void controller_lockup_detected(struct ctlr_info *h) { unsigned long flags; @@ -51654,7 +51652,7 @@ index 528bff5..84963854 100644 spin_lock_irqsave(&h->lock, flags); h->lockup_detected = readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); spin_unlock_irqrestore(&h->lock, flags); -@@ -4843,7 +4843,7 @@ reinit_after_soft_reset: +@@ -4857,7 +4857,7 @@ reinit_after_soft_reset: } /* make sure the board interrupts are off */ @@ -51663,7 +51661,7 @@ index 528bff5..84963854 100644 if (hpsa_request_irq(h, do_hpsa_intr_msi, do_hpsa_intr_intx)) goto clean2; -@@ -4877,7 +4877,7 @@ reinit_after_soft_reset: +@@ -4891,7 +4891,7 @@ reinit_after_soft_reset: * fake ones to scoop up any residual completions. */ spin_lock_irqsave(&h->lock, flags); @@ -51672,7 +51670,7 @@ index 528bff5..84963854 100644 spin_unlock_irqrestore(&h->lock, flags); free_irqs(h); rc = hpsa_request_irq(h, hpsa_msix_discard_completions, -@@ -4896,9 +4896,9 @@ reinit_after_soft_reset: +@@ -4910,9 +4910,9 @@ reinit_after_soft_reset: dev_info(&h->pdev->dev, "Board READY.\n"); dev_info(&h->pdev->dev, "Waiting for stale completions to drain.\n"); @@ -51684,7 +51682,7 @@ index 528bff5..84963854 100644 rc = controller_reset_failed(h->cfgtable); if (rc) -@@ -4919,7 +4919,7 @@ reinit_after_soft_reset: +@@ -4933,7 +4933,7 @@ reinit_after_soft_reset: } /* Turn the interrupts on so we can service requests */ @@ -51693,7 +51691,7 @@ index 528bff5..84963854 100644 hpsa_hba_inquiry(h); hpsa_register_scsi(h); /* hook ourselves into SCSI subsystem */ -@@ -4988,7 +4988,7 @@ static void hpsa_shutdown(struct pci_dev *pdev) +@@ -5002,7 +5002,7 @@ static void hpsa_shutdown(struct pci_dev *pdev) * To write all data in the battery backed cache to disks */ hpsa_flush_cache(h); @@ -51702,7 +51700,7 @@ index 528bff5..84963854 100644 hpsa_free_irqs_and_disable_msix(h); } -@@ -5162,7 +5162,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 use_short_tags) +@@ -5176,7 +5176,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 use_short_tags) return; } /* Change the access methods to the performant access methods */ @@ -55240,6 +55238,19 @@ index 8cfc319..4868255 100644 return 0; } +diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c +index 3740a3f..466ec15 100644 +--- a/drivers/usb/gadget/configfs.c ++++ b/drivers/usb/gadget/configfs.c +@@ -560,7 +560,7 @@ static struct config_group *function_make( + if (IS_ERR(fi)) + return ERR_CAST(fi); + +- ret = config_item_set_name(&fi->group.cg_item, name); ++ ret = config_item_set_name(&fi->group.cg_item, "%s", name); + if (ret) { + usb_put_function_instance(fi); + return ERR_PTR(ret); diff --git a/drivers/usb/gadget/f_uac1.c b/drivers/usb/gadget/f_uac1.c index 2b4c82d..06a8ee6 100644 --- a/drivers/usb/gadget/f_uac1.c @@ -66906,7 +66917,7 @@ index 1e86823..8e34695 100644 else if (whole->bd_holder != NULL) return false; /* is a partition of a held device */ diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c -index 93de3ba..0e1cf23 100644 +index f8ffee4..b82e697 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -1216,9 +1216,12 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, @@ -67968,6 +67979,28 @@ index e081acb..911df21 100644 /* * We'll have a dentry and an inode for +diff --git a/fs/configfs/item.c b/fs/configfs/item.c +index 50cee7f..8238ebd 100644 +--- a/fs/configfs/item.c ++++ b/fs/configfs/item.c +@@ -116,7 +116,7 @@ void config_item_init_type_name(struct config_item *item, + const char *name, + struct config_item_type *type) + { +- config_item_set_name(item, name); ++ config_item_set_name(item, "%s", name); + item->ci_type = type; + config_item_init(item); + } +@@ -125,7 +125,7 @@ EXPORT_SYMBOL(config_item_init_type_name); + void config_group_init_type_name(struct config_group *group, const char *name, + struct config_item_type *type) + { +- config_item_set_name(&group->cg_item, name); ++ config_item_set_name(&group->cg_item, "%s", name); + group->cg_item.ci_type = type; + config_group_init(group); + } diff --git a/fs/coredump.c b/fs/coredump.c index a93f7e6..d58bcbe 100644 --- a/fs/coredump.c @@ -75409,7 +75442,7 @@ index 1d641bb..9ca7f61 100644 { const struct seq_operations *op = ((struct seq_file *)file->private_data)->op; diff --git a/fs/splice.c b/fs/splice.c -index 12028fa..2cde9b2 100644 +index f345d53..f6e7484 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -196,7 +196,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, @@ -75491,7 +75524,7 @@ index 12028fa..2cde9b2 100644 return 0; if (sd->flags & SPLICE_F_NONBLOCK) -@@ -1171,7 +1171,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, +@@ -1175,7 +1175,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, long ret, bytes; umode_t i_mode; size_t len; @@ -75500,7 +75533,7 @@ index 12028fa..2cde9b2 100644 /* * We require the input being a regular file, as we don't want to -@@ -1197,7 +1197,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, +@@ -1201,7 +1201,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, * out of the pipe right after the splice_to_pipe(). So set * PIPE_READERS appropriately. */ @@ -75509,7 +75542,7 @@ index 12028fa..2cde9b2 100644 current->splice_pipe = pipe; } -@@ -1214,6 +1214,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, +@@ -1218,6 +1218,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, * Don't block on output, we have to drain the direct pipe. */ sd->flags &= ~SPLICE_F_NONBLOCK; @@ -75517,7 +75550,7 @@ index 12028fa..2cde9b2 100644 while (len) { size_t read_len; -@@ -1227,6 +1228,15 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, +@@ -1231,6 +1232,15 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, sd->total_len = read_len; /* @@ -75533,7 +75566,7 @@ index 12028fa..2cde9b2 100644 * NOTE: nonblocking mode only applies to the input. We * must not do the output in nonblocking mode as then we * could get stuck data in the internal pipe: -@@ -1493,6 +1503,7 @@ static int get_iovec_page_array(const struct iovec __user *iov, +@@ -1497,6 +1507,7 @@ static int get_iovec_page_array(const struct iovec __user *iov, partial[buffers].offset = off; partial[buffers].len = plen; @@ -75541,7 +75574,7 @@ index 12028fa..2cde9b2 100644 off = 0; len -= plen; -@@ -1795,9 +1806,9 @@ static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) +@@ -1799,9 +1810,9 @@ static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) ret = -ERESTARTSYS; break; } @@ -75553,7 +75586,7 @@ index 12028fa..2cde9b2 100644 if (flags & SPLICE_F_NONBLOCK) { ret = -EAGAIN; break; -@@ -1829,7 +1840,7 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) +@@ -1833,7 +1844,7 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) pipe_lock(pipe); while (pipe->nrbufs >= pipe->buffers) { @@ -75562,7 +75595,7 @@ index 12028fa..2cde9b2 100644 send_sig(SIGPIPE, current, 0); ret = -EPIPE; break; -@@ -1842,9 +1853,9 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) +@@ -1846,9 +1857,9 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) ret = -ERESTARTSYS; break; } @@ -75574,7 +75607,7 @@ index 12028fa..2cde9b2 100644 } pipe_unlock(pipe); -@@ -1880,14 +1891,14 @@ retry: +@@ -1884,14 +1895,14 @@ retry: pipe_double_lock(ipipe, opipe); do { @@ -75591,7 +75624,7 @@ index 12028fa..2cde9b2 100644 break; /* -@@ -1984,7 +1995,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, +@@ -1988,7 +1999,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, pipe_double_lock(ipipe, opipe); do { @@ -75600,7 +75633,7 @@ index 12028fa..2cde9b2 100644 send_sig(SIGPIPE, current, 0); if (!ret) ret = -EPIPE; -@@ -2029,7 +2040,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, +@@ -2033,7 +2044,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, * return EAGAIN if we have the potential of some data in the * future, otherwise just return 0 */ @@ -81750,7 +81783,7 @@ index 0000000..4c7e00a +} diff --git a/grsecurity/gracl_ip.c b/grsecurity/gracl_ip.c new file mode 100644 -index 0000000..f056b81 +index 0000000..ed6ee43 --- /dev/null +++ b/grsecurity/gracl_ip.c @@ -0,0 +1,386 @@ @@ -81824,7 +81857,7 @@ index 0000000..f056b81 + "unspec", "unix", "inet", "ax25", "ipx", "appletalk", "netrom", "bridge", "atmpvc", "x25", + "inet6", "rose", "decnet", "netbeui", "security", "key", "netlink", "packet", "ash", + "econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "fam_27", "fam_28", -+ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf" ++ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf", "alg", "nfc", "vsock" + }; + +const char * @@ -89322,9 +89355,18 @@ index 5d5aaae..0ea9b84 100644 extern bool completion_done(struct completion *x); diff --git a/include/linux/configfs.h b/include/linux/configfs.h -index 34025df..d94bbbc 100644 +index 34025df..2a6ee32 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h +@@ -64,7 +64,7 @@ struct config_item { + struct dentry *ci_dentry; + }; + +-extern int config_item_set_name(struct config_item *, const char *, ...); ++extern __printf(2, 3) int config_item_set_name(struct config_item *, const char *, ...); + + static inline char *config_item_name(struct config_item * item) + { @@ -125,7 +125,7 @@ struct configfs_attribute { const char *ca_name; struct module *ca_owner; @@ -114514,7 +114556,7 @@ index f042ae5..30ea486 100644 } EXPORT_SYMBOL(nf_unregister_sockopt); diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c -index c68e5e0..3bed3f0 100644 +index 99de240..539632e 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -152,8 +152,8 @@ nf_tables_chain_type_lookup(const struct nft_af_info *afi, @@ -114576,10 +114618,10 @@ index 108120f..5b169db 100644 queued = 0; err = 0; diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c -index 7350723..af7fa0d 100644 +index 9695895..f0a05e6 100644 --- a/net/netfilter/nft_compat.c +++ b/net/netfilter/nft_compat.c -@@ -216,7 +216,7 @@ target_dump_info(struct sk_buff *skb, const struct xt_target *t, const void *in) +@@ -219,7 +219,7 @@ target_dump_info(struct sk_buff *skb, const struct xt_target *t, const void *in) /* We want to reuse existing compat_to_user */ old_fs = get_fs(); set_fs(KERNEL_DS); @@ -114588,7 +114630,7 @@ index 7350723..af7fa0d 100644 set_fs(old_fs); ret = nla_put(skb, NFTA_TARGET_INFO, XT_ALIGN(t->targetsize), out); kfree(out); -@@ -283,14 +283,7 @@ static void nft_match_eval(const struct nft_expr *expr, +@@ -286,14 +286,7 @@ static void nft_match_eval(const struct nft_expr *expr, return; } @@ -114604,7 +114646,7 @@ index 7350723..af7fa0d 100644 } static const struct nla_policy nft_match_policy[NFTA_MATCH_MAX + 1] = { -@@ -403,7 +396,7 @@ match_dump_info(struct sk_buff *skb, const struct xt_match *m, const void *in) +@@ -409,7 +402,7 @@ match_dump_info(struct sk_buff *skb, const struct xt_match *m, const void *in) /* We want to reuse existing compat_to_user */ old_fs = get_fs(); set_fs(KERNEL_DS); diff --git a/3.14.46/4425_grsec_remove_EI_PAX.patch b/3.14.47/4425_grsec_remove_EI_PAX.patch similarity index 100% rename from 3.14.46/4425_grsec_remove_EI_PAX.patch rename to 3.14.47/4425_grsec_remove_EI_PAX.patch diff --git a/3.14.46/4427_force_XATTR_PAX_tmpfs.patch b/3.14.47/4427_force_XATTR_PAX_tmpfs.patch similarity index 100% rename from 3.14.46/4427_force_XATTR_PAX_tmpfs.patch rename to 3.14.47/4427_force_XATTR_PAX_tmpfs.patch diff --git a/3.14.46/4430_grsec-remove-localversion-grsec.patch b/3.14.47/4430_grsec-remove-localversion-grsec.patch similarity index 100% rename from 3.14.46/4430_grsec-remove-localversion-grsec.patch rename to 3.14.47/4430_grsec-remove-localversion-grsec.patch diff --git a/3.14.46/4435_grsec-mute-warnings.patch b/3.14.47/4435_grsec-mute-warnings.patch similarity index 100% rename from 3.14.46/4435_grsec-mute-warnings.patch rename to 3.14.47/4435_grsec-mute-warnings.patch diff --git a/3.14.46/4440_grsec-remove-protected-paths.patch b/3.14.47/4440_grsec-remove-protected-paths.patch similarity index 100% rename from 3.14.46/4440_grsec-remove-protected-paths.patch rename to 3.14.47/4440_grsec-remove-protected-paths.patch diff --git a/3.14.46/4450_grsec-kconfig-default-gids.patch b/3.14.47/4450_grsec-kconfig-default-gids.patch similarity index 100% rename from 3.14.46/4450_grsec-kconfig-default-gids.patch rename to 3.14.47/4450_grsec-kconfig-default-gids.patch diff --git a/3.14.46/4465_selinux-avc_audit-log-curr_ip.patch b/3.14.47/4465_selinux-avc_audit-log-curr_ip.patch similarity index 100% rename from 3.14.46/4465_selinux-avc_audit-log-curr_ip.patch rename to 3.14.47/4465_selinux-avc_audit-log-curr_ip.patch diff --git a/3.14.46/4470_disable-compat_vdso.patch b/3.14.47/4470_disable-compat_vdso.patch similarity index 100% rename from 3.14.46/4470_disable-compat_vdso.patch rename to 3.14.47/4470_disable-compat_vdso.patch diff --git a/3.14.46/4475_emutramp_default_on.patch b/3.14.47/4475_emutramp_default_on.patch similarity index 100% rename from 3.14.46/4475_emutramp_default_on.patch rename to 3.14.47/4475_emutramp_default_on.patch diff --git a/3.2.69/0000_README b/3.2.69/0000_README index d006716..6773701 100644 --- a/3.2.69/0000_README +++ b/3.2.69/0000_README @@ -194,7 +194,7 @@ Patch: 1068_linux-3.2.69.patch From: http://www.kernel.org Desc: Linux 3.2.69 -Patch: 4420_grsecurity-3.1-3.2.69-201506300708.patch +Patch: 4420_grsecurity-3.1-3.2.69-201507050830.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.2.69/4420_grsecurity-3.1-3.2.69-201506300708.patch b/3.2.69/4420_grsecurity-3.1-3.2.69-201507050830.patch similarity index 99% rename from 3.2.69/4420_grsecurity-3.1-3.2.69-201506300708.patch rename to 3.2.69/4420_grsecurity-3.1-3.2.69-201507050830.patch index e8aabfa..57ddd0b 100644 --- a/3.2.69/4420_grsecurity-3.1-3.2.69-201506300708.patch +++ b/3.2.69/4420_grsecurity-3.1-3.2.69-201507050830.patch @@ -59119,6 +59119,28 @@ index 5ef72c8..0c72810 100644 /* * We'll have a dentry and an inode for +diff --git a/fs/configfs/item.c b/fs/configfs/item.c +index 50cee7f..8238ebd 100644 +--- a/fs/configfs/item.c ++++ b/fs/configfs/item.c +@@ -116,7 +116,7 @@ void config_item_init_type_name(struct config_item *item, + const char *name, + struct config_item_type *type) + { +- config_item_set_name(item, name); ++ config_item_set_name(item, "%s", name); + item->ci_type = type; + config_item_init(item); + } +@@ -125,7 +125,7 @@ EXPORT_SYMBOL(config_item_init_type_name); + void config_group_init_type_name(struct config_group *group, const char *name, + struct config_item_type *type) + { +- config_item_set_name(&group->cg_item, name); ++ config_item_set_name(&group->cg_item, "%s", name); + group->cg_item.ci_type = type; + config_group_init(group); + } diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c index 276e15c..aeac324 100644 --- a/fs/configfs/mount.c @@ -73326,7 +73348,7 @@ index 0000000..b916759 +} diff --git a/grsecurity/gracl_ip.c b/grsecurity/gracl_ip.c new file mode 100644 -index 0000000..35f8064 +index 0000000..e0bbcf4 --- /dev/null +++ b/grsecurity/gracl_ip.c @@ -0,0 +1,386 @@ @@ -73400,7 +73422,7 @@ index 0000000..35f8064 + "unspec", "unix", "inet", "ax25", "ipx", "appletalk", "netrom", "bridge", "atmpvc", "x25", + "inet6", "rose", "decnet", "netbeui", "security", "key", "netlink", "packet", "ash", + "econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "fam_27", "fam_28", -+ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf" ++ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf", "alg", "nfc" + }; + +const char * @@ -81044,9 +81066,18 @@ index 51494e6..340575ab 100644 extern bool completion_done(struct completion *x); diff --git a/include/linux/configfs.h b/include/linux/configfs.h -index 3081c58..7714c00 100644 +index 3081c58..5a0b545 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h +@@ -64,7 +64,7 @@ struct config_item { + struct dentry *ci_dentry; + }; + +-extern int config_item_set_name(struct config_item *, const char *, ...); ++extern __printf(2, 3) int config_item_set_name(struct config_item *, const char *, ...); + + static inline char *config_item_name(struct config_item * item) + { @@ -125,7 +125,7 @@ struct configfs_attribute { const char *ca_name; struct module *ca_owner; diff --git a/4.0.7/0000_README b/4.0.7/0000_README index 1c85007..fc634e5 100644 --- a/4.0.7/0000_README +++ b/4.0.7/0000_README @@ -2,11 +2,7 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 1006_linux-4.0.7.patch -From: http://www.kernel.org -Desc: Linux 4.0.7 - -Patch: 4420_grsecurity-3.1-4.0.7-201506300712.patch +Patch: 4420_grsecurity-3.1-4.0.7-201507050833.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/4.0.7/1006_linux-4.0.7.patch b/4.0.7/1006_linux-4.0.7.patch deleted file mode 100644 index 0b9b646..0000000 --- a/4.0.7/1006_linux-4.0.7.patch +++ /dev/null @@ -1,707 +0,0 @@ -diff --git a/Makefile b/Makefile -index af6da04..bd76a8e 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 4 - PATCHLEVEL = 0 --SUBLEVEL = 6 -+SUBLEVEL = 7 - EXTRAVERSION = - NAME = Hurr durr I'ma sheep - -diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h -index f70eca7..0ef8d4b 100644 ---- a/arch/arm/mach-exynos/common.h -+++ b/arch/arm/mach-exynos/common.h -@@ -153,6 +153,8 @@ extern void exynos_enter_aftr(void); - - extern struct cpuidle_exynos_data cpuidle_coupled_exynos_data; - -+extern void exynos_set_delayed_reset_assertion(bool enable); -+ - extern void s5p_init_cpu(void __iomem *cpuid_addr); - extern unsigned int samsung_rev(void); - extern void __iomem *cpu_boot_reg_base(void); -diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c -index 9e9dfdf..1081ff1 100644 ---- a/arch/arm/mach-exynos/exynos.c -+++ b/arch/arm/mach-exynos/exynos.c -@@ -166,6 +166,33 @@ static void __init exynos_init_io(void) - exynos_map_io(); - } - -+/* -+ * Set or clear the USE_DELAYED_RESET_ASSERTION option. Used by smp code -+ * and suspend. -+ * -+ * This is necessary only on Exynos4 SoCs. When system is running -+ * USE_DELAYED_RESET_ASSERTION should be set so the ARM CLK clock down -+ * feature could properly detect global idle state when secondary CPU is -+ * powered down. -+ * -+ * However this should not be set when such system is going into suspend. -+ */ -+void exynos_set_delayed_reset_assertion(bool enable) -+{ -+ if (soc_is_exynos4()) { -+ unsigned int tmp, core_id; -+ -+ for (core_id = 0; core_id < num_possible_cpus(); core_id++) { -+ tmp = pmu_raw_readl(EXYNOS_ARM_CORE_OPTION(core_id)); -+ if (enable) -+ tmp |= S5P_USE_DELAYED_RESET_ASSERTION; -+ else -+ tmp &= ~(S5P_USE_DELAYED_RESET_ASSERTION); -+ pmu_raw_writel(tmp, EXYNOS_ARM_CORE_OPTION(core_id)); -+ } -+ } -+} -+ - static const struct of_device_id exynos_dt_pmu_match[] = { - { .compatible = "samsung,exynos3250-pmu" }, - { .compatible = "samsung,exynos4210-pmu" }, -diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c -index d2e9f12..d45e8cd 100644 ---- a/arch/arm/mach-exynos/platsmp.c -+++ b/arch/arm/mach-exynos/platsmp.c -@@ -34,30 +34,6 @@ - - extern void exynos4_secondary_startup(void); - --/* -- * Set or clear the USE_DELAYED_RESET_ASSERTION option, set on Exynos4 SoCs -- * during hot-(un)plugging CPUx. -- * -- * The feature can be cleared safely during first boot of secondary CPU. -- * -- * Exynos4 SoCs require setting USE_DELAYED_RESET_ASSERTION during powering -- * down a CPU so the CPU idle clock down feature could properly detect global -- * idle state when CPUx is off. -- */ --static void exynos_set_delayed_reset_assertion(u32 core_id, bool enable) --{ -- if (soc_is_exynos4()) { -- unsigned int tmp; -- -- tmp = pmu_raw_readl(EXYNOS_ARM_CORE_OPTION(core_id)); -- if (enable) -- tmp |= S5P_USE_DELAYED_RESET_ASSERTION; -- else -- tmp &= ~(S5P_USE_DELAYED_RESET_ASSERTION); -- pmu_raw_writel(tmp, EXYNOS_ARM_CORE_OPTION(core_id)); -- } --} -- - #ifdef CONFIG_HOTPLUG_CPU - static inline void cpu_leave_lowpower(u32 core_id) - { -@@ -73,8 +49,6 @@ static inline void cpu_leave_lowpower(u32 core_id) - : "=&r" (v) - : "Ir" (CR_C), "Ir" (0x40) - : "cc"); -- -- exynos_set_delayed_reset_assertion(core_id, false); - } - - static inline void platform_do_lowpower(unsigned int cpu, int *spurious) -@@ -87,14 +61,6 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious) - /* Turn the CPU off on next WFI instruction. */ - exynos_cpu_power_down(core_id); - -- /* -- * Exynos4 SoCs require setting -- * USE_DELAYED_RESET_ASSERTION so the CPU idle -- * clock down feature could properly detect -- * global idle state when CPUx is off. -- */ -- exynos_set_delayed_reset_assertion(core_id, true); -- - wfi(); - - if (pen_release == core_id) { -@@ -354,9 +320,6 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) - udelay(10); - } - -- /* No harm if this is called during first boot of secondary CPU */ -- exynos_set_delayed_reset_assertion(core_id, false); -- - /* - * now the secondary core is starting up let it run its - * calibrations, then wait for it to finish -@@ -403,6 +366,8 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) - - exynos_sysram_init(); - -+ exynos_set_delayed_reset_assertion(true); -+ - if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) - scu_enable(scu_base_addr()); - -diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c -index 318d127..582ef2d 100644 ---- a/arch/arm/mach-exynos/suspend.c -+++ b/arch/arm/mach-exynos/suspend.c -@@ -235,6 +235,8 @@ static void exynos_pm_enter_sleep_mode(void) - - static void exynos_pm_prepare(void) - { -+ exynos_set_delayed_reset_assertion(false); -+ - /* Set wake-up mask registers */ - exynos_pm_set_wakeup_mask(); - -@@ -383,6 +385,7 @@ early_wakeup: - - /* Clear SLEEP mode set in INFORM1 */ - pmu_raw_writel(0x0, S5P_INFORM1); -+ exynos_set_delayed_reset_assertion(true); - } - - static void exynos3250_pm_resume(void) -diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S -index 05adc8b..401d8d0 100644 ---- a/arch/powerpc/kernel/idle_power7.S -+++ b/arch/powerpc/kernel/idle_power7.S -@@ -500,9 +500,11 @@ BEGIN_FTR_SECTION - CHECK_HMI_INTERRUPT - END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) - ld r1,PACAR1(r13) -+ ld r6,_CCR(r1) - ld r4,_MSR(r1) - ld r5,_NIP(r1) - addi r1,r1,INT_FRAME_SIZE -+ mtcr r6 - mtspr SPRN_SRR1,r4 - mtspr SPRN_SRR0,r5 - rfid -diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c -index 4e3d5a9..03189d8 100644 ---- a/arch/x86/kernel/kprobes/core.c -+++ b/arch/x86/kernel/kprobes/core.c -@@ -354,6 +354,7 @@ int __copy_instruction(u8 *dest, u8 *src) - { - struct insn insn; - kprobe_opcode_t buf[MAX_INSN_SIZE]; -+ int length; - unsigned long recovered_insn = - recover_probed_instruction(buf, (unsigned long)src); - -@@ -361,16 +362,18 @@ int __copy_instruction(u8 *dest, u8 *src) - return 0; - kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE); - insn_get_length(&insn); -+ length = insn.length; -+ - /* Another subsystem puts a breakpoint, failed to recover */ - if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION) - return 0; -- memcpy(dest, insn.kaddr, insn.length); -+ memcpy(dest, insn.kaddr, length); - - #ifdef CONFIG_X86_64 - if (insn_rip_relative(&insn)) { - s64 newdisp; - u8 *disp; -- kernel_insn_init(&insn, dest, insn.length); -+ kernel_insn_init(&insn, dest, length); - insn_get_displacement(&insn); - /* - * The copied instruction uses the %rip-relative addressing -@@ -394,7 +397,7 @@ int __copy_instruction(u8 *dest, u8 *src) - *(s32 *) disp = (s32) newdisp; - } - #endif -- return insn.length; -+ return length; - } - - static int arch_copy_kprobe(struct kprobe *p) -diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c -index 4ee827d..3cb2b58 100644 ---- a/arch/x86/kvm/lapic.c -+++ b/arch/x86/kvm/lapic.c -@@ -1064,6 +1064,17 @@ static void update_divide_count(struct kvm_lapic *apic) - apic->divide_count); - } - -+static void apic_update_lvtt(struct kvm_lapic *apic) -+{ -+ u32 timer_mode = kvm_apic_get_reg(apic, APIC_LVTT) & -+ apic->lapic_timer.timer_mode_mask; -+ -+ if (apic->lapic_timer.timer_mode != timer_mode) { -+ apic->lapic_timer.timer_mode = timer_mode; -+ hrtimer_cancel(&apic->lapic_timer.timer); -+ } -+} -+ - static void apic_timer_expired(struct kvm_lapic *apic) - { - struct kvm_vcpu *vcpu = apic->vcpu; -@@ -1272,6 +1283,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) - apic_set_reg(apic, APIC_LVTT + 0x10 * i, - lvt_val | APIC_LVT_MASKED); - } -+ apic_update_lvtt(apic); - atomic_set(&apic->lapic_timer.pending, 0); - - } -@@ -1304,20 +1316,13 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) - - break; - -- case APIC_LVTT: { -- u32 timer_mode = val & apic->lapic_timer.timer_mode_mask; -- -- if (apic->lapic_timer.timer_mode != timer_mode) { -- apic->lapic_timer.timer_mode = timer_mode; -- hrtimer_cancel(&apic->lapic_timer.timer); -- } -- -+ case APIC_LVTT: - if (!kvm_apic_sw_enabled(apic)) - val |= APIC_LVT_MASKED; - val &= (apic_lvt_mask[0] | apic->lapic_timer.timer_mode_mask); - apic_set_reg(apic, APIC_LVTT, val); -+ apic_update_lvtt(apic); - break; -- } - - case APIC_TMICT: - if (apic_lvtt_tscdeadline(apic)) -@@ -1552,7 +1557,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu) - - for (i = 0; i < APIC_LVT_NUM; i++) - apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED); -- apic->lapic_timer.timer_mode = 0; -+ apic_update_lvtt(apic); - apic_set_reg(apic, APIC_LVT0, - SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT)); - -@@ -1778,6 +1783,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu, - - apic_update_ppr(apic); - hrtimer_cancel(&apic->lapic_timer.timer); -+ apic_update_lvtt(apic); - update_divide_count(apic); - start_apic_timer(apic); - apic->irr_pending = true; -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 288547a..f26ebc5 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -80,6 +80,7 @@ static const struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x0489, 0xe057) }, - { USB_DEVICE(0x0489, 0xe056) }, - { USB_DEVICE(0x0489, 0xe05f) }, -+ { USB_DEVICE(0x0489, 0xe076) }, - { USB_DEVICE(0x0489, 0xe078) }, - { USB_DEVICE(0x04c5, 0x1330) }, - { USB_DEVICE(0x04CA, 0x3004) }, -@@ -111,6 +112,7 @@ static const struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x13d3, 0x3408) }, - { USB_DEVICE(0x13d3, 0x3423) }, - { USB_DEVICE(0x13d3, 0x3432) }, -+ { USB_DEVICE(0x13d3, 0x3474) }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, -@@ -135,6 +137,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, -@@ -166,6 +169,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU22 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 2c527da..4fc4157 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -174,6 +174,7 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, -@@ -205,6 +206,7 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, -diff --git a/drivers/clk/at91/clk-pll.c b/drivers/clk/at91/clk-pll.c -index 6ec79db..cbbe403 100644 ---- a/drivers/clk/at91/clk-pll.c -+++ b/drivers/clk/at91/clk-pll.c -@@ -173,8 +173,7 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate, - int i = 0; - - /* Check if parent_rate is a valid input rate */ -- if (parent_rate < characteristics->input.min || -- parent_rate > characteristics->input.max) -+ if (parent_rate < characteristics->input.min) - return -ERANGE; - - /* -@@ -187,6 +186,15 @@ static long clk_pll_get_best_div_mul(struct clk_pll *pll, unsigned long rate, - if (!mindiv) - mindiv = 1; - -+ if (parent_rate > characteristics->input.max) { -+ tmpdiv = DIV_ROUND_UP(parent_rate, characteristics->input.max); -+ if (tmpdiv > PLL_DIV_MAX) -+ return -ERANGE; -+ -+ if (tmpdiv > mindiv) -+ mindiv = tmpdiv; -+ } -+ - /* - * Calculate the maximum divider which is limited by PLL register - * layout (limited by the MUL or DIV field size). -diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h -index 69abb08..eb8e5dc 100644 ---- a/drivers/clk/at91/pmc.h -+++ b/drivers/clk/at91/pmc.h -@@ -121,7 +121,7 @@ extern void __init of_at91sam9x5_clk_smd_setup(struct device_node *np, - struct at91_pmc *pmc); - #endif - --#if defined(CONFIG_HAVE_AT91_SMD) -+#if defined(CONFIG_HAVE_AT91_H32MX) - extern void __init of_sama5d4_clk_h32mx_setup(struct device_node *np, - struct at91_pmc *pmc); - #endif -diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c -index f347ab7..08b0da2 100644 ---- a/drivers/crypto/caam/caamhash.c -+++ b/drivers/crypto/caam/caamhash.c -@@ -1543,6 +1543,8 @@ static int ahash_init(struct ahash_request *req) - - state->current_buf = 0; - state->buf_dma = 0; -+ state->buflen_0 = 0; -+ state->buflen_1 = 0; - - return 0; - } -diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c -index ae31e55..a48dc25 100644 ---- a/drivers/crypto/caam/caamrng.c -+++ b/drivers/crypto/caam/caamrng.c -@@ -56,7 +56,7 @@ - - /* Buffer, its dma address and lock */ - struct buf_data { -- u8 buf[RN_BUF_SIZE]; -+ u8 buf[RN_BUF_SIZE] ____cacheline_aligned; - dma_addr_t addr; - struct completion filled; - u32 hw_desc[DESC_JOB_O_LEN]; -diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c -index ec4d932..169123a 100644 ---- a/drivers/gpu/drm/i915/i915_drv.c -+++ b/drivers/gpu/drm/i915/i915_drv.c -@@ -693,6 +693,16 @@ static int i915_drm_resume(struct drm_device *dev) - intel_init_pch_refclk(dev); - drm_mode_config_reset(dev); - -+ /* -+ * Interrupts have to be enabled before any batches are run. -+ * If not the GPU will hang. i915_gem_init_hw() will initiate -+ * batches to update/restore the context. -+ * -+ * Modeset enabling in intel_modeset_init_hw() also needs -+ * working interrupts. -+ */ -+ intel_runtime_pm_enable_interrupts(dev_priv); -+ - mutex_lock(&dev->struct_mutex); - if (i915_gem_init_hw(dev)) { - DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n"); -@@ -700,9 +710,6 @@ static int i915_drm_resume(struct drm_device *dev) - } - mutex_unlock(&dev->struct_mutex); - -- /* We need working interrupts for modeset enabling ... */ -- intel_runtime_pm_enable_interrupts(dev_priv); -- - intel_modeset_init_hw(dev); - - spin_lock_irq(&dev_priv->irq_lock); -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 7a628e4..9536ec3 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -2732,6 +2732,9 @@ void i915_gem_reset(struct drm_device *dev) - void - i915_gem_retire_requests_ring(struct intel_engine_cs *ring) - { -+ if (list_empty(&ring->request_list)) -+ return; -+ - WARN_ON(i915_verify_lists(ring->dev)); - - /* Retire requests first as we use it above for the early return. -@@ -3088,8 +3091,8 @@ int i915_vma_unbind(struct i915_vma *vma) - } else if (vma->ggtt_view.pages) { - sg_free_table(vma->ggtt_view.pages); - kfree(vma->ggtt_view.pages); -- vma->ggtt_view.pages = NULL; - } -+ vma->ggtt_view.pages = NULL; - } - - drm_mm_remove_node(&vma->node); -diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c -index 9872ba9..2ffeda3 100644 ---- a/drivers/gpu/drm/mgag200/mgag200_mode.c -+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c -@@ -1526,6 +1526,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector, - return MODE_BANDWIDTH; - } - -+ if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 || -+ (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) { -+ return MODE_H_ILLEGAL; -+ } -+ - if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || - mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || - mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 || -diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c -index 686411e..b82f2dd 100644 ---- a/drivers/gpu/drm/radeon/radeon_kms.c -+++ b/drivers/gpu/drm/radeon/radeon_kms.c -@@ -547,6 +547,9 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file - else - *value = 1; - break; -+ case RADEON_INFO_VA_UNMAP_WORKING: -+ *value = true; -+ break; - default: - DRM_DEBUG_KMS("Invalid request %d\n", info->request); - return -EINVAL; -diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c -index 147029a..ac72ece 100644 ---- a/drivers/infiniband/ulp/isert/ib_isert.c -+++ b/drivers/infiniband/ulp/isert/ib_isert.c -@@ -2316,7 +2316,6 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, - page_off = offset % PAGE_SIZE; - - send_wr->sg_list = ib_sge; -- send_wr->num_sge = sg_nents; - send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc; - /* - * Perform mapping of TCM scatterlist memory ib_sge dma_addr. -@@ -2336,14 +2335,17 @@ isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd, - ib_sge->addr, ib_sge->length, ib_sge->lkey); - page_off = 0; - data_left -= ib_sge->length; -+ if (!data_left) -+ break; - ib_sge++; - isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge); - } - -+ send_wr->num_sge = ++i; - isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n", - send_wr->sg_list, send_wr->num_sge); - -- return sg_nents; -+ return send_wr->num_sge; - } - - static int -@@ -3311,6 +3313,7 @@ static void isert_free_conn(struct iscsi_conn *conn) - { - struct isert_conn *isert_conn = conn->context; - -+ isert_wait4flush(isert_conn); - isert_put_conn(isert_conn); - } - -diff --git a/drivers/md/dm.c b/drivers/md/dm.c -index 9b4e30a..beda011 100644 ---- a/drivers/md/dm.c -+++ b/drivers/md/dm.c -@@ -1889,8 +1889,8 @@ static int map_request(struct dm_target *ti, struct request *rq, - dm_kill_unmapped_request(rq, r); - return r; - } -- if (IS_ERR(clone)) -- return DM_MAPIO_REQUEUE; -+ if (r != DM_MAPIO_REMAPPED) -+ return r; - if (setup_clone(clone, rq, tio, GFP_KERNEL)) { - /* -ENOMEM */ - ti->type->release_clone_rq(clone); -diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c -index 75345c1..5c91df5 100644 ---- a/drivers/net/wireless/b43/main.c -+++ b/drivers/net/wireless/b43/main.c -@@ -5365,6 +5365,10 @@ static void b43_supported_bands(struct b43_wldev *dev, bool *have_2ghz_phy, - *have_5ghz_phy = true; - return; - case 0x4321: /* BCM4306 */ -+ /* There are 14e4:4321 PCI devs with 2.4 GHz BCM4321 (N-PHY) */ -+ if (dev->phy.type != B43_PHYTYPE_G) -+ break; -+ /* fall through */ - case 0x4313: /* BCM4311 */ - case 0x431a: /* BCM4318 */ - case 0x432a: /* BCM4321 */ -diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c -index 220c0fd..50faef4 100644 ---- a/drivers/usb/class/cdc-acm.c -+++ b/drivers/usb/class/cdc-acm.c -@@ -1468,6 +1468,11 @@ skip_countries: - goto alloc_fail8; - } - -+ if (quirks & CLEAR_HALT_CONDITIONS) { -+ usb_clear_halt(usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress)); -+ usb_clear_halt(usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress)); -+ } -+ - return 0; - alloc_fail8: - if (acm->country_codes) { -@@ -1747,6 +1752,10 @@ static const struct usb_device_id acm_ids[] = { - .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ - }, - -+ { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ -+ .driver_info = CLEAR_HALT_CONDITIONS, -+ }, -+ - /* Nokia S60 phones expose two ACM channels. The first is - * a modem and is picked up by the standard AT-command - * information below. The second is 'vendor-specific' but -diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h -index ffeb3c8..b3b6c9d 100644 ---- a/drivers/usb/class/cdc-acm.h -+++ b/drivers/usb/class/cdc-acm.h -@@ -133,3 +133,4 @@ struct acm { - #define NO_DATA_INTERFACE BIT(4) - #define IGNORE_DEVICE BIT(5) - #define QUIRK_CONTROL_LINE_STATE BIT(6) -+#define CLEAR_HALT_CONDITIONS BIT(7) -diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h -index 50d0fb4..76d2ede 100644 ---- a/include/uapi/drm/radeon_drm.h -+++ b/include/uapi/drm/radeon_drm.h -@@ -1034,6 +1034,7 @@ struct drm_radeon_cs { - #define RADEON_INFO_VRAM_USAGE 0x1e - #define RADEON_INFO_GTT_USAGE 0x1f - #define RADEON_INFO_ACTIVE_CU_COUNT 0x20 -+#define RADEON_INFO_VA_UNMAP_WORKING 0x25 - - struct drm_radeon_info { - uint32_t request; -diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c -index ced69da..7f2e97c 100644 ---- a/kernel/trace/trace_events_filter.c -+++ b/kernel/trace/trace_events_filter.c -@@ -1369,19 +1369,26 @@ static int check_preds(struct filter_parse_state *ps) - { - int n_normal_preds = 0, n_logical_preds = 0; - struct postfix_elt *elt; -+ int cnt = 0; - - list_for_each_entry(elt, &ps->postfix, list) { -- if (elt->op == OP_NONE) -+ if (elt->op == OP_NONE) { -+ cnt++; - continue; -+ } - - if (elt->op == OP_AND || elt->op == OP_OR) { - n_logical_preds++; -+ cnt--; - continue; - } -+ if (elt->op != OP_NOT) -+ cnt--; - n_normal_preds++; -+ WARN_ON_ONCE(cnt < 0); - } - -- if (!n_normal_preds || n_logical_preds >= n_normal_preds) { -+ if (cnt != 1 || !n_normal_preds || n_logical_preds >= n_normal_preds) { - parse_error(ps, FILT_ERR_INVALID_FILTER, 0); - return -EINVAL; - } -diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c -index 87eff31..60b3100 100644 ---- a/sound/pci/hda/patch_sigmatel.c -+++ b/sound/pci/hda/patch_sigmatel.c -@@ -100,6 +100,7 @@ enum { - STAC_HP_ENVY_BASS, - STAC_HP_BNB13_EQ, - STAC_HP_ENVY_TS_BASS, -+ STAC_HP_ENVY_TS_DAC_BIND, - STAC_92HD83XXX_GPIO10_EAPD, - STAC_92HD83XXX_MODELS - }; -@@ -2170,6 +2171,22 @@ static void stac92hd83xxx_fixup_gpio10_eapd(struct hda_codec *codec, - spec->eapd_switch = 0; - } - -+static void hp_envy_ts_fixup_dac_bind(struct hda_codec *codec, -+ const struct hda_fixup *fix, -+ int action) -+{ -+ struct sigmatel_spec *spec = codec->spec; -+ static hda_nid_t preferred_pairs[] = { -+ 0xd, 0x13, -+ 0 -+ }; -+ -+ if (action != HDA_FIXUP_ACT_PRE_PROBE) -+ return; -+ -+ spec->gen.preferred_dacs = preferred_pairs; -+} -+ - static const struct hda_verb hp_bnb13_eq_verbs[] = { - /* 44.1KHz base */ - { 0x22, 0x7A6, 0x3E }, -@@ -2685,6 +2702,12 @@ static const struct hda_fixup stac92hd83xxx_fixups[] = { - {} - }, - }, -+ [STAC_HP_ENVY_TS_DAC_BIND] = { -+ .type = HDA_FIXUP_FUNC, -+ .v.func = hp_envy_ts_fixup_dac_bind, -+ .chained = true, -+ .chain_id = STAC_HP_ENVY_TS_BASS, -+ }, - [STAC_92HD83XXX_GPIO10_EAPD] = { - .type = HDA_FIXUP_FUNC, - .v.func = stac92hd83xxx_fixup_gpio10_eapd, -@@ -2763,6 +2786,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = { - "HP bNB13", STAC_HP_BNB13_EQ), - SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e, - "HP ENVY TS", STAC_HP_ENVY_TS_BASS), -+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967, -+ "HP ENVY TS", STAC_HP_ENVY_TS_DAC_BIND), - SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940, - "HP bNB13", STAC_HP_BNB13_EQ), - SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941, diff --git a/4.0.7/4420_grsecurity-3.1-4.0.7-201506300712.patch b/4.0.7/4420_grsecurity-3.1-4.0.7-201507050833.patch similarity index 99% rename from 4.0.7/4420_grsecurity-3.1-4.0.7-201506300712.patch rename to 4.0.7/4420_grsecurity-3.1-4.0.7-201507050833.patch index 37bee2c..c471dac 100644 --- a/4.0.7/4420_grsecurity-3.1-4.0.7-201506300712.patch +++ b/4.0.7/4420_grsecurity-3.1-4.0.7-201507050833.patch @@ -50607,10 +50607,59 @@ index ce2e2cf..f81e500 100644 __u32 protocols; diff --git a/drivers/nfc/st21nfca/st21nfca.c b/drivers/nfc/st21nfca/st21nfca.c -index 24d3d24..ff70d28 100644 +index 24d3d24..b662ba0 100644 --- a/drivers/nfc/st21nfca/st21nfca.c +++ b/drivers/nfc/st21nfca/st21nfca.c -@@ -588,7 +588,7 @@ static int st21nfca_get_iso14443_3_uid(struct nfc_hci_dev *hdev, u8 *gate, +@@ -148,14 +148,14 @@ static int st21nfca_hci_load_session(struct nfc_hci_dev *hdev) + ST21NFCA_DEVICE_MGNT_GATE, + ST21NFCA_DEVICE_MGNT_PIPE); + if (r < 0) +- goto free_info; ++ return r; + + /* Get pipe list */ + r = nfc_hci_send_cmd(hdev, ST21NFCA_DEVICE_MGNT_GATE, + ST21NFCA_DM_GETINFO, pipe_list, sizeof(pipe_list), + &skb_pipe_list); + if (r < 0) +- goto free_info; ++ return r; + + /* Complete the existing gate_pipe table */ + for (i = 0; i < skb_pipe_list->len; i++) { +@@ -181,6 +181,7 @@ static int st21nfca_hci_load_session(struct nfc_hci_dev *hdev) + info->src_host_id != ST21NFCA_ESE_HOST_ID) { + pr_err("Unexpected apdu_reader pipe on host %x\n", + info->src_host_id); ++ kfree_skb(skb_pipe_info); + continue; + } + +@@ -200,6 +201,7 @@ static int st21nfca_hci_load_session(struct nfc_hci_dev *hdev) + hdev->pipes[st21nfca_gates[j].pipe].dest_host = + info->src_host_id; + } ++ kfree_skb(skb_pipe_info); + } + + /* +@@ -214,13 +216,12 @@ static int st21nfca_hci_load_session(struct nfc_hci_dev *hdev) + st21nfca_gates[i].gate, + st21nfca_gates[i].pipe); + if (r < 0) +- goto free_info; ++ goto free_list; + } + } + + memcpy(hdev->init_data.gates, st21nfca_gates, sizeof(st21nfca_gates)); +-free_info: +- kfree_skb(skb_pipe_info); ++free_list: + kfree_skb(skb_pipe_list); + return r; + } +@@ -588,7 +589,7 @@ static int st21nfca_get_iso14443_3_uid(struct nfc_hci_dev *hdev, u8 *gate, goto exit; } @@ -55636,6 +55685,19 @@ index 8cfc319..4868255 100644 return 0; } +diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c +index 0495c94..289e201 100644 +--- a/drivers/usb/gadget/configfs.c ++++ b/drivers/usb/gadget/configfs.c +@@ -571,7 +571,7 @@ static struct config_group *function_make( + if (IS_ERR(fi)) + return ERR_CAST(fi); + +- ret = config_item_set_name(&fi->group.cg_item, name); ++ ret = config_item_set_name(&fi->group.cg_item, "%s", name); + if (ret) { + usb_put_function_instance(fi); + return ERR_PTR(ret); diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c index 9719abf..789d5d9 100644 --- a/drivers/usb/gadget/function/f_uac1.c @@ -68286,6 +68348,28 @@ index cf0db00..c7f70e8 100644 /* * We'll have a dentry and an inode for +diff --git a/fs/configfs/item.c b/fs/configfs/item.c +index e65f9ff..3ed264d 100644 +--- a/fs/configfs/item.c ++++ b/fs/configfs/item.c +@@ -116,7 +116,7 @@ void config_item_init_type_name(struct config_item *item, + const char *name, + struct config_item_type *type) + { +- config_item_set_name(item, name); ++ config_item_set_name(item, "%s", name); + item->ci_type = type; + config_item_init(item); + } +@@ -125,7 +125,7 @@ EXPORT_SYMBOL(config_item_init_type_name); + void config_group_init_type_name(struct config_group *group, const char *name, + struct config_item_type *type) + { +- config_item_set_name(&group->cg_item, name); ++ config_item_set_name(&group->cg_item, "%s", name); + group->cg_item.ci_type = type; + config_group_init(group); + } diff --git a/fs/coredump.c b/fs/coredump.c index bbbe139..b76fae5 100644 --- a/fs/coredump.c @@ -81317,7 +81401,7 @@ index 0000000..8ee8e4f +} diff --git a/grsecurity/gracl_ip.c b/grsecurity/gracl_ip.c new file mode 100644 -index 0000000..f056b81 +index 0000000..ed6ee43 --- /dev/null +++ b/grsecurity/gracl_ip.c @@ -0,0 +1,386 @@ @@ -81391,7 +81475,7 @@ index 0000000..f056b81 + "unspec", "unix", "inet", "ax25", "ipx", "appletalk", "netrom", "bridge", "atmpvc", "x25", + "inet6", "rose", "decnet", "netbeui", "security", "key", "netlink", "packet", "ash", + "econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "fam_27", "fam_28", -+ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf" ++ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf", "alg", "nfc", "vsock" + }; + +const char * @@ -89034,9 +89118,18 @@ index 5d5aaae..0ea9b84 100644 extern bool completion_done(struct completion *x); diff --git a/include/linux/configfs.h b/include/linux/configfs.h -index 34025df..d94bbbc 100644 +index 34025df..2a6ee32 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h +@@ -64,7 +64,7 @@ struct config_item { + struct dentry *ci_dentry; + }; + +-extern int config_item_set_name(struct config_item *, const char *, ...); ++extern __printf(2, 3) int config_item_set_name(struct config_item *, const char *, ...); + + static inline char *config_item_name(struct config_item * item) + { @@ -125,7 +125,7 @@ struct configfs_attribute { const char *ca_name; struct module *ca_owner;