3.0.2-stable review
Subsystems (46)
cover 3.0.2-stable review
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Monday, August 15, 2011, 20:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.0.2-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Makefile | 4 +- arch/cris/arch-v10/drivers/sync_serial.c | 6 +- arch/cris/arch-v10/kernel/irq.c | 3 + arch/cris/include/asm/thread_info.h | 6 +- arch/parisc/include/asm/atomic.h | 4 +- arch/parisc/include/asm/futex.h | 66 ++++- arch/parisc/include/asm/unistd.h | 3 +- arch/parisc/kernel/syscall_table.S | 1 + arch/powerpc/kernel/prom_init.c | 6 +- arch/powerpc/platforms/pseries/dtl.c | 2 +- arch/powerpc/platforms/pseries/kexec.c | 11 + arch/powerpc/platforms/pseries/lpar.c | 2 +- arch/powerpc/platforms/pseries/plpar_wrappers.h | 4 +- arch/sparc/include/asm/bitops_64.h | 49 +--- arch/sparc/include/asm/elf_64.h | 63 ++--- arch/sparc/include/asm/hypervisor.h | 14 + arch/sparc/include/asm/spitfire.h | 1 + arch/sparc/include/asm/tsb.h | 51 ++-- arch/sparc/include/asm/xor_64.h | 3 +- arch/sparc/kernel/cpu.c | 8 + arch/sparc/kernel/cpumap.c | 1 + arch/sparc/kernel/ds.c | 31 ++- arch/sparc/kernel/entry.h | 14 + arch/sparc/kernel/head_64.S | 33 +++- arch/sparc/kernel/hvapi.c | 7 + arch/sparc/kernel/hvcalls.S | 7 + arch/sparc/kernel/kernel.h | 15 + arch/sparc/kernel/ktlb.S | 24 +- arch/sparc/kernel/mdesc.c | 30 ++- arch/sparc/kernel/pcr.c | 11 +- arch/sparc/kernel/perf_event.c | 3 +- arch/sparc/kernel/setup_64.c | 186 +++++++++++++ arch/sparc/kernel/sparc_ksyms_64.c | 11 + arch/sparc/kernel/sstate.c | 9 +- arch/sparc/kernel/unaligned_64.c | 15 +- arch/sparc/kernel/vmlinux.lds.S | 21 ++- arch/sparc/lib/Makefile | 4 +- arch/sparc/lib/NG2page.S | 61 ---- arch/sparc/lib/NGpage.S | 114 +++++--- arch/sparc/lib/ffs.S | 84 ++++++ arch/sparc/lib/hweight.S | 51 ++++ arch/sparc/mm/init_64.c | 42 +++- arch/x86/xen/Makefile | 2 +- arch/x86/xen/enlighten.c | 8 + arch/x86/xen/vga.c | 67 +++++ arch/x86/xen/xen-ops.h | 11 + crypto/md5.c | 92 +------ drivers/char/random.c | 334 +---------------------- drivers/gpu/drm/drm_edid.c | 24 ++- drivers/gpu/drm/i915/i915_dma.c | 6 +- drivers/gpu/drm/i915/i915_irq.c | 3 + drivers/gpu/drm/i915/intel_display.c | 8 +- drivers/gpu/drm/i915/intel_panel.c | 4 + drivers/gpu/drm/i915/intel_ringbuffer.c | 3 + drivers/gpu/drm/radeon/radeon_connectors.c | 54 ++++- drivers/gpu/drm/radeon/radeon_device.c | 5 +- drivers/gpu/drm/radeon/radeon_display.c | 9 + drivers/gpu/drm/radeon/radeon_i2c.c | 32 ++- drivers/gpu/drm/radeon/radeon_mode.h | 6 +- drivers/isdn/i4l/isdn_net.c | 3 + drivers/net/Makefile | 1 + drivers/net/bonding/bond_main.c | 6 +- drivers/net/bonding/bond_sysfs.c | 133 +++++----- drivers/net/e1000e/lib.c | 3 +- drivers/net/gianfar_ptp.c | 9 +- drivers/net/ifb.c | 2 +- drivers/net/macvlan.c | 2 +- drivers/net/niu.c | 4 +- drivers/net/phy/dp83640.c | 5 +- drivers/net/r8169.c | 1 + drivers/net/sis190.c | 12 +- drivers/net/tun.c | 1 + drivers/net/veth.c | 2 + drivers/net/wan/hdlc_fr.c | 5 +- drivers/net/wireless/airo.c | 1 + drivers/net/wireless/ath/ath9k/ar9002_hw.c | 6 +- drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 6 +- drivers/net/wireless/ath/ath9k/ar9003_hw.c | 6 +- drivers/net/wireless/ath/ath9k/ar9003_phy.h | 2 +- drivers/net/wireless/ath/ath9k/hw.c | 11 +- drivers/net/wireless/ath/ath9k/hw.h | 3 +- drivers/net/wireless/ath/ath9k/init.c | 2 + drivers/net/wireless/ath/ath9k/pci.c | 27 ++ drivers/net/wireless/hostap/hostap_main.c | 1 + drivers/net/wireless/iwlegacy/iwl-3945.c | 6 +- drivers/net/wireless/iwlegacy/iwl-4965.c | 8 +- drivers/net/wireless/iwlwifi/iwl-5000.c | 1 + drivers/net/wireless/iwlwifi/iwl-core.h | 2 + drivers/net/wireless/iwlwifi/iwl-power.c | 3 +- drivers/net/wireless/rt2x00/rt2800lib.c | 3 +- drivers/net/wireless/rt2x00/rt2x00mac.c | 5 +- drivers/net/wireless/rtlwifi/pci.c | 20 +- drivers/platform/x86/asus-wmi.c | 17 +- drivers/scsi/mpt2sas/mpt2sas_base.c | 65 ++--- drivers/scsi/mpt2sas/mpt2sas_base.h | 53 ++++- drivers/scsi/mpt2sas/mpt2sas_ctl.c | 10 +- drivers/scsi/mpt2sas/mpt2sas_debug.h | 2 +- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 12 +- drivers/scsi/mpt2sas/mpt2sas_transport.c | 24 +- drivers/staging/ath6kl/os/linux/ar6000_drv.c | 1 + fs/cifs/cifsfs.c | 4 + fs/cifs/inode.c | 14 +- fs/cifs/transport.c | 2 + fs/ecryptfs/main.c | 23 ++- fs/ecryptfs/read_write.c | 18 +- fs/ext3/namei.c | 6 +- fs/ext4/namei.c | 6 +- include/drm/drm_crtc.h | 1 + include/drm/i915_drm.h | 2 +- include/linux/cryptohash.h | 5 + include/linux/if.h | 2 + include/linux/mm.h | 12 +- include/linux/random.h | 11 - include/net/ipv6.h | 12 +- include/net/secure_seq.h | 20 ++ include/net/transp_v6.h | 2 + include/xen/interface/xen.h | 39 +++ kernel/futex.c | 54 +++- lib/Makefile | 2 +- lib/md5.c | 95 +++++++ net/8021q/vlan_dev.c | 2 +- net/bluetooth/bnep/netdev.c | 1 + net/core/Makefile | 2 +- net/core/link_watch.c | 2 +- net/core/pktgen.c | 8 +- net/core/secure_seq.c | 184 +++++++++++++ net/dccp/ipv4.c | 1 + net/dccp/ipv6.c | 9 +- net/ethernet/eth.c | 1 + net/ipv4/devinet.c | 16 +- net/ipv4/gre.c | 21 +- net/ipv4/icmp.c | 14 +- net/ipv4/igmp.c | 2 +- net/ipv4/inet_hashtables.c | 1 + net/ipv4/inetpeer.c | 1 + net/ipv4/ip_output.c | 6 +- net/ipv4/ipmr.c | 2 +- net/ipv4/netfilter/nf_nat_proto_common.c | 1 + net/ipv4/route.c | 6 +- net/ipv4/tcp_ipv4.c | 1 + net/ipv6/af_inet6.c | 2 + net/ipv6/inet6_hashtables.c | 1 + net/ipv6/ip6_output.c | 40 +++- net/ipv6/tcp_ipv6.c | 1 + net/ipv6/udp.c | 2 +- net/l2tp/l2tp_eth.c | 2 +- net/mac80211/iface.c | 1 + net/netfilter/ipvs/ip_vs_ctl.c | 1 + net/sched/sch_sfq.c | 7 +- net/socket.c | 73 +++--- net/xfrm/xfrm_algo.c | 4 +- sound/core/timer.c | 2 + sound/soc/codecs/sgtl5000.c | 128 +++------- sound/usb/caiaq/input.c | 2 +- sound/usb/endpoint.c | 2 +- sound/usb/mixer.c | 25 +- sound/usb/mixer.h | 1 + 157 files changed, 1967 insertions(+), 1173 deletions(-)
Quoted 3 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one.
It looks like they didn't go through to LKML. Neither for 3.0.2, nor for .32.45, nor for .33.18. Could you resend?
thanks,
Signature · 1 line
js
Quoted 7 lines · Jiri Slaby
Quoted 3 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one.
It looks like they didn't go through to LKML. Neither for 3.0.2, nor for .32.45, nor for .33.18. Could you resend?
Sorry, none of them got sent, that was my fault. I've now sent them all.
greg k-h
Quoted 11 lines · Greg KH
Quoted 7 lines · Jiri Slaby
Quoted 3 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one.
It looks like they didn't go through to LKML. Neither for 3.0.2, nor for .32.45, nor for .33.18. Could you resend?
Sorry, none of them got sent, that was my fault. I've now sent them all.
Seems to be missing aba8d056078e47350d85b06a9cabd5afcc4b72ea which is CVE-2011-2905
Dave
Quoted 7 lines · Dave Jones
Quoted 6 lines · Greg KH
Quoted 5 lines · Jiri Slaby
Quoted 3 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one.
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
It looks like they didn't go through to LKML. Neither for 3.0.2, nor for .32.45, nor for .33.18. Could you resend?
Sorry, none of them got sent, that was my fault. I've now sent them all.
Seems to be missing
aba8d056078e47350d85b06a9cabd5afcc4b72eawhich is CVE-2011-2905
It would have been nice if someone had sent that patch to [email protected] :(
I'll queue it up for the next release after this one, thanks.
greg k-h
PATCH 1/90 cris: fix a build error in kernel/fork.c
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: WANG Cong <[email protected]>
commit d4969213f9e75ec1bfa6ea65c279c64cab7d1bd6 upstream.
Fix this error:
kernel/fork.c:267: error: implicit declaration of function 'alloc_thread_info_node'
This is due to renaming alloc_thread_info() to alloc_thread_info_node().
--- arch/cris/include/asm/thread_info.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/cris/include/asm/thread_info.h +3 -3
@@ -11,8 +11,6 @@#ifdef __KERNEL__ -#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR -#ifndef __ASSEMBLY__#include <asm/types.h> #include <asm/processor.h>
@@ -67,8 +65,10 @@ struct thread_info {#define init_thread_info (init_thread_union.thread_info) +#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR/* thread information allocation */ -#define alloc_thread_info (tsk, node) ((struct thread_info *) __get_free_pages(GFP_KERNEL,1)) +#define alloc_thread_info_node (tsk, node) \ + ((struct thread_info *) __get_free_pages(GFP_KERNEL, 1))#define free_thread_info (ti) free_pages((unsigned long) (ti), 1)#endif /* !__ASSEMBLY__ */
PATCH 2/90 cris: fix a build error in sync_serial_open()
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: WANG Cong <[email protected]>
commit 4b851d88192c22cf77418a0b4c45b5c789276837 upstream.
Fix:
arch/cris/arch-v10/drivers/sync_serial.c:628: error: 'ret' undeclared (first use in this function)
'ret' should be 'err'.
--- arch/cris/arch-v10/drivers/sync_serial.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/cris/arch-v10/drivers/sync_serial.c +2 -2
@@ -625,11 +625,11 @@ static int sync_serial_open(struct inode *R_IRQ_MASK1_SET =1 << port->data_avail_bit;DEBUG (printk (KERN_DEBUG "sser%d rec started\n" , dev)); } - ret =0 ; + err =0 ; out:mutex_unlock (&sync_serial_mutex); -return ret; +return err; }static int sync_serial_release (struct inode *inode,struct file *file)
PATCH 3/90 cris: fix the prototype of sync_serial_ioctl()
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: WANG Cong <[email protected]>
commit b4bc281266e84e9a432b588ebdcef5fb94dc8ecb upstream.
Fix:
arch/cris/arch-v10/drivers/sync_serial.c:961: error: conflicting types for 'sync_serial_ioctl'
--- arch/cris/arch-v10/drivers/sync_serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/cris/arch-v10/drivers/sync_serial.c +1 -1
@@ -158,7 +158,7 @@ static int sync_serial_open(struct inodestatic int sync_serial_release (struct inode *inode,struct file *file);static unsigned int sync_serial_poll (struct file *filp,poll_table *wait); -static int sync_serial_ioctl (struct file *file, +static long sync_serial_ioctl (struct file *file,unsigned int cmd,unsigned long arg);static ssize_t sync_serial_write (struct file *file,const char *buf,size_t count,loff_t *ppos);
PATCH 4/90 cris: add missing declaration of kgdb_init() and breakpoint()
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: WANG Cong <[email protected]>
commit 1646ec9db75e151b0479dbfaf972f741d0476ec7 upstream.
Fix:
arch/cris/arch-v10/kernel/irq.c:239: error: implicit declaration of function 'kgdb_init' arch/cris/arch-v10/kernel/irq.c:240: error: implicit declaration of function 'breakpoint'
Declare these two functions.
--- arch/cris/arch-v10/kernel/irq.c | 3 +++ 1 file changed, 3 insertions(+)
arch/cris/arch-v10/kernel/irq.c +3 -0
@@ -20,6 +20,9 @@#define crisv10_mask_irq (irq_nr) (*R_VECT_MASK_CLR = 1 << (irq_nr));#define crisv10_unmask_irq (irq_nr) (*R_VECT_MASK_SET = 1 << (irq_nr)); +extern void kgdb_init (void ); +extern void breakpoint (void ); +/* don't use set_int_vector, it bypasses the linux interrupt handlers. it is * global just so that the kernel gdb can use it. */
PATCH 5/90 futex: Fix regression with read only mappings
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Shawn Bohrer <[email protected]>
commit 9ea71503a8ed9184d2d0b8ccc4d269d05f7940ae upstream.
commit 7485d0d3758e8e6491a5c9468114e74dc050785d (futexes: Remove rw parameter from get_futex_key()) in 2.6.33 fixed two problems: First, It prevented a loop when encountering a ZERO_PAGE. Second, it fixed RW MAP_PRIVATE futex operations by forcing the COW to occur by unconditionally performing a write access get_user_pages_fast() to get the page. The commit also introduced a user-mode regression in that it broke futex operations on read-only memory maps. For example, this breaks workloads that have one or more reader processes doing a FUTEX_WAIT on a futex within a read only shared file mapping, and a writer processes that has a writable mapping issuing the FUTEX_WAKE.
This fixes the regression for valid futex operations on RO mappings by trying a RO get_user_pages_fast() when the RW get_user_pages_fast() fails. This change makes it necessary to also check for invalid use cases, such as anonymous RO mappings (which can never change) and the ZERO_PAGE which the commit referenced above was written to address.
This patch does restore the original behavior with RO MAP_PRIVATE mappings, which have inherent user-mode usage problems and don't really make sense. With this patch performing a FUTEX_WAIT within a RO MAP_PRIVATE mapping will be successfully woken provided another process updates the region of the underlying mapped file. However, the mmap() man page states that for a MAP_PRIVATE mapping:
It is unspecified whether changes made to the file after the mmap() call are visible in the mapped region.
So user-mode users attempting to use futex operations on RO MAP_PRIVATE mappings are depending on unspecified behavior. Additionally a RO MAP_PRIVATE mapping could fail to wake up in the following case.
Thread-A: call futex(FUTEX_WAIT, memory-region-A).
get_futex_key() return inode based key.
sleep on the key
Thread-B: call mprotect(PROT_READ|PROT_WRITE, memory-region-A)
Thread-B: write memory-region-A.
COW happen. This process's memory-region-A become related to new COWed private (ie PageAnon=1) page.
Thread-B: call futex(FUETX_WAKE, memory-region-A).
get_futex_key() return mm based key.
IOW, we fail to wake up Thread-A.
Once again doing something like this is just silly and users who do something like this get what they deserve.
While RO MAP_PRIVATE mappings are nonsensical, checking for a private mapping requires walking the vmas and was deemed too costly to avoid a userspace hang.
This Patch is based on Peter Zijlstra's initial patch with modifications to only allow RO mappings for futex operations that need VERIFY_READ access.
--- kernel/futex.c | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 12 deletions(-)
kernel/futex.c +42 -12
@@ -218,6 +218,8 @@ static void drop_futex_key_refs(union fu* @uaddr: virtual address of the futex * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED * @key: address where result is stored. +* @rw: mapping needs to be read/write (values: VERIFY_READ, +* VERIFY_WRITE) * * Returns a negative error code or 0 * The key words are stored in *key on success.
@@ -229,12 +231,12 @@ static void drop_futex_key_refs(union fu* lock_page() might sleep, the caller should not hold a spinlock. */ static int -get_futex_key (u32 __user *uaddr,int fshared,union futex_key *key) +get_futex_key (u32 __user *uaddr,int fshared,union futex_key *key,int rw) {unsigned long address = (unsigned long )uaddr;struct mm_struct *mm = current->mm;struct page *page, *page_head; -int err; +int err, ro =0 ;/* * The futex address must be "naturally" aligned.
@@ -262,8 +264,18 @@ get_futex_key(u32 __user *uaddr, int fsh again: err =get_user_pages_fast (address,1 ,1 , &page); +/* +* If write access is not required (eg. FUTEX_WAIT), try +* and get read-only access. +*/ +if (err == -EFAULT && rw ==VERIFY_READ ) { + err =get_user_pages_fast (address,1 ,0 , &page); + ro =1 ; + }if (err <0 )return err; +else + err =0 ;#ifdef CONFIG_TRANSPARENT_HUGEPAGE page_head = page;
@@ -305,6 +317,13 @@ again:if (!page_head->mapping) {unlock_page (page_head);put_page (page_head); +/* +* ZERO_PAGE pages don't have a mapping. Avoid a busy loop +* trying to find one. RW mapping would have COW'd (and thus +* have a mapping) so this page is RO and won't ever change. +*/ +if ((page_head ==ZERO_PAGE (address))) +return -EFAULT ; goto again; }
@@ -316,6 +335,15 @@ again:* the object not the particular process. */ if (PageAnon (page_head)) { +/* +* A RO anonymous page will never change and thus doesn't make +* sense for futex operations. +*/ +if (ro) { + err = -EFAULT ; + goto out; + } + key->both.offset |=FUT_OFF_MMSHARED ;/* ref taken on mm */ key->private.mm = mm; key->private.address = address;
@@ -327,9 +355,10 @@ again:get_futex_key_refs (key); +out:unlock_page (page_head);put_page (page_head); -return 0 ; +return err; }static inline void put_futex_key (union futex_key *key)
@@ -940,7 +969,7 @@ futex_wake(u32 __user *uaddr, unsigned iif (!bitset)return -EINVAL ; - ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &key); + ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &key,VERIFY_READ );if (unlikely (ret !=0 )) goto out;
@@ -986,10 +1015,10 @@ futex_wake_op(u32 __user *uaddr1, unsignint ret, op_ret; retry: - ret =get_futex_key (uaddr1, flags &FLAGS_SHARED , &key1); + ret =get_futex_key (uaddr1, flags &FLAGS_SHARED , &key1,VERIFY_READ );if (unlikely (ret !=0 )) goto out; - ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2); + ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2,VERIFY_WRITE );if (unlikely (ret !=0 )) goto out_put_key1;
@@ -1243,10 +1272,11 @@ retry: pi_state =NULL ; } - ret =get_futex_key (uaddr1, flags &FLAGS_SHARED , &key1); + ret =get_futex_key (uaddr1, flags &FLAGS_SHARED , &key1,VERIFY_READ );if (unlikely (ret !=0 )) goto out; - ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2); + ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2, + requeue_pi ?VERIFY_WRITE :VERIFY_READ );if (unlikely (ret !=0 )) goto out_put_key1;
@@ -1790,7 +1820,7 @@ static int futex_wait_setup(u32 __user ** while the syscall executes. */ retry: - ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &q->key); + ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &q->key,VERIFY_READ );if (unlikely (ret !=0 ))return ret;
@@ -1941,7 +1971,7 @@ static int futex_lock_pi(u32 __user *uad } retry: - ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &q.key); + ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &q.key,VERIFY_WRITE );if (unlikely (ret !=0 )) goto out;
@@ -2060,7 +2090,7 @@ retry:if ((uval &FUTEX_TID_MASK ) != vpid)return -EPERM ; - ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &key); + ret =get_futex_key (uaddr, flags &FLAGS_SHARED , &key,VERIFY_WRITE );if (unlikely (ret !=0 )) goto out;
@@ -2249,7 +2279,7 @@ static int futex_wait_requeue_pi(u32 __udebug_rt_mutex_init_waiter (&rt_waiter); rt_waiter.task =NULL ; - ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2); + ret =get_futex_key (uaddr2, flags &FLAGS_SHARED , &key2,VERIFY_WRITE );if (unlikely (ret !=0 )) goto out;
PATCH 6/90 wire up sendmmsg syscall
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: James Bottomley <[email protected]>
commit 205e9a2106b934ea39049bab28f0896c17a2cb30 upstream.
--- arch/parisc/include/asm/unistd.h | 3 ++- arch/parisc/kernel/syscall_table.S | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
arch/parisc/include/asm/unistd.h +2 -1
@@ -821,8 +821,9 @@#define __NR_open_by_handle_at (__NR_Linux + 326)#define __NR_syncfs (__NR_Linux + 327)#define __NR_setns (__NR_Linux + 328) +#define __NR_sendmmsg (__NR_Linux + 329) -#define __NR_Linux_syscalls (__NR_setns + 1) +#define __NR_Linux_syscalls (__NR_sendmmsg + 1)#define __IGNORE_select/* newselect */
arch/parisc/kernel/syscall_table.S +1 -0
@@ -427,6 +427,7 @@ ENTRY_COMP(open_by_handle_at) ENTRY_SAME(syncfs) ENTRY_SAME(setns) + ENTRY_COMP(sendmmsg) /* Nothing yet */
PATCH 7/90 Fix futex support
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Carlos O'Donell <[email protected]>
commit d9ba5fe76d604514444b1ea0a19f38c6196a46e3 upstream.
Implements futex op support and makes futex cmpxchg atomic. Tested on 64-bit SMP kernel running on 2 x PA8700s.
--- arch/parisc/include/asm/futex.h | 66 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 6 deletions(-)
arch/parisc/include/asm/futex.h +60 -6
@@ -5,11 +5,14 @@#include <linux/futex.h> #include <linux/uaccess.h> +#include <asm/atomic.h> #include <asm/errno.h> static inline int futex_atomic_op_inuser (int encoded_op,u32 __user *uaddr) { +unsigned long int flags; +u32 val;int op = (encoded_op >>28 ) &7 ;int cmp = (encoded_op >>24 ) &15 ;int oparg = (encoded_op <<8 ) >>20 ;
@@ -18,21 +21,58 @@ futex_atomic_op_inuser (int encoded_op,if (encoded_op & (FUTEX_OP_OPARG_SHIFT <<28 )) oparg =1 << oparg; -if (!access_ok (VERIFY_WRITE , uaddr,sizeof (u32))) +if (!access_ok (VERIFY_WRITE , uaddr,sizeof (*uaddr)))return -EFAULT ;pagefault_disable (); +_atomic_spin_lock_irqsave (uaddr, flags); +switch (op) {case FUTEX_OP_SET : +/* *(int *)UADDR2 = OPARG; */ + ret =get_user (oldval, uaddr); +if (!ret) + ret =put_user (oparg, uaddr); +break ;case FUTEX_OP_ADD : +/* *(int *)UADDR2 += OPARG; */ + ret =get_user (oldval, uaddr); +if (!ret) { + val = oldval + oparg; + ret =put_user (val, uaddr); + } +break ;case FUTEX_OP_OR : +/* *(int *)UADDR2 |= OPARG; */ + ret =get_user (oldval, uaddr); +if (!ret) { + val = oldval | oparg; + ret =put_user (val, uaddr); + } +break ;case FUTEX_OP_ANDN : +/* *(int *)UADDR2 &= ~OPARG; */ + ret =get_user (oldval, uaddr); +if (!ret) { + val = oldval & ~oparg; + ret =put_user (val, uaddr); + } +break ;case FUTEX_OP_XOR : +/* *(int *)UADDR2 ^= OPARG; */ + ret =get_user (oldval, uaddr); +if (!ret) { + val = oldval ^ oparg; + ret =put_user (val, uaddr); + } +break ;default : ret = -ENOSYS ; } +_atomic_spin_unlock_irqrestore (uaddr, flags); +pagefault_enable ();if (!ret) {
@@ -54,7 +94,9 @@ static inline intfutex_atomic_cmpxchg_inatomic (u32 *uval, u32__user *uaddr, u32 oldval, u32 newval) { +int ret;u32 val; +unsigned long flags;/* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is * our gateway page, and causes no end of trouble...
@@ -65,12 +107,24 @@ futex_atomic_cmpxchg_inatomic(u32 *uval,if (!access_ok (VERIFY_WRITE , uaddr,sizeof (u32)))return -EFAULT ; -if (get_user (val, uaddr)) -return -EFAULT ; -if (val == oldval &&put_user (newval, uaddr)) -return -EFAULT ; +/* HPPA has no cmpxchg in hardware and therefore the +* best we can do here is use an array of locks. The +* lock selected is based on a hash of the userspace +* address. This should scale to a couple of CPUs. +*/ + +_atomic_spin_lock_irqsave (uaddr, flags); + + ret =get_user (val, uaddr); + +if (!ret && val == oldval) + ret =put_user (newval, uaddr); + *uval = val; - return 0; + +_atomic_spin_unlock_irqrestore (uaddr, flags); + + return ret; }#endif /*__KERNEL__*/
PATCH 8/90 fix return type of __atomic64_add_return
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: John David Anglin <[email protected]>
commit 548c210fbffdb008a80fa41ff0cb3965f185583d upstream.
The return type of __atomic64_add_return of should be s64 or long, not int. This fixes the atomic64 test failure that I previously reported.
--- arch/parisc/include/asm/atomic.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/parisc/include/asm/atomic.h +2 -2
@@ -259,10 +259,10 @@ static __inline__ int atomic_add_unless(#define ATOMIC64_INIT (i) ((atomic64_t) { (i) }) -static __inline__int +static __inline__s64 __atomic64_add_return (s64 i,atomic64_t *v) { -int ret; +s64 ret;unsigned long flags;_atomic_spin_lock_irqsave (v, flags);
PATCH 9/90 rt2x00: rt2800: fix zeroing skb structure
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit b52398b6e4522176dd125722c72c301015d24520 upstream.
We should clear skb->data not skb itself. Bug was introduced by:
commit 0b8004aa12d13ec750d102ba4082a95f0107c649 "rt2x00: Properly reserve room for descriptors in skbs".
--- drivers/net/wireless/rt2x00/rt2800lib.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2800lib.c +1 -2
@@ -784,8 +784,7 @@ void rt2800_write_beacon(struct queue_en/* * Add space for the TXWI in front of the skb. */ -skb_push (entry->skb,TXWI_DESC_SIZE ); -memset (entry->skb,0 ,TXWI_DESC_SIZE ); +memset (skb_push (entry->skb,TXWI_DESC_SIZE ),0 ,TXWI_DESC_SIZE );/* * Register descriptor details in skb frame descriptor.
PATCH 10/90 rt2x00: fix usage of NULL queue
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit 00898a47269ae5e6dda04defad00234b96692d95 upstream.
We may call rt2x00queue_pause_queue(queue) with queue == NULL. Bug was introduced by commit 62fe778412b36791b7897cfa139342906fbbf07b "rt2x00: Fix stuck queue in tx failure case" .
--- drivers/net/wireless/rt2x00/rt2x00mac.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/rt2x00/rt2x00mac.c +3 -2
@@ -113,7 +113,7 @@ void rt2x00mac_tx(struct ieee80211_hw *h* due to possible race conditions in mac80211. */ if (!test_bit (DEVICE_STATE_PRESENT , &rt2x00dev->flags)) - goto exit_fail; + goto exit_free_skb;/* * Use the ATIM queue if appropriate and present.
@@ -127,7 +127,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hERROR (rt2x00dev,"Attempt to send packet over invalid queue %d.\n" "Please file bug report to %s.\n" , qid,DRV_PROJECT ); - goto exit_fail; + goto exit_free_skb; }/*
@@ -159,6 +159,7 @@ void rt2x00mac_tx(struct ieee80211_hw *h exit_fail:rt2x00queue_pause_queue (queue); + exit_free_skb:dev_kfree_skb_any (skb); }EXPORT_SYMBOL_GPL (rt2x00mac_tx);
PATCH 11/90 rtlwifi: Fix kernel oops on ARM SOC
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Larry Finger <[email protected]>
commit b6b67df3f24c45af0012ee3c8af2f62ca083ae18 upstream.
This driver uses information from the self member of the pci_bus struct to get information regarding the bridge to which the PCIe device is attached. Unfortunately, this member is not established on all architectures, which leads to a kernel oops.
Skipping the entire block that uses the self member to determine the bridge vendor will only affect RTL8192DE devices as that driver sets the ASPM support flag differently when the bridge vendor is Intel. If the self member is available, there is no functional change.
This patch fixes Bugzilla No. 40212.
--- drivers/net/wireless/rtlwifi/pci.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
drivers/net/wireless/rtlwifi/pci.c +11 -9
@@ -1709,15 +1709,17 @@ static bool _rtl_pci_find_adapter(struct pcipriv->ndis_adapter.devnumber =PCI_SLOT (pdev->devfn); pcipriv->ndis_adapter.funcnumber =PCI_FUNC (pdev->devfn); -/*find bridge info */ - pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; -for (tmp =0 ; tmp <PCI_BRIDGE_VENDOR_MAX ; tmp++) { -if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { - pcipriv->ndis_adapter.pcibridge_vendor = tmp; -RT_TRACE (rtlpriv,COMP_INIT ,DBG_DMESG , - ("Pci Bridge Vendor is found index: %d\n" , - tmp)); -break ; +if (bridge_pdev) { +/*find bridge info if available */ + pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; +for (tmp =0 ; tmp <PCI_BRIDGE_VENDOR_MAX ; tmp++) { +if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { + pcipriv->ndis_adapter.pcibridge_vendor = tmp; +RT_TRACE (rtlpriv,COMP_INIT ,DBG_DMESG , + ("Pci Bridge Vendor is found index:" +" %d\n" , tmp)); +break ; + } } }
PATCH 12/90 iwlegacy: set tx power after rxon_assoc
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit 17e859a899712d16c3e70b045d61ad9e02c53f8a upstream.
If settings of tx power was deferred during scan or changing channel we have to setup them during commit rxon. Fix problem on 3945 (4965 already has this fix).
Optimize code to apply tx settings only when tx power was actually changed.
--- drivers/net/wireless/iwlegacy/iwl-3945.c | 6 +++++- drivers/net/wireless/iwlegacy/iwl-4965.c | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-)
drivers/net/wireless/iwlegacy/iwl-3945.c +5 -1
@@ -1747,7 +1747,11 @@ int iwl3945_commit_rxon(struct iwl_priv }memcpy (active_rxon, staging_rxon,sizeof (*active_rxon)); - +/* +* We do not commit tx power settings while channel changing, +* do it now if tx power changed. +*/ +iwl_legacy_set_tx_power (priv, priv->tx_power_next, false);return 0 ; }
drivers/net/wireless/iwlegacy/iwl-4965.c +6 -2
@@ -1237,7 +1237,12 @@ static int iwl4965_commit_rxon(struct iwmemcpy (active_rxon, &ctx->staging,sizeof (*active_rxon));iwl_legacy_print_rx_config_cmd (priv, ctx); - goto set_tx_power; +/* +* We do not commit tx power settings while channel changing, +* do it now if tx power changed. +*/ +iwl_legacy_set_tx_power (priv, priv->tx_power_next, false); +return 0 ; }/* If we are currently associated and the new config requires
@@ -1317,7 +1322,6 @@ static int iwl4965_commit_rxon(struct iwiwl4965_init_sensitivity (priv); -set_tx_power:/* If we issue a new RXON command which required a tune then we must * send a new TXPOWER command or we won't be able to Tx any frames */ ret =iwl_legacy_set_tx_power (priv, priv->tx_power_next, true);
PATCH 13/90 ath9k: initialize tx chainmask before testing channel tx power values
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Felix Fietkau <[email protected]>
commit c1227340ca65c2069222a956a68b6842d460c4f4 upstream.
With an uninitialized chainmask, the per-channel power will only contain the power limits for a single chain instead of the combined tx power.
--- drivers/net/wireless/ath/ath9k/init.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/ath/ath9k/init.c +2 -0
@@ -665,8 +665,10 @@ static void ath9k_init_band_txpower(strustatic void ath9k_init_txpower_limits (struct ath_softc *sc) {struct ath_hw *ah = sc->sc_ah; +struct ath_common *common =ath9k_hw_common (sc->sc_ah);struct ath9k_channel *curchan = ah->curchan; + ah->txchainmask = common->tx_chainmask;if (ah->caps.hw_caps &ATH9K_HW_CAP_2GHZ )ath9k_init_band_txpower (sc,IEEE80211_BAND_2GHZ );if (ah->caps.hw_caps &ATH9K_HW_CAP_5GHZ )
PATCH 14/90 ath9k: skip ->config_pci_powersave() if PCIe port has ASPM disabled
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit d4930086bdd0c08a8b3a4d66a9c702297cb74a99 upstream.
We receive many bug reports about system hang during suspend/resume when ath9k driver is in use. Adrian Chadd remarked that this problem happens on systems that have ASPM disabled.
To do not hit the bug, skip doing ->config_pci_powersave magic if PCIe downstream port device, which ath9k device is connected to, has ASPM disabled.
Bug was introduced by:
commit 53bc7aa08b48e5cd745f986731cc7dc24eef2a9f
Author: Vivek Natarajan <[email protected]> Date: Mon Apr 5 14:48:04 2010 +0530
ath9k: Add support for newer AR9285 chipsets.
Patch should address:
https://bugzilla.kernel.org/show_bug.cgi?id=37462
https://bugzilla.kernel.org/show_bug.cgi?id=37082
https://bugzilla.redhat.com/show_bug.cgi?id=697157
however I did not receive confirmation about that, except from Camilo Mesias, whose system stops hang regularly with this patch (but still hangs from time to time, but this is probably some other bug).
--- drivers/net/wireless/ath/ath9k/ar9002_hw.c | 6 +----- drivers/net/wireless/ath/ath9k/ar9003_hw.c | 6 +----- drivers/net/wireless/ath/ath9k/hw.c | 11 +++++++++-- drivers/net/wireless/ath/ath9k/hw.h | 3 ++- drivers/net/wireless/ath/ath9k/pci.c | 27 +++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 13 deletions(-)
drivers/net/wireless/ath/ath9k/ar9002_hw.c +1 -5
@@ -309,11 +309,7 @@ static void ar9002_hw_configpcipowersaveu8 i;u32 val; -if (ah->is_pciexpress != true) -return ; - -/* Do not touch SerDes registers */ -if (ah->config.pcie_powersave_enable ==2 ) +if (ah->is_pciexpress != true || ah->aspm_enabled != true)return ;/* Nothing to do on restore for 11N */
drivers/net/wireless/ath/ath9k/ar9003_hw.c +1 -5
@@ -351,11 +351,7 @@ static void ar9003_hw_configpcipowersave int restore, int power_off) { -if (ah->is_pciexpress != true) -return ; - -/* Do not touch SerDes registers */ -if (ah->config.pcie_powersave_enable ==2 ) +if (ah->is_pciexpress != true || ah->aspm_enabled != true)return ;/* Nothing to do on restore for 11N */
drivers/net/wireless/ath/ath9k/hw.c +9 -2
@@ -299,6 +299,14 @@ static void ath9k_hw_disablepcie(structREG_WRITE (ah,AR_PCIE_SERDES2 ,0x00000000 ); } +static void ath9k_hw_aspm_init (struct ath_hw *ah) +{ +struct ath_common *common =ath9k_hw_common (ah); + +if (common->bus_ops->aspm_init) + common->bus_ops->aspm_init (common); +} +/* This should work for all families including legacy */ static bool ath9k_hw_chip_test (struct ath_hw *ah) {
@@ -359,7 +367,6 @@ static void ath9k_hw_init_config(struct ah->config.additional_swba_backoff =0 ; ah->config.ack_6mb =0x0 ; ah->config.cwm_ignore_extcca =0 ; - ah->config.pcie_powersave_enable =0 ; ah->config.pcie_clock_req =0 ; ah->config.pcie_waen =0 ; ah->config.analog_shiftreg =1 ;
@@ -577,7 +584,7 @@ static int __ath9k_hw_init(struct ath_hwif (ah->is_pciexpress) -ath9k_hw_configpcipowersave (ah,0 ,0 ); +ath9k_hw_aspm_init (ah);else ath9k_hw_disablepcie (ah);
drivers/net/wireless/ath/ath9k/hw.h +2 -1
@@ -215,7 +215,6 @@ struct ath9k_ops_config {int additional_swba_backoff;int ack_6mb;u32 cwm_ignore_extcca; -u8 pcie_powersave_enable;bool pcieSerDesWrite;u8 pcie_clock_req;u32 pcie_waen;
@@ -671,6 +670,7 @@ struct ath_hw {bool sw_mgmt_crypto;bool is_pciexpress; +bool aspm_enabled;bool is_monitoring;bool need_an_top2_fixup;u16 tx_trig_level;
@@ -870,6 +870,7 @@ struct ath_bus_ops {bool (*eeprom_read)(struct ath_common *common,u32 off,u16 *data);void (*bt_coex_prep)(struct ath_common *common);void (*extn_synch_en)(struct ath_common *common); +void (*aspm_init)(struct ath_common *common); };static inline struct ath_common *ath9k_hw_common (struct ath_hw *ah)
drivers/net/wireless/ath/ath9k/pci.c +27 -0
@@ -16,6 +16,7 @@#include <linux/nl80211.h> #include <linux/pci.h> +#include <linux/pci-aspm.h> #include <linux/ath9k_platform.h> #include "ath9k.h"
@@ -115,12 +116,38 @@ static void ath_pci_extn_synch_enable(stpci_write_config_byte (pdev, sc->sc_ah->caps.pcie_lcr_offset, lnkctl); } +static void ath_pci_aspm_init (struct ath_common *common) +{ +struct ath_softc *sc = (struct ath_softc *) common->priv; +struct ath_hw *ah = sc->sc_ah; +struct pci_dev *pdev =to_pci_dev (sc->dev); +struct pci_dev *parent; +int pos; +u8 aspm; + +if (!pci_is_pcie (pdev)) +return ; + + parent = pdev->bus->self; +if (WARN_ON (!parent)) +return ; + + pos =pci_pcie_cap (parent); +pci_read_config_byte (parent, pos +PCI_EXP_LNKCTL , &aspm); +if (aspm & (PCIE_LINK_STATE_L0S |PCIE_LINK_STATE_L1 )) { + ah->aspm_enabled = true; +/* Initialize PCIe PM and SERDES registers. */ +ath9k_hw_configpcipowersave (ah,0 ,0 ); + } +} +static const struct ath_bus_ops ath_pci_bus_ops = { .ath_bus_type =ATH_PCI , .read_cachesize = ath_pci_read_cachesize, .eeprom_read = ath_pci_eeprom_read, .bt_coex_prep = ath_pci_bt_coex_prep, .extn_synch_en = ath_pci_extn_synch_enable, + .aspm_init = ath_pci_aspm_init, };static int ath_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id)
PATCH 15/90 net: sendmmsg should only return an error if no messages were sent
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit 728ffb86f10873aaf4abd26dde691ee40ae731fe upstream.
sendmmsg uses a similar error return strategy as recvmmsg but it turns out to be a confusing way to communicate errors.
The current code stores the error code away and returns it on the next sendmmsg call. This means a call with completely valid arguments could get an error from a previous call.
Change things so we only return an error if no datagrams could be sent. If less than the requested number of messages were sent, the application must retry starting at the first failed one and if the problem is persistent the error will be returned.
This matches the behaviour of other syscalls like read/write - it is not an error if less than the requested number of elements are sent.
--- net/socket.c | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-)
net/socket.c +3 -24
@@ -2005,12 +2005,9 @@ int __sys_sendmmsg(int fd, struct mmsghdif (!sock)return err; - err =sock_error (sock->sk); -if (err) - goto out_put; - entry = mmsg; compat_entry = (struct compat_mmsghdr __user *)mmsg; + err =0 ;while (datagrams < vlen) {/*
@@ -2037,29 +2034,11 @@ int __sys_sendmmsg(int fd, struct mmsghd ++datagrams; } -out_put:fput_light (sock->file, fput_needed); -if (err ==0 ) -return datagrams; - -if (datagrams !=0 ) { -/* -* We may send less entries than requested (vlen) if the -* sock is non blocking... -*/ -if (err != -EAGAIN ) { -/* -* ... or if sendmsg returns an error after we -* send some datagrams, where we record the -* error to return on the next call or if the -* app asks about it using getsockopt(SO_ERROR). -*/ - sock->sk->sk_err = -err; - } - +/* We only return an error if no datagrams were able to be sent */ +if (datagrams !=0 )return datagrams; - }return err; }
PATCH 16/90 net: Cap number of elements for sendmmsg
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit 98382f419f32d2c12d021943b87dea555677144b upstream.
To limit the amount of time we can spend in sendmmsg, cap the number of elements to UIO_MAXIOV (currently 1024).
For error handling an application using sendmmsg needs to retry at the first unsent message, so capping is simpler and requires less application logic than returning EINVAL.
--- net/socket.c | 3 +++ 1 file changed, 3 insertions(+)
net/socket.c +3 -0
@@ -1999,6 +1999,9 @@ int __sys_sendmmsg(int fd, struct mmsghdstruct compat_mmsghdr __user *compat_entry;struct msghdr msg_sys; +if (vlen >UIO_MAXIOV ) + vlen =UIO_MAXIOV ; + datagrams =0 ; sock =sockfd_lookup_light (fd, &err, &fput_needed);
PATCH 17/90 net: Fix security_socket_sendmsg() bypass problem.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tetsuo Handa <[email protected]>
commit c71d8ebe7a4496fb7231151cb70a6baa0cb56f9a upstream.
The sendmmsg() introduced by commit 228e548e "net: Add sendmmsg socket system call" is capable of sending to multiple different destination addresses.
SMACK is using destination's address for checking sendmsg() permission. However, security_socket_sendmsg() is called for only once even if multiple different destination addresses are passed to sendmmsg().
Therefore, we need to call security_socket_sendmsg() for each destination address rather than only the first destination address.
Since calling security_socket_sendmsg() every time when only single destination address was passed to sendmmsg() is a waste of time, omit calling security_socket_sendmsg() unless destination address of previous datagram and that of current datagram differs.
--- net/socket.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-)
net/socket.c +34 -9
@@ -1871,8 +1871,14 @@ SYSCALL_DEFINE2(shutdown, int, fd, int,#define COMPAT_NAMELEN (msg) COMPAT_MSG(msg, msg_namelen)#define COMPAT_FLAGS (msg) COMPAT_MSG(msg, msg_flags) +struct used_address { +struct sockaddr_storage name; +unsigned int name_len; +}; +static int __sys_sendmsg (struct socket *sock,struct msghdr __user *msg, -struct msghdr *msg_sys,unsigned flags,int nosec) +struct msghdr *msg_sys,unsigned flags, +struct used_address *used_address) {struct compat_msghdr __user *msg_compat = (struct compat_msghdr __user *)msg;
@@ -1953,8 +1959,28 @@ static int __sys_sendmsg(struct socket *if (sock->file->f_flags &O_NONBLOCK ) msg_sys->msg_flags |=MSG_DONTWAIT ; - err = (nosec ? sock_sendmsg_nosec : sock_sendmsg)(sock, msg_sys, - total_len); +/* +* If this is sendmmsg() and current destination address is same as +* previously succeeded address, omit asking LSM's decision. +* used_address->name_len is initialized to UINT_MAX so that the first +* destination address never matches. +*/ +if (used_address && used_address->name_len == msg_sys->msg_namelen && + !memcmp (&used_address->name, msg->msg_name, + used_address->name_len)) { + err =sock_sendmsg_nosec (sock, msg_sys, total_len); + goto out_freectl; + } + err =sock_sendmsg (sock, msg_sys, total_len); +/* +* If this is sendmmsg() and sending to current destination address was +* successful, remember it. +*/ +if (used_address && err >=0 ) { + used_address->name_len = msg_sys->msg_namelen; +memcpy (&used_address->name, msg->msg_name, + used_address->name_len); + } out_freectl:if (ctl_buf != ctl)
@@ -1979,7 +2005,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, structif (!sock) goto out; - err =__sys_sendmsg (sock, msg, &msg_sys, flags,0 ); + err =__sys_sendmsg (sock, msg, &msg_sys, flags,NULL );fput_light (sock->file, fput_needed); out:
@@ -1998,6 +2024,7 @@ int __sys_sendmmsg(int fd, struct mmsghdstruct mmsghdr __user *entry;struct compat_mmsghdr __user *compat_entry;struct msghdr msg_sys; +struct used_address used_address;if (vlen >UIO_MAXIOV ) vlen =UIO_MAXIOV ;
@@ -2008,24 +2035,22 @@ int __sys_sendmmsg(int fd, struct mmsghdif (!sock)return err; + used_address.name_len =UINT_MAX ; entry = mmsg; compat_entry = (struct compat_mmsghdr __user *)mmsg; err =0 ;while (datagrams < vlen) { -/* -* No need to ask LSM for more than the first datagram. -*/ if (MSG_CMSG_COMPAT & flags) { err =__sys_sendmsg (sock, (struct msghdr __user *)compat_entry, - &msg_sys, flags, datagrams); + &msg_sys, flags, &used_address);if (err <0 )break ; err =__put_user (err, &compat_entry->msg_len); ++compat_entry; }else { err =__sys_sendmsg (sock, (struct msghdr __user *)entry, - &msg_sys, flags, datagrams); + &msg_sys, flags, &used_address);if (err <0 )break ; err =put_user (err, &entry->msg_len);
PATCH 18/90 xen: allow enable use of VGA console on dom0
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeremy Fitzhardinge <[email protected]>
commit c2419b4a4727f67af2fc2cd68b0d878b75e781bb upstream.
Get the information about the VGA console hardware from Xen, and put it into the form the bootloader normally generates, so that the rest of the kernel can deal with VGA as usual.
[ Impact: make VGA console work in dom0 ]
--- arch/x86/xen/Makefile | 2 - arch/x86/xen/enlighten.c | 8 +++++ arch/x86/xen/vga.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ arch/x86/xen/xen-ops.h | 11 +++++++ include/xen/interface/xen.h | 39 +++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 1 deletion(-)
arch/x86/xen/Makefile +1 -1
@@ -18,5 +18,5 @@ obj-y := enlighten.o setup.o multicalls obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o - +obj-$(CONFIG_XEN_DOM0) += vga.o obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o
arch/x86/xen/enlighten.c +8 -0
@@ -1248,6 +1248,14 @@ asmlinkage void __init xen_start_kernel(if (pci_xen) x86_init.pci.arch_init = pci_xen_init; }else { +const struct dom0_vga_console_info *info = + (void *)((char *)xen_start_info + + xen_start_info->console.dom0.info_off); + +xen_init_vga (info, xen_start_info->console.dom0.info_size); + xen_start_info->console.domU.mfn =0 ; + xen_start_info->console.domU.evtchn =0 ; +/* Make sure ACS will be enabled */ pci_request_acs (); }
arch/x86/xen/vga.c new file +67 -0
67 lines not on this page · raw message
arch/x86/xen/xen-ops.h +11 -0
@@ -88,6 +88,17 @@ static inline void xen_uninit_lock_cpu(i }#endif +struct dom0_vga_console_info ; + +#ifdef CONFIG_XEN_DOM0 +void __init xen_init_vga (const struct dom0_vga_console_info *,size_t size); +#else +static inline void __init xen_init_vga (const struct dom0_vga_console_info *info, +size_t size) +{ +} +#endif +/* Declare an asm function, along with symbols needed to make it inlineable */ #define DECL_ASM (ret, name, ...) \
include/xen/interface/xen.h +39 -0
@@ -450,6 +450,45 @@ struct start_info {int8_t cmd_line[MAX_GUEST_CMDLINE ]; }; +struct dom0_vga_console_info { +uint8_t video_type; +#define XEN_VGATYPE_TEXT_MODE_3 0x03 +#define XEN_VGATYPE_VESA_LFB 0x23 + +union { +struct { +/* Font height, in pixels. */ +uint16_t font_height; +/* Cursor location (column, row). */ +uint16_t cursor_x, cursor_y; +/* Number of rows and columns (dimensions in characters). */ +uint16_t rows, columns; + } text_mode_3; + +struct { +/* Width and height, in pixels. */ +uint16_t width, height; +/* Bytes per scan line. */ +uint16_t bytes_per_line; +/* Bits per pixel. */ +uint16_t bits_per_pixel; +/* LFB physical address, and size (in units of 64kB). */ +uint32_t lfb_base; +uint32_t lfb_size; +/* RGB mask offsets and sizes, as defined by VBE 1.2+ */ +uint8_t red_pos, red_size; +uint8_t green_pos, green_size; +uint8_t blue_pos, blue_size; +uint8_t rsvd_pos, rsvd_size; + +/* VESA capabilities (offset 0xa, VESA command 0x4f00). */ +uint32_t gbl_caps; +/* Mode attributes (offset 0x0, VESA command 0x4f01). */ +uint16_t mode_attrs; + } vesa_lfb; + } u; +}; +/* These flags are passed in the 'flags' field of start_info_t. */ #define SIF_PRIVILEGED (1<<0)/* Is the domain privileged? */ #define SIF_INITDOMAIN (1<<1)/* Is this the initial control domain? */
PATCH 19/90 drm: Separate EDID Header Check from EDID Block Check
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Reim <[email protected]>
commit 051963d4832ed61e5ae74f5330b0a94489e101b9 upstream.
Provides function drm_edid_header_is_valid() for EDID header check and replaces EDID header check part of function drm_edid_block_valid() by a call of drm_edid_header_is_valid().
This is a prerequisite to extend DDC probing, e. g. in function radeon_ddc_probe() for Radeon devices, by a central EDID header check.
Tested for kernel 2.6.35, 2.6.38 and 3.0
--- drivers/gpu/drm/drm_edid.c | 24 ++++++++++++++++++------ include/drm/drm_crtc.h | 1 + 2 files changed, 19 insertions(+), 6 deletions(-)
drivers/gpu/drm/drm_edid.c +18 -6
@@ -127,6 +127,23 @@ static const u8 edid_header[] = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }; +/* +* Sanity check the header of the base EDID block. Return 8 if the header +* is perfect, down to 0 if it's totally wrong. +*/ +int drm_edid_header_is_valid (const u8 *raw_edid) +{ +int i, score =0 ; + +for (i =0 ; i <sizeof (edid_header); i++) +if (raw_edid[i] == edid_header[i]) + score++; + +return score; +} +EXPORT_SYMBOL (drm_edid_header_is_valid); + +/* * Sanity check the EDID block (base or extension). Return 0 if the block * doesn't check out, or 1 if it's valid.
@@ -139,12 +156,7 @@ drm_edid_block_valid(u8 *raw_edid)struct edid *edid = (struct edid *)raw_edid;if (raw_edid[0 ] ==0x00 ) { -int score =0 ; - -for (i =0 ; i <sizeof (edid_header); i++) -if (raw_edid[i] == edid_header[i]) - score++; - +int score =drm_edid_header_is_valid (raw_edid);if (score ==8 ) ;else if (score >=6 ) {DRM_DEBUG ("Fixing EDID header, your hardware may be failing\n" );
include/drm/drm_crtc.h +1 -0
@@ -802,6 +802,7 @@ extern struct drm_display_mode *drm_gtf_extern int drm_add_modes_noedid (struct drm_connector *connector,int hdisplay,int vdisplay); +extern int drm_edid_header_is_valid (const u8 *raw_edid);extern bool drm_edid_is_valid (struct edid *edid);struct drm_display_mode *drm_mode_find_dmt (struct drm_device *dev,int hsize,int vsize,int fresh);
PATCH 20/90 drm/radeon: Extended DDC Probing for Connectors with Improperly Wired DDC Lines (here: Asus M2A-VM HDMI)
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Reim <[email protected]>
commit e384fab8c6f3ca88600bcb2ebdf0eb2f90864fab upstream.
Some integrated ATI Radeon chipset implementations with add-on HDMI card (e. g. Asus M2A-VM HDMI) indicate the availability of a DDC even when the add-on card is not plugged in or HDMI is disabled in BIOS setup. In this case, drm_get_edid() and drm_edid_block_valid() periodically dump data and kernel errors into system log files and onto terminals. For these connectors DDC probing is extended by a check for a correct EDID header. Only in case a valid EDID header is also found, the (HDMI or DVI) connector will be used by the Radeon driver. This prevents the kernel driver from useless flooding of logs and terminal sessions with EDID dumps and error messages.
This patch adds a flag 'requires_extended_probe' to the radeon_connector structure. In function radeon_connector_needs_extended_probe() this flag can be set on a chipset family/vendor/connector type specific basis. In addition, function radeon_ddc_probe() has been adapted to perform extended DDC probing if required by the connector's flag. Requires function drm_edid_header_is_valid() in DRM module provided by [PATCH] drm: Separate EDID Header Check from EDID Block Check.
Tested for kernel 2.6.35, 2.6.38 and 3.0 on Asus M2A-VM HDMI board
--- drivers/gpu/drm/radeon/radeon_connectors.c | 45 +++++++++++++++++++++++++++-- drivers/gpu/drm/radeon/radeon_display.c | 9 +++++ drivers/gpu/drm/radeon/radeon_i2c.c | 32 +++++++++++++++----- drivers/gpu/drm/radeon/radeon_mode.h | 6 +++ 4 files changed, 80 insertions(+), 12 deletions(-)
drivers/gpu/drm/radeon/radeon_connectors.c +42 -3
@@ -430,6 +430,36 @@ int radeon_connector_set_property(structreturn 0 ; } +/* +* Some integrated ATI Radeon chipset implementations (e. g. +* Asus M2A-VM HDMI) may indicate the availability of a DDC, +* even when there's no monitor connected. For these connectors +* following DDC probe extension will be applied: check also for the +* availability of EDID with at least a correct EDID header. Only then, +* DDC is assumed to be available. This prevents drm_get_edid() and +* drm_edid_block_valid() from periodically dumping data and kernel +* errors into the logs and onto the terminal. +*/ +static bool radeon_connector_needs_extended_probe (struct radeon_device *dev, +uint32_t supported_device, +int connector_type) +{ +/* Asus M2A-VM HDMI board sends data to i2c bus even, +* if HDMI add-on card is not plugged in or HDMI is disabled in +* BIOS. Valid DDC can only be assumed, if also a valid EDID header +* can be retrieved via i2c bus during DDC probe */ +if ((dev->pdev->device ==0x791e ) && + (dev->pdev->subsystem_vendor ==0x1043 ) && + (dev->pdev->subsystem_device ==0x826d )) { +if ((connector_type ==DRM_MODE_CONNECTOR_HDMIA ) && + (supported_device ==ATOM_DEVICE_DFP2_SUPPORT )) +return true; + } + +/* Default: no EDID header probe required for DDC probing */ +return false; +} +static void radeon_fixup_lvds_native_mode (struct drm_encoder *encoder,struct drm_connector *connector) {
@@ -661,7 +691,8 @@ radeon_vga_detect(struct drm_connector * ret = connector_status_disconnected;if (radeon_connector->ddc_bus) - dret =radeon_ddc_probe (radeon_connector); + dret =radeon_ddc_probe (radeon_connector, + radeon_connector->requires_extended_probe);if (dret) {if (radeon_connector->edid) {kfree (radeon_connector->edid);
@@ -833,7 +864,8 @@ radeon_dvi_detect(struct drm_connector *bool dret = false;if (radeon_connector->ddc_bus) - dret =radeon_ddc_probe (radeon_connector); + dret =radeon_ddc_probe (radeon_connector, + radeon_connector->requires_extended_probe);if (dret) {if (radeon_connector->edid) {kfree (radeon_connector->edid);
@@ -1251,7 +1283,8 @@ radeon_dp_detect(struct drm_connector *cif (radeon_dp_getdpcd (radeon_connector)) ret = connector_status_connected; }else { -if (radeon_ddc_probe (radeon_connector)) +if (radeon_ddc_probe (radeon_connector, + radeon_connector->requires_extended_probe)) ret = connector_status_connected; } }
@@ -1406,6 +1439,9 @@ radeon_add_atom_connector(struct drm_dev radeon_connector->shared_ddc = shared_ddc; radeon_connector->connector_object_id = connector_object_id; radeon_connector->hpd = *hpd; + radeon_connector->requires_extended_probe = +radeon_connector_needs_extended_probe (rdev, supported_device, + connector_type); radeon_connector->router = *router;if (router->ddc_valid || router->cd_valid) { radeon_connector->router_bus =radeon_i2c_lookup (rdev, &router->i2c_info);
@@ -1752,6 +1788,9 @@ radeon_add_legacy_connector(struct drm_d radeon_connector->devices = supported_device; radeon_connector->connector_object_id = connector_object_id; radeon_connector->hpd = *hpd; + radeon_connector->requires_extended_probe = +radeon_connector_needs_extended_probe (rdev, supported_device, + connector_type);switch (connector_type) {case DRM_MODE_CONNECTOR_VGA :drm_connector_init (dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
drivers/gpu/drm/radeon/radeon_display.c +9 -0
@@ -777,8 +777,17 @@ static int radeon_ddc_dump(struct drm_coif (!radeon_connector->ddc_bus)return -1 ; edid =drm_get_edid (connector, &radeon_connector->ddc_bus->adapter); +/* Log EDID retrieval status here. In particular with regard to +* connectors with requires_extended_probe flag set, that will prevent +* function radeon_dvi_detect() to fetch EDID on this connector, +* as long as there is no valid EDID header found */ if (edid) { +DRM_INFO ("Radeon display connector %s: Found valid EDID" , +drm_get_connector_name (connector));kfree (edid); + }else { +DRM_INFO ("Radeon display connector %s: No monitor connected or invalid EDID" , +drm_get_connector_name (connector)); }return ret; }
drivers/gpu/drm/radeon/radeon_i2c.c +24 -8
@@ -32,17 +32,17 @@* radeon_ddc_probe * */ -bool radeon_ddc_probe (struct radeon_connector *radeon_connector) +bool radeon_ddc_probe (struct radeon_connector *radeon_connector,bool requires_extended_probe) { -u8 out_buf[] = {0x0 ,0x0 }; -u8 buf[2 ]; +u8 out =0x0 ; +u8 buf[8 ];int ret;struct i2c_msg msgs[] = { { .addr =0x50 , .flags =0 , .len =1 , - .buf = out_buf, + .buf = &out, }, { .addr =0x50 ,
@@ -52,15 +52,31 @@ bool radeon_ddc_probe(struct radeon_conn } }; +/* Read 8 bytes from i2c for extended probe of EDID header */ +if (requires_extended_probe) + msgs[1 ].len =8 ; +/* on hw with routers, select right port */ if (radeon_connector->router.ddc_valid)radeon_router_select_ddc_port (radeon_connector); ret =i2c_transfer (&radeon_connector->ddc_bus->adapter, msgs,2 ); -if (ret ==2 ) -return true; - -return false; +if (ret !=2 ) +/* Couldn't find an accessible DDC on this connector */ +return false; +if (requires_extended_probe) { +/* Probe also for valid EDID header +* EDID header starts with: +* 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00. +* Only the first 6 bytes must be valid as +* drm_edid_block_valid() can fix the last 2 bytes */ +if (drm_edid_header_is_valid (buf) <6 ) { +/* Couldn't find an accessible EDID on this +* connector */ +return false; + } + } +return true; }/* bit banging i2c */
drivers/gpu/drm/radeon/radeon_mode.h +5 -1
@@ -438,6 +438,9 @@ struct radeon_connector {struct radeon_i2c_chan *ddc_bus;/* some systems have an hdmi and vga port with a shared ddc line */ bool shared_ddc; +/* for some Radeon chip families we apply an additional EDID header +check as part of the DDC probe */ +bool requires_extended_probe;bool use_digital;/* we need to mind the EDID between detect and get modes due to analog/digital/tvencoder */
@@ -514,7 +517,8 @@ extern void radeon_i2c_put_byte(struct r u8 val);extern void radeon_router_select_ddc_port (struct radeon_connector *radeon_connector);extern void radeon_router_select_cd_port (struct radeon_connector *radeon_connector); -extern bool radeon_ddc_probe (struct radeon_connector *radeon_connector); +extern bool radeon_ddc_probe (struct radeon_connector *radeon_connector, +bool requires_extended_probe);extern int radeon_ddc_get_modes (struct radeon_connector *radeon_connector);extern struct drm_encoder *radeon_best_encoder (struct drm_connector *connector);
PATCH 21/90 drm/radeon: Extended DDC Probing for ECS A740GM-M DVI-D Connector
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Reim <[email protected]>
commit a81b31e9fc98e067b7e7f1244861c97e44268e2d upstream.
ECS A740GM-M with ATI RADEON 2100 sends data to i2c bus for a DVI connector that is not implemented/existent on the board.
Fix by applying extented DDC probing for this connector.
Requires [PATCH] drm/radeon: Extended DDC Probing for Connectors with Improperly Wired DDC Lines
Tested for kernel 2.6.38 on Asus ECS A740GM-M board
--- drivers/gpu/drm/radeon/radeon_connectors.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/gpu/drm/radeon/radeon_connectors.c +9 -0
@@ -455,6 +455,15 @@ static bool radeon_connector_needs_exten (supported_device == ATOM_DEVICE_DFP2_SUPPORT))return true; } +/* ECS A740GM-M with ATI RADEON 2100 sends data to i2c bus +* for a DVI connector that is not implemented */ +if ((dev->pdev->device ==0x796e ) && + (dev->pdev->subsystem_vendor ==0x1019 ) && + (dev->pdev->subsystem_device ==0x2615 )) { +if ((connector_type ==DRM_MODE_CONNECTOR_DVID ) && + (supported_device ==ATOM_DEVICE_DFP2_SUPPORT )) +return true; + }/* Default: no EDID header probe required for DDC probing */ return false;
PATCH 22/90 drm/radeon: Log Subsystem Vendor and Device Information
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Reim <[email protected]>
commit d522d9cc5bdd41214084383fc3e6d882f6916a78 upstream.
Log PCI subsystem vendor and subsystem device ID in addition to PCI vendor and device ID during kernel mode initialisation. This helps to better identify radeon devices of third-party vendors, e. g. for bug analysis.
Tested for kernel 2.6.35, 2.6.38 and 3.0 on Asus M2A-VM HDMI board
--- drivers/gpu/drm/radeon/radeon_device.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/radeon_device.c +3 -2
@@ -704,8 +704,9 @@ int radeon_device_init(struct radeon_dev rdev->gpu_lockup = false; rdev->accel_working = false; -DRM_INFO ("initializing kernel modesetting (%s 0x%04X:0x%04X).\n" , - radeon_family_name[rdev->family], pdev->vendor, pdev->device); +DRM_INFO ("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n" , + radeon_family_name[rdev->family], pdev->vendor, pdev->device, + pdev->subsystem_vendor, pdev->subsystem_device);/* mutex initialization are all done here so we * can recall function without having locking issues */
PATCH 23/90 drm/i915/pch: Fix integer math bugs in panel fitting
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Adam Jackson <[email protected]>
commit 302983e9059e9ef5de3ca7671918eeb237c5971e upstream.
Consider a 1600x900 panel, upscaling a 1360x768 mode, full-aspect. The old math would give you:
scaled_width = 1600 * 768; /* 1228800 */
scaled_height = 1360 * 900; /* 1224000 */
if (scaled_width > scaled_height) { /* pillarbox, and true */
width = 1224000 / 768; /* int(1593.75) = 1593 */
x = (1600 - 1593 + 1) / 2; /* 4 */
y = 0;
height = 768;
} /* ... */This is broken. The total width of scanout would then be 1593 + 4 + 4, or 1601, which is wider than the panel itself. The hardware very dutifully implements this, and you end up with a black 45° diagonal from the top-left corner to the bottom edge of the screen. It's a cool effect and all, but not what you wanted. Similar things happen for the letterbox case.
The problem is that you have an integer number of pixels, which means it's usually impossible to upscale equally on both axes. 1360/768 is 1.7708, 1600/900 is 1.7777. Since we're constrained on the one axis, the other one wants to come out as an even number of pixels (the panel is almost certainly even on both axes, and the x/y offsets will be applied on both sides). In the math above, if 'width' comes out even, rounding down is correct; if it's odd, you'd rather round up. So just increment width/height in those cases.
Tested on a Lenovo T500 (Ironlake).
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=38851
--- drivers/gpu/drm/i915/intel_panel.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/i915/intel_panel.c +4 -0
@@ -83,11 +83,15 @@ intel_pch_panel_fitting(struct drm_devicu32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay;if (scaled_width > scaled_height) {/* pillar */ width = scaled_height / mode->vdisplay; +if (width &1 ) + width++; x = (adjusted_mode->hdisplay - width +1 ) /2 ; y =0 ; height = adjusted_mode->vdisplay; }else if (scaled_width < scaled_height) {/* letter */ height = scaled_width / mode->hdisplay; +if (height &1 ) + height++; y = (adjusted_mode->vdisplay - height +1 ) /2 ; x =0 ; width = adjusted_mode->hdisplay;
PATCH 24/90 drm/i915: load the LUT before pipe enable on ILK+
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jesse Barnes <[email protected]>
commit 9c54c0dd948d715ccfd79e97d852f80eeb53254a upstream.
Per the specs and to address
https://bugs.freedesktop.org/show_bug.cgi?id=36888.
--- drivers/gpu/drm/i915/intel_display.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_display.c +6 -2
@@ -2699,14 +2699,18 @@ static void ironlake_crtc_enable(structI915_WRITE (PF_WIN_SZ (pipe), dev_priv->pch_pf_size); } +/* +* On ILK+ LUT must be loaded before the pipe is running but with +* clocks enabled +*/ +intel_crtc_load_lut (crtc); +intel_enable_pipe (dev_priv, pipe, is_pch_port);intel_enable_plane (dev_priv, plane, pipe);if (is_pch_port)ironlake_pch_enable (crtc); -intel_crtc_load_lut (crtc); -mutex_lock (&dev->struct_mutex);intel_update_fbc (dev);mutex_unlock (&dev->struct_mutex);
PATCH 25/90 drm/i915: Fix typo in DRM_I915_OVERLAY_PUT_IMAGE ioctl define
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ole Henrik Jahren <[email protected]>
commit 842d452985300f4ec14c68cb86046e8a1a3b7251 upstream.
Because of a typo, calling ioctl with DRM_IOCTL_I915_OVERLAY_PUT_IMAGE is broken if the macro is used directly. When using libdrm the bug is not hit, since libdrm handles the ioctl encoding internally.
The typo also leads to the .cmd and .cmd_drv fields of the drm_ioctl structure for DRM_I915_OVERLAY_PUT_IMAGE having inconsistent content.
--- include/drm/i915_drm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/drm/i915_drm.h +1 -1
@@ -237,7 +237,7 @@ typedef struct _drm_i915_sarea {#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture)#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id)#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) -#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_IOCTL_I915_OVERLAY_ATTRS, struct drm_intel_overlay_put_image) +#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image)#define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs)/* Allow drivers to submit batchbuffers directly to hardware, relying
PATCH 26/90 drm/i915: Initialize RCS ring status page address in intel_render_ring_init_dri
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Keith Packard <[email protected]>
commit f3234706a77bd6e1592ae71fb3268e04cb030dba upstream.
Physically-addressed hardware status pages are initialized early in the driver load process by i915_init_phys_hws. For UMS environments, the ring structure is not initialized until the X server starts. At that point, the entire ring structure is re-initialized with all new values. Any values set in the ring structure (including ring->status_page.page_addr) will be lost when the ring is re-initialized.
This patch moves the initialization of the status_page.page_addr value to intel_render_ring_init_dri.
--- drivers/gpu/drm/i915/i915_dma.c | 6 ++---- drivers/gpu/drm/i915/intel_ringbuffer.c | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/i915_dma.c +2 -4
@@ -61,7 +61,6 @@ static void i915_write_hws_pga(struct drstatic int i915_init_phys_hws (struct drm_device *dev) {drm_i915_private_t *dev_priv = dev->dev_private; -struct intel_ring_buffer *ring =LP_RING (dev_priv);/* Program Hardware Status Page */ dev_priv->status_page_dmah =
@@ -71,10 +70,9 @@ static int i915_init_phys_hws(struct drmDRM_ERROR ("Can not allocate hardware status page\n" );return -ENOMEM ; } - ring->status_page.page_addr = - (void __force __iomem *)dev_priv->status_page_dmah->vaddr; -memset_io (ring->status_page.page_addr,0 ,PAGE_SIZE ); +memset_io ((void __force __iomem *)dev_priv->status_page_dmah->vaddr, +0 ,PAGE_SIZE );i915_write_hws_pga (dev);
drivers/gpu/drm/i915/intel_ringbuffer.c +3 -0
@@ -1319,6 +1319,9 @@ int intel_render_ring_init_dri(struct dr ring->get_seqno = pc_render_get_seqno; } +if (!I915_NEED_GFX_HWS (dev)) + ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr; + ring->dev = dev;INIT_LIST_HEAD (&ring->active_list);INIT_LIST_HEAD (&ring->request_list);
PATCH 27/90 drm/i915: Hold mode_config->mutex during hotplug processing
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Keith Packard <[email protected]>
commit a65e34c79c88895766ab1f8a5afa451eed26622b upstream.
Hotplug detection is a mode setting operation and must hold the struct_mutex or risk colliding with other mode setting operations.
In particular, the display port hotplug function attempts to re-train the link if the monitor is supposed to be running when plugged back in. If that happens while mode setting is underway, the link will get scrambled, leaving it in an inconsistent state.
This is a special case -- usually the driver mode setting entry points are covered by the upper level DRM code, but in this case the function is invoked as a work function not under the control of DRM.
--- drivers/gpu/drm/i915/i915_irq.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/i915/i915_irq.c +3 -0
@@ -306,6 +306,7 @@ static void i915_hotplug_work_func(strucstruct drm_mode_config *mode_config = &dev->mode_config;struct intel_encoder *encoder; +mutex_lock (&mode_config->mutex);DRM_DEBUG_KMS ("running encoder hotplug functions\n" );list_for_each_entry (encoder, &mode_config->encoder_list, base.head)
@@ -314,6 +315,8 @@ static void i915_hotplug_work_func(struc/* Just fire off a uevent and let userspace tell us what to do */ drm_helper_hpd_irq_event (dev); + +mutex_unlock (&mode_config->mutex); }static void i915_handle_rps_change (struct drm_device *dev)
PATCH 28/90 drm/i915: Fixup for Hold mode_config->mutex during hotplug
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Keith Packard <[email protected]>
commit 40ee3381dd1010432acc13e907329029096c5bfc upstream.
drm_helper_hpd_irq_event queues another work proc to go and deliver the user-space event, and that function also wants to hold the config mutex, so we shouldn't hold the mutex across the drm_helper_hpd_irq_event call.
--- drivers/gpu/drm/i915/i915_irq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/i915_irq.c +2 -2
@@ -313,10 +313,10 @@ static void i915_hotplug_work_func(strucif (encoder->hot_plug) encoder->hot_plug (encoder); +mutex_unlock (&mode_config->mutex); +/* Just fire off a uevent and let userspace tell us what to do */ drm_helper_hpd_irq_event (dev); - -mutex_unlock (&mode_config->mutex); }static void i915_handle_rps_change (struct drm_device *dev)
PATCH 29/90 crypto: Move md5_transform to lib/md5.c
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
We are going to use this for TCP/IP sequence number and fragment ID generation.
--- crypto/md5.c | 92 ------------------------------------------- include/linux/cryptohash.h | 5 ++ lib/Makefile | 2 lib/md5.c | 95 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 92 deletions(-) create mode 100644 lib/md5.c
crypto/md5.c +1 -91
@@ -21,99 +21,9 @@#include <linux/module.h> #include <linux/string.h> #include <linux/types.h> +#include <linux/cryptohash.h> #include <asm/byteorder.h> -#define F1 (x, y, z) (z ^ (x & (y ^ z))) -#define F2 (x, y, z) F1(z, x, y) -#define F3 (x, y, z) (x ^ y ^ z) -#define F4 (x, y, z) (y ^ (x | ~z)) - -#define MD5STEP (f, w, x, y, z, in, s) \ - (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x) - -static void md5_transform (u32 *hash,u32 const *in) -{ -u32 a, b, c, d; - - a = hash[0 ]; - b = hash[1 ]; - c = hash[2 ]; - d = hash[3 ]; - -MD5STEP (F1 , a, b, c, d, in[0 ] +0xd76aa478 ,7 ); -MD5STEP (F1 , d, a, b, c, in[1 ] +0xe8c7b756 ,12 ); -MD5STEP (F1 , c, d, a, b, in[2 ] +0x242070db ,17 ); -MD5STEP (F1 , b, c, d, a, in[3 ] +0xc1bdceee ,22 ); -MD5STEP (F1 , a, b, c, d, in[4 ] +0xf57c0faf ,7 ); -MD5STEP (F1 , d, a, b, c, in[5 ] +0x4787c62a ,12 ); -MD5STEP (F1 , c, d, a, b, in[6 ] +0xa8304613 ,17 ); -MD5STEP (F1 , b, c, d, a, in[7 ] +0xfd469501 ,22 ); -MD5STEP (F1 , a, b, c, d, in[8 ] +0x698098d8 ,7 ); -MD5STEP (F1 , d, a, b, c, in[9 ] +0x8b44f7af ,12 ); -MD5STEP (F1 , c, d, a, b, in[10 ] +0xffff5bb1 ,17 ); -MD5STEP (F1 , b, c, d, a, in[11 ] +0x895cd7be ,22 ); -MD5STEP (F1 , a, b, c, d, in[12 ] +0x6b901122 ,7 ); -MD5STEP (F1 , d, a, b, c, in[13 ] +0xfd987193 ,12 ); -MD5STEP (F1 , c, d, a, b, in[14 ] +0xa679438e ,17 ); -MD5STEP (F1 , b, c, d, a, in[15 ] +0x49b40821 ,22 ); - -MD5STEP (F2 , a, b, c, d, in[1 ] +0xf61e2562 ,5 ); -MD5STEP (F2 , d, a, b, c, in[6 ] +0xc040b340 ,9 ); -MD5STEP (F2 , c, d, a, b, in[11 ] +0x265e5a51 ,14 ); -MD5STEP (F2 , b, c, d, a, in[0 ] +0xe9b6c7aa ,20 ); -MD5STEP (F2 , a, b, c, d, in[5 ] +0xd62f105d ,5 ); -MD5STEP (F2 , d, a, b, c, in[10 ] +0x02441453 ,9 ); -MD5STEP (F2 , c, d, a, b, in[15 ] +0xd8a1e681 ,14 ); -MD5STEP (F2 , b, c, d, a, in[4 ] +0xe7d3fbc8 ,20 ); -MD5STEP (F2 , a, b, c, d, in[9 ] +0x21e1cde6 ,5 ); -MD5STEP (F2 , d, a, b, c, in[14 ] +0xc33707d6 ,9 ); -MD5STEP (F2 , c, d, a, b, in[3 ] +0xf4d50d87 ,14 ); -MD5STEP (F2 , b, c, d, a, in[8 ] +0x455a14ed ,20 ); -MD5STEP (F2 , a, b, c, d, in[13 ] +0xa9e3e905 ,5 ); -MD5STEP (F2 , d, a, b, c, in[2 ] +0xfcefa3f8 ,9 ); -MD5STEP (F2 , c, d, a, b, in[7 ] +0x676f02d9 ,14 ); -MD5STEP (F2 , b, c, d, a, in[12 ] +0x8d2a4c8a ,20 ); - -MD5STEP (F3 , a, b, c, d, in[5 ] +0xfffa3942 ,4 ); -MD5STEP (F3 , d, a, b, c, in[8 ] +0x8771f681 ,11 ); -MD5STEP (F3 , c, d, a, b, in[11 ] +0x6d9d6122 ,16 ); -MD5STEP (F3 , b, c, d, a, in[14 ] +0xfde5380c ,23 ); -MD5STEP (F3 , a, b, c, d, in[1 ] +0xa4beea44 ,4 ); -MD5STEP (F3 , d, a, b, c, in[4 ] +0x4bdecfa9 ,11 ); -MD5STEP (F3 , c, d, a, b, in[7 ] +0xf6bb4b60 ,16 ); -MD5STEP (F3 , b, c, d, a, in[10 ] +0xbebfbc70 ,23 ); -MD5STEP (F3 , a, b, c, d, in[13 ] +0x289b7ec6 ,4 ); -MD5STEP (F3 , d, a, b, c, in[0 ] +0xeaa127fa ,11 ); -MD5STEP (F3 , c, d, a, b, in[3 ] +0xd4ef3085 ,16 ); -MD5STEP (F3 , b, c, d, a, in[6 ] +0x04881d05 ,23 ); -MD5STEP (F3 , a, b, c, d, in[9 ] +0xd9d4d039 ,4 ); -MD5STEP (F3 , d, a, b, c, in[12 ] +0xe6db99e5 ,11 ); -MD5STEP (F3 , c, d, a, b, in[15 ] +0x1fa27cf8 ,16 ); -MD5STEP (F3 , b, c, d, a, in[2 ] +0xc4ac5665 ,23 ); - -MD5STEP (F4 , a, b, c, d, in[0 ] +0xf4292244 ,6 ); -MD5STEP (F4 , d, a, b, c, in[7 ] +0x432aff97 ,10 ); -MD5STEP (F4 , c, d, a, b, in[14 ] +0xab9423a7 ,15 ); -MD5STEP (F4 , b, c, d, a, in[5 ] +0xfc93a039 ,21 ); -MD5STEP (F4 , a, b, c, d, in[12 ] +0x655b59c3 ,6 ); -MD5STEP (F4 , d, a, b, c, in[3 ] +0x8f0ccc92 ,10 ); -MD5STEP (F4 , c, d, a, b, in[10 ] +0xffeff47d ,15 ); -MD5STEP (F4 , b, c, d, a, in[1 ] +0x85845dd1 ,21 ); -MD5STEP (F4 , a, b, c, d, in[8 ] +0x6fa87e4f ,6 ); -MD5STEP (F4 , d, a, b, c, in[15 ] +0xfe2ce6e0 ,10 ); -MD5STEP (F4 , c, d, a, b, in[6 ] +0xa3014314 ,15 ); -MD5STEP (F4 , b, c, d, a, in[13 ] +0x4e0811a1 ,21 ); -MD5STEP (F4 , a, b, c, d, in[4 ] +0xf7537e82 ,6 ); -MD5STEP (F4 , d, a, b, c, in[11 ] +0xbd3af235 ,10 ); -MD5STEP (F4 , c, d, a, b, in[2 ] +0x2ad7d2bb ,15 ); -MD5STEP (F4 , b, c, d, a, in[9 ] +0xeb86d391 ,21 ); - - hash[0 ] += a; - hash[1 ] += b; - hash[2 ] += c; - hash[3 ] += d; -} -/* XXX: this stuff can be optimized */ static inline void le32_to_cpu_array (u32 *buf,unsigned int words) {
include/linux/cryptohash.h +5 -0
@@ -8,6 +8,11 @@void sha_init (__u32 *buf);void sha_transform (__u32 *digest,const char *data,__u32 *W ); +#define MD5_DIGEST_WORDS 4 +#define MD5_MESSAGE_BYTES 64 + +void md5_transform (__u32 *hash,__u32 const *in); +__u32 half_md4_transform (__u32 buf[4 ],__u32 const in[8 ]);#endif
lib/Makefile +1 -1
@@ -10,7 +10,7 @@ endif lib-y := ctype.o string.o vsprintf.o cmdline.o \ rbtree.o radix-tree.o dump_stack.o timerqueue.o\ idr.o int_sqrt.o extable.o prio_tree.o \ - sha1.o irq_regs.o reciprocal_div.o argv_split.o \ + sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \ proportions.o prio_heap.o ratelimit.o show_mem.o \ is_single_threaded.o plist.o decompress.o find_next_bit.o
lib/md5.c new file +95 -0
95 lines not on this page · raw message
PATCH 30/90 net: Compute protocol sequence numbers and fragment IDs using MD5.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
Computers have become a lot faster since we compromised on the partial MD4 hash which we use currently for performance reasons.
MD5 is a much safer choice, and is inline with both RFC1948 and other ISS generators (OpenBSD, Solaris, etc.)
Furthermore, only having 24-bits of the sequence number be truly unpredictable is a very serious limitation. So the periodic regeneration and 8-bit counter have been removed. We compute and use a full 32-bit sequence number.
For ipv6, DCCP was found to use a 32-bit truncated initial sequence number (it needs 43-bits) and that is fixed here as well.
--- drivers/char/random.c | 334 ------------------------------- include/linux/random.h | 11 - include/net/secure_seq.h | 20 + net/core/Makefile | 2 net/core/secure_seq.c | 184 +++++++++++++++++ net/dccp/ipv4.c | 1 net/dccp/ipv6.c | 9 net/ipv4/inet_hashtables.c | 1 net/ipv4/inetpeer.c | 1 net/ipv4/netfilter/nf_nat_proto_common.c | 1 net/ipv4/route.c | 1 net/ipv4/tcp_ipv4.c | 1 net/ipv6/inet6_hashtables.c | 1 net/ipv6/tcp_ipv6.c | 1 14 files changed, 223 insertions(+), 345 deletions(-) create mode 100644 include/net/secure_seq.h create mode 100644 net/core/secure_seq.c
drivers/char/random.c +8 -326
@@ -1300,330 +1300,14 @@ ctl_table random_table[] = { };#endif /* CONFIG_SYSCTL */ -/******************************************************************** -* -* Random functions for networking -* -********************************************************************/ +static u32 random_int_secret[MD5_MESSAGE_BYTES /4 ]____cacheline_aligned ; -/* -* TCP initial sequence number picking. This uses the random number -* generator to pick an initial secret value. This value is hashed -* along with the TCP endpoint information to provide a unique -* starting point for each pair of TCP endpoints. This defeats -* attacks which rely on guessing the initial TCP sequence number. -* This algorithm was suggested by Steve Bellovin. -* -* Using a very strong hash was taking an appreciable amount of the total -* TCP connection establishment time, so this is a weaker hash, -* compensated for by changing the secret periodically. -*/ - -/* F, G and H are basic MD4 functions: selection, majority, parity */ -#define F (x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -#define G (x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -#define H (x, y, z) ((x) ^ (y) ^ (z)) - -/* -* The generic round function. The application is so specific that -* we don't bother protecting all the arguments with parens, as is generally -* good macro practice, in favor of extra legibility. -* Rotation is separate from addition to prevent recomputation -*/ -#define ROUND (f, a, b, c, d, x, s) \ - (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) -#define K1 0 -#define K2 013240474631UL -#define K3 015666365641UL - -#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) - -static __u32 twothirdsMD4Transform (__u32 const buf[4 ],__u32 const in[12 ]) +static int __init random_int_secret_init (void ) { -__u32 a = buf[0 ], b = buf[1 ], c = buf[2 ], d = buf[3 ]; - -/* Round 1 */ -ROUND (F , a, b, c, d, in[0 ] +K1 ,3 ); -ROUND (F , d, a, b, c, in[1 ] +K1 ,7 ); -ROUND (F , c, d, a, b, in[2 ] +K1 ,11 ); -ROUND (F , b, c, d, a, in[3 ] +K1 ,19 ); -ROUND (F , a, b, c, d, in[4 ] +K1 ,3 ); -ROUND (F , d, a, b, c, in[5 ] +K1 ,7 ); -ROUND (F , c, d, a, b, in[6 ] +K1 ,11 ); -ROUND (F , b, c, d, a, in[7 ] +K1 ,19 ); -ROUND (F , a, b, c, d, in[8 ] +K1 ,3 ); -ROUND (F , d, a, b, c, in[9 ] +K1 ,7 ); -ROUND (F , c, d, a, b, in[10 ] +K1 ,11 ); -ROUND (F , b, c, d, a, in[11 ] +K1 ,19 ); - -/* Round 2 */ -ROUND (G , a, b, c, d, in[1 ] +K2 ,3 ); -ROUND (G , d, a, b, c, in[3 ] +K2 ,5 ); -ROUND (G , c, d, a, b, in[5 ] +K2 ,9 ); -ROUND (G , b, c, d, a, in[7 ] +K2 ,13 ); -ROUND (G , a, b, c, d, in[9 ] +K2 ,3 ); -ROUND (G , d, a, b, c, in[11 ] +K2 ,5 ); -ROUND (G , c, d, a, b, in[0 ] +K2 ,9 ); -ROUND (G , b, c, d, a, in[2 ] +K2 ,13 ); -ROUND (G , a, b, c, d, in[4 ] +K2 ,3 ); -ROUND (G , d, a, b, c, in[6 ] +K2 ,5 ); -ROUND (G , c, d, a, b, in[8 ] +K2 ,9 ); -ROUND (G , b, c, d, a, in[10 ] +K2 ,13 ); - -/* Round 3 */ -ROUND (H , a, b, c, d, in[3 ] +K3 ,3 ); -ROUND (H , d, a, b, c, in[7 ] +K3 ,9 ); -ROUND (H , c, d, a, b, in[11 ] +K3 ,11 ); -ROUND (H , b, c, d, a, in[2 ] +K3 ,15 ); -ROUND (H , a, b, c, d, in[6 ] +K3 ,3 ); -ROUND (H , d, a, b, c, in[10 ] +K3 ,9 ); -ROUND (H , c, d, a, b, in[1 ] +K3 ,11 ); -ROUND (H , b, c, d, a, in[5 ] +K3 ,15 ); -ROUND (H , a, b, c, d, in[9 ] +K3 ,3 ); -ROUND (H , d, a, b, c, in[0 ] +K3 ,9 ); -ROUND (H , c, d, a, b, in[4 ] +K3 ,11 ); -ROUND (H , b, c, d, a, in[8 ] +K3 ,15 ); - -return buf[1 ] + b;/* "most hashed" word */ -/* Alternative: return sum of all words? */ -} -#endif - -#undef ROUND -#undef F -#undef G -#undef H -#undef K1 -#undef K2 -#undef K3 - -/* This should not be decreased so low that ISNs wrap too fast. */ -#define REKEY_INTERVAL (300 * HZ) -/* -* Bit layout of the tcp sequence numbers (before adding current time): -* bit 24-31: increased after every key exchange -* bit 0-23: hash(source,dest) -* -* The implementation is similar to the algorithm described -* in the Appendix of RFC 1185, except that -* - it uses a 1 MHz clock instead of a 250 kHz clock -* - it performs a rekey every 5 minutes, which is equivalent -* to a (source,dest) tulple dependent forward jump of the -* clock by 0..2^(HASH_BITS+1) -* -* Thus the average ISN wraparound time is 68 minutes instead of -* 4.55 hours. -* -* SMP cleanup and lock avoidance with poor man's RCU. -* Manfred Spraul <[email protected]> -* -*/ -#define COUNT_BITS 8 -#define COUNT_MASK ((1 << COUNT_BITS) - 1) -#define HASH_BITS 24 -#define HASH_MASK ((1 << HASH_BITS) - 1) - -static struct keydata { -__u32 count;/* already shifted to the final position */ -__u32 secret[12 ]; -}____cacheline_aligned ip_keydata[2 ]; - -static unsigned int ip_cnt; - -static void rekey_seq_generator (struct work_struct *work); - -static DECLARE_DELAYED_WORK(rekey_work, rekey_seq_generator); - -/* -* Lock avoidance: -* The ISN generation runs lockless - it's just a hash over random data. -* State changes happen every 5 minutes when the random key is replaced. -* Synchronization is performed by having two copies of the hash function -* state and rekey_seq_generator always updates the inactive copy. -* The copy is then activated by updating ip_cnt. -* The implementation breaks down if someone blocks the thread -* that processes SYN requests for more than 5 minutes. Should never -* happen, and even if that happens only a not perfectly compliant -* ISN is generated, nothing fatal. -*/ -static void rekey_seq_generator (struct work_struct *work) -{ -struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt &1 )]; - -get_random_bytes (keyptr->secret,sizeof (keyptr->secret)); - keyptr->count = (ip_cnt &COUNT_MASK ) <<HASH_BITS ; -smp_wmb (); - ip_cnt++; -schedule_delayed_work (&rekey_work, -round_jiffies_relative (REKEY_INTERVAL )); -} - -static inline struct keydata *get_keyptr (void ) -{ -struct keydata *keyptr = &ip_keydata[ip_cnt &1 ]; - -smp_rmb (); - -return keyptr; -} - -static __init int seqgen_init (void ) -{ -rekey_seq_generator (NULL ); +get_random_bytes (random_int_secret,sizeof (random_int_secret));return 0 ; } -late_initcall (seqgen_init); - -#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) -__u32 secure_tcpv6_sequence_number (__be32 *saddr,__be32 *daddr, -__be16 sport,__be16 dport) -{ -__u32 seq; -__u32 hash[12 ]; -struct keydata *keyptr =get_keyptr (); - -/* The procedure is the same as for IPv4, but addresses are longer. -* Thus we must use twothirdsMD4Transform. -*/ - -memcpy (hash, saddr,16 ); - hash[4 ] = ((__force u16 )sport <<16 ) + (__force u16 )dport; -memcpy (&hash[5 ], keyptr->secret,sizeof (__u32) *7 ); - - seq =twothirdsMD4Transform ((const __u32 *)daddr, hash) &HASH_MASK ; - seq += keyptr->count; - - seq +=ktime_to_ns (ktime_get_real ()); - -return seq; -} -EXPORT_SYMBOL (secure_tcpv6_sequence_number); -#endif - -/* The code below is shamelessly stolen from secure_tcp_sequence_number(). -* All blames to Andrey V. Savochkin <[email protected]>. -*/ -__u32 secure_ip_id (__be32 daddr) -{ -struct keydata *keyptr; -__u32 hash[4 ]; - - keyptr =get_keyptr (); - -/* -* Pick a unique starting offset for each IP destination. -* The dest ip address is placed in the starting vector, -* which is then hashed with random data. -*/ - hash[0 ] = (__force __u32 )daddr; - hash[1 ] = keyptr->secret[9 ]; - hash[2 ] = keyptr->secret[10 ]; - hash[3 ] = keyptr->secret[11 ]; - -return half_md4_transform (hash, keyptr->secret); -} - -#ifdef CONFIG_INET - -__u32 secure_tcp_sequence_number (__be32 saddr,__be32 daddr, -__be16 sport,__be16 dport) -{ -__u32 seq; -__u32 hash[4 ]; -struct keydata *keyptr =get_keyptr (); - -/* -* Pick a unique starting offset for each TCP connection endpoints -* (saddr, daddr, sport, dport). -* Note that the words are placed into the starting vector, which is -* then mixed with a partial MD4 over random data. -*/ - hash[0 ] = (__force u32 )saddr; - hash[1 ] = (__force u32 )daddr; - hash[2 ] = ((__force u16 )sport <<16 ) + (__force u16 )dport; - hash[3 ] = keyptr->secret[11 ]; - - seq =half_md4_transform (hash, keyptr->secret) &HASH_MASK ; - seq += keyptr->count; -/* -* As close as possible to RFC 793, which -* suggests using a 250 kHz clock. -* Further reading shows this assumes 2 Mb/s networks. -* For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. -* For 10 Gb/s Ethernet, a 1 GHz clock should be ok, but -* we also need to limit the resolution so that the u32 seq -* overlaps less than one time per MSL (2 minutes). -* Choosing a clock of 64 ns period is OK. (period of 274 s) -*/ - seq +=ktime_to_ns (ktime_get_real ()) >>6 ; - -return seq; -} - -/* Generate secure starting point for ephemeral IPV4 transport port search */ -u32 secure_ipv4_port_ephemeral (__be32 saddr,__be32 daddr,__be16 dport) -{ -struct keydata *keyptr =get_keyptr (); -u32 hash[4 ]; - -/* -* Pick a unique starting offset for each ephemeral port search -* (saddr, daddr, dport) and 48bits of random data. -*/ - hash[0 ] = (__force u32 )saddr; - hash[1 ] = (__force u32 )daddr; - hash[2 ] = (__force u32 )dport ^ keyptr->secret[10 ]; - hash[3 ] = keyptr->secret[11 ]; - -return half_md4_transform (hash, keyptr->secret); -} -EXPORT_SYMBOL_GPL (secure_ipv4_port_ephemeral); - -#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) -u32 secure_ipv6_port_ephemeral (const __be32 *saddr,const __be32 *daddr, -__be16 dport) -{ -struct keydata *keyptr =get_keyptr (); -u32 hash[12 ]; - -memcpy (hash, saddr,16 ); - hash[4 ] = (__force u32 )dport; -memcpy (&hash[5 ], keyptr->secret,sizeof (__u32) *7 ); - -return twothirdsMD4Transform ((const __u32 *)daddr, hash); -} -#endif - -#if defined(CONFIG_IP_DCCP ) || defined(CONFIG_IP_DCCP_MODULE ) -/* Similar to secure_tcp_sequence_number but generate a 48 bit value -* bit's 32-47 increase every key exchange -* 0-31 hash(source, dest) -*/ -u64 secure_dccp_sequence_number (__be32 saddr,__be32 daddr, -__be16 sport,__be16 dport) -{ -u64 seq; -__u32 hash[4 ]; -struct keydata *keyptr =get_keyptr (); - - hash[0 ] = (__force u32 )saddr; - hash[1 ] = (__force u32 )daddr; - hash[2 ] = ((__force u16 )sport <<16 ) + (__force u16 )dport; - hash[3 ] = keyptr->secret[11 ]; - - seq =half_md4_transform (hash, keyptr->secret); - seq |= ((u64 )keyptr->count) << (32 -HASH_BITS ); - - seq +=ktime_to_ns (ktime_get_real ()); - seq &= (1ull <<48 ) -1 ; - -return seq; -} -EXPORT_SYMBOL (secure_dccp_sequence_number); -#endif - -#endif /* CONFIG_INET */ - +late_initcall (random_int_secret_init);/* * Get a random word for internal kernel use only. Similar to urandom but
@@ -1631,17 +1315,15 @@ EXPORT_SYMBOL(secure_dccp_sequence_numbe* value is not cryptographically secure but for several uses the cost of * depleting entropy is too high */ -DEFINE_PER_CPU (__u32 [4 ], get_random_int_hash); +DEFINE_PER_CPU (__u32 [MD5_DIGEST_WORDS ], get_random_int_hash);unsigned int get_random_int (void ) { -struct keydata *keyptr;__u32 *hash =get_cpu_var (get_random_int_hash); -int ret; +unsigned int ret; - keyptr =get_keyptr (); hash[0 ] += current->pid + jiffies +get_cycles (); - - ret =half_md4_transform (hash, keyptr->secret); +md5_transform (hash, random_int_secret); + ret = hash[0 ];put_cpu_var (get_random_int_hash);return ret;
include/linux/random.h +0 -11
@@ -57,17 +57,6 @@ extern void add_interrupt_randomness(intextern void get_random_bytes (void *buf,int nbytes);void generate_random_uuid (unsigned char uuid_out[16 ]); -extern __u32 secure_ip_id (__be32 daddr); -extern u32 secure_ipv4_port_ephemeral (__be32 saddr,__be32 daddr,__be16 dport); -extern u32 secure_ipv6_port_ephemeral (const __be32 *saddr,const __be32 *daddr, -__be16 dport); -extern __u32 secure_tcp_sequence_number (__be32 saddr,__be32 daddr, -__be16 sport,__be16 dport); -extern __u32 secure_tcpv6_sequence_number (__be32 *saddr,__be32 *daddr, -__be16 sport,__be16 dport); -extern u64 secure_dccp_sequence_number (__be32 saddr,__be32 daddr, -__be16 sport,__be16 dport); -#ifndef MODULE extern const struct file_operations random_fops, urandom_fops;#endif
include/net/secure_seq.h new file +20 -0
@@ -0,0 +1,20 @@ +#ifndef _NET_SECURE_SEQ +#define _NET_SECURE_SEQ + +#include <linux/types.h> + +extern __u32 secure_ip_id (__be32 daddr); +extern __u32 secure_ipv6_id (const __be32 daddr[4 ]); +extern u32 secure_ipv4_port_ephemeral (__be32 saddr,__be32 daddr,__be16 dport); +extern u32 secure_ipv6_port_ephemeral (const __be32 *saddr,const __be32 *daddr, +__be16 dport); +extern __u32 secure_tcp_sequence_number (__be32 saddr,__be32 daddr, +__be16 sport,__be16 dport); +extern __u32 secure_tcpv6_sequence_number (__be32 *saddr,__be32 *daddr, +__be16 sport,__be16 dport); +extern u64 secure_dccp_sequence_number (__be32 saddr,__be32 daddr, +__be16 sport,__be16 dport); +extern u64 secure_dccpv6_sequence_number (__be32 *saddr,__be32 *daddr, +__be16 sport,__be16 dport); + +#endif /* _NET_SECURE_SEQ */
net/core/Makefile +1 -1
@@ -3,7 +3,7 @@ # obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \ - gen_stats.o gen_estimator.o net_namespace.o + gen_stats.o gen_estimator.o net_namespace.o secure_seq.o obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
net/core/secure_seq.c new file +184 -0
184 lines not on this page · raw message
net/dccp/ipv4.c +1 -0
@@ -26,6 +26,7 @@#include <net/timewait_sock.h> #include <net/tcp_states.h> #include <net/xfrm.h> +#include <net/secure_seq.h> #include "ackvec.h" #include "ccid.h"
net/dccp/ipv6.c +2 -7
@@ -29,6 +29,7 @@#include <net/transp_v6.h> #include <net/ip6_checksum.h> #include <net/xfrm.h> +#include <net/secure_seq.h> #include "dccp.h" #include "ipv6.h"
@@ -69,13 +70,7 @@ static inline void dccp_v6_send_check(st dh->dccph_checksum =dccp_v6_csum_finish (skb, &np->saddr, &np->daddr); } -static inline __u32 secure_dccpv6_sequence_number (__be32 *saddr,__be32 *daddr, -__be16 sport,__be16 dport ) -{ -return secure_tcpv6_sequence_number (saddr, daddr, sport, dport); -} - -static inline __u32 dccp_v6_init_sequence (struct sk_buff *skb) +static inline __u64 dccp_v6_init_sequence (struct sk_buff *skb) { return secure_dccpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32, ipv6_hdr(skb)->saddr.s6_addr32,
net/ipv4/inet_hashtables.c +1 -0
@@ -21,6 +21,7 @@#include <net/inet_connection_sock.h> #include <net/inet_hashtables.h> +#include <net/secure_seq.h> #include <net/ip.h> /*
net/ipv4/inetpeer.c +1 -0
@@ -19,6 +19,7 @@#include <linux/net.h> #include <net/ip.h> #include <net/inetpeer.h> +#include <net/secure_seq.h> /* * Theory of operations.
net/ipv4/netfilter/nf_nat_proto_common.c +1 -0
@@ -12,6 +12,7 @@#include <linux/ip.h> #include <linux/netfilter.h> +#include <net/secure_seq.h> #include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_core.h> #include <net/netfilter/nf_nat_rule.h>
net/ipv4/route.c +1 -0
@@ -108,6 +108,7 @@#ifdef CONFIG_SYSCTL #include <linux/sysctl.h> #endif +#include <net/secure_seq.h> #define RT_FL_TOS (oldflp4) \ ((u32)(oldflp4->flowi4_tos & (IPTOS_RT_MASK | RTO_ONLINK)))
net/ipv4/tcp_ipv4.c +1 -0
@@ -72,6 +72,7 @@#include <net/timewait_sock.h> #include <net/xfrm.h> #include <net/netdma.h> +#include <net/secure_seq.h> #include <linux/inet.h> #include <linux/ipv6.h>
net/ipv6/inet6_hashtables.c +1 -0
@@ -20,6 +20,7 @@#include <net/inet_connection_sock.h> #include <net/inet_hashtables.h> #include <net/inet6_hashtables.h> +#include <net/secure_seq.h> #include <net/ip.h> int __inet6_hash (struct sock *sk,struct inet_timewait_sock *tw)
net/ipv6/tcp_ipv6.c +1 -0
@@ -61,6 +61,7 @@#include <net/timewait_sock.h> #include <net/netdma.h> #include <net/inet_common.h> +#include <net/secure_seq.h> #include <asm/uaccess.h>
PATCH 31/90 asus-wmi: fix hwmon/pwm1
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Corentin Chary <[email protected]>
commit 49979d091d1847823c064301da1ec173619ddd92 upstream.
The code was completly broken, and should never had been sent to the kernel. That's what happens when you write code without hardware to test it.
--- drivers/platform/x86/asus-wmi.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/platform/x86/asus-wmi.c +5 -4
@@ -797,8 +797,8 @@ exit:* Hwmon device */ static ssize_t asus_hwmon_pwm1 (struct device *dev, -struct device_attribute *attr, -char *buf) +struct device_attribute *attr, +char *buf) {struct asus_wmi *asus =dev_get_drvdata (dev);u32 value;
@@ -809,7 +809,7 @@ static ssize_t asus_hwmon_pwm1(struct deif (err <0 )return err; - value |=0xFF ; + value &=0xFF ;if (value ==1 )/* Low Speed */ value =85 ;
@@ -869,7 +869,7 @@ static mode_t asus_hwmon_sysfs_is_visibl* - reverved bits are non-zero * - sfun and presence bit are not set */ -if (value !=ASUS_WMI_UNSUPPORTED_METHOD || value &0xFFF80000 +if (value ==ASUS_WMI_UNSUPPORTED_METHOD || value &0xFFF80000 || (!asus->sfun && !(value &ASUS_WMI_DSTS_PRESENCE_BIT ))) ok = false; }
@@ -904,6 +904,7 @@ static int asus_wmi_hwmon_init(struct aspr_err ("Could not register asus hwmon device\n" );return PTR_ERR (hwmon); } +dev_set_drvdata (hwmon, asus); asus->hwmon_device = hwmon; result =sysfs_create_group (&hwmon->kobj, &hwmon_attribute_group);if (result)
PATCH 32/90 asus-wmi: return proper value in store_cpufv()
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Corentin Chary <[email protected]>
commit 3df5fdadf6400373a696bb14e27d4771e5f6afb3 upstream.
--- drivers/platform/x86/asus-wmi.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/platform/x86/asus-wmi.c +6 -2
@@ -1165,14 +1165,18 @@ ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644,static ssize_t store_cpufv (struct device *dev,struct device_attribute *attr,const char *buf,size_t count) { -int value; +int value, rv;if (!count ||sscanf (buf,"%i" , &value) !=1 )return -EINVAL ;if (value <0 || value >2 )return -EINVAL ; -return asus_wmi_evaluate_method (ASUS_WMI_METHODID_CFVS , value,0 ,NULL ); + rv =asus_wmi_evaluate_method (ASUS_WMI_METHODID_CFVS , value,0 ,NULL ); +if (rv <0 ) +return rv; + +return count; } static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv);
PATCH 33/90 CIFS: Fix missing a decrement of inFlight value
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Pavel Shilovsky <[email protected]>
commit 0193e072268fe62c4b19ad4b05cd0d4b23c43bb9 upstream.
if we failed on getting mid entry in cifs_call_async.
--- fs/cifs/transport.c | 2 ++ 1 file changed, 2 insertions(+)
fs/cifs/transport.c +2 -0
@@ -362,6 +362,8 @@ cifs_call_async(struct TCP_Server_Info * mid =AllocMidQEntry (hdr, server);if (mid ==NULL ) {mutex_unlock (&server->srv_mutex); +atomic_dec (&server->inFlight); +wake_up (&server->request_q);return -ENOMEM ; }
PATCH 34/90 cifs: cope with negative dentries in cifs_get_root
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeff Layton <[email protected]>
commit 80975d21aae2136ccae1ce914a1602dc1d8b0795 upstream.
The loop around lookup_one_len doesn't handle the case where it might return a negative dentry, which can cause an oops on the next pass through the loop. Check for that and break out of the loop with an error of -ENOENT if there is one.
Fixes the panic reported here:
https://bugzilla.redhat.com/show_bug.cgi?id=727927
--- fs/cifs/cifsfs.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/cifs/cifsfs.c +4 -0
@@ -581,6 +581,10 @@ cifs_get_root(struct smb_vol *vol, strucmutex_unlock (&dir->i_mutex);dput (dentry); dentry = child; +if (!dentry->d_inode) { +dput (dentry); + dentry =ERR_PTR (-ENOENT ); + } }while (!IS_ERR (dentry));_FreeXid (xid);kfree (full_path);
PATCH 35/90 cifs: convert prefixpath delimiters in
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
cifs_build_path_to_root
From: Jeff Layton <[email protected]>
commit f9e8c45002cacad536b338dfa9e910e341a49c31 upstream.
Regression from 2.6.39...
The delimiters in the prefixpath are not being converted based on whether posix paths are in effect. Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=727834
--- fs/cifs/inode.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
fs/cifs/inode.c +2 -12
@@ -764,20 +764,10 @@ char *cifs_build_path_to_root(struct smbif (full_path ==NULL )return full_path; -if (dfsplen) { +if (dfsplen)strncpy (full_path, tcon->treeName, dfsplen); -/* switch slash direction in prepath depending on whether -* windows or posix style path names -*/ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_POSIX_PATHS ) { -int i; -for (i =0 ; i < dfsplen; i++) { -if (full_path[i] =='\\' ) - full_path[i] ='/' ; - } - } - }strncpy (full_path + dfsplen, vol->prepath, pplen); +convert_delimiter (full_path,CIFS_DIR_SEP (cifs_sb)); full_path[dfsplen + pplen] =0 ;/* add trailing null */ return full_path; }
PATCH 36/90 ASoC: sgtl5000: fix cache handling
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wolfram Sang <[email protected]>
commit 151798f872d6b386d82cd1707ad703e981fef8f2 upstream.
Cache handling in this driver is broken. The chip has 16-bit registers, yet the register numbers also increase by 2 per register, i.e. there are only even-numbered registers. The cache in this driver, though, simply increments register numbers, so it does need some mapping as seen in sgtl5000_restore_regs(), note the '>> 1':
snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL,
cache[SGTL5000_CHIP_LINREG_CTRL >> 1]);That, of course, won't work with snd_soc_update_bits(). (Thus, we won't even notice the missing register 0x1c in the default regs which shifted all follwing registers to wrong values.) Noticed on the MX28EVK where enabling the regulators simply locked up the chip.
Refactor the routines and use a properly sized default_regs array which matches the register layout of the underlying chip, i.e. create a truly flat cache. This also saves some code which should make up for the bigger array a little. When soc-core will somewhen have another cache type which handles a step size, this conversion will also ease the transition.
--- sound/soc/codecs/sgtl5000.c | 128 ++++++++++++-------------------------------- 1 file changed, 35 insertions(+), 93 deletions(-)
sound/soc/codecs/sgtl5000.c +35 -93
@@ -33,73 +33,31 @@#define SGTL5000_DAP_REG_OFFSET 0x0100#define SGTL5000_MAX_REG_OFFSET 0x013A -/* default value of sgtl5000 registers except DAP */ -static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET >>1 ] = { -0xa011 ,/* 0x0000, CHIP_ID. 11 stand for revison 17 */ -0x0000 ,/* 0x0002, CHIP_DIG_POWER. */ -0x0008 ,/* 0x0004, CHIP_CKL_CTRL */ -0x0010 ,/* 0x0006, CHIP_I2S_CTRL */ -0x0000 ,/* 0x0008, reserved */ -0x0008 ,/* 0x000A, CHIP_SSS_CTRL */ -0x0000 ,/* 0x000C, reserved */ -0x020c ,/* 0x000E, CHIP_ADCDAC_CTRL */ -0x3c3c ,/* 0x0010, CHIP_DAC_VOL */ -0x0000 ,/* 0x0012, reserved */ -0x015f ,/* 0x0014, CHIP_PAD_STRENGTH */ -0x0000 ,/* 0x0016, reserved */ -0x0000 ,/* 0x0018, reserved */ -0x0000 ,/* 0x001A, reserved */ -0x0000 ,/* 0x001E, reserved */ -0x0000 ,/* 0x0020, CHIP_ANA_ADC_CTRL */ -0x1818 ,/* 0x0022, CHIP_ANA_HP_CTRL */ -0x0111 ,/* 0x0024, CHIP_ANN_CTRL */ -0x0000 ,/* 0x0026, CHIP_LINREG_CTRL */ -0x0000 ,/* 0x0028, CHIP_REF_CTRL */ -0x0000 ,/* 0x002A, CHIP_MIC_CTRL */ -0x0000 ,/* 0x002C, CHIP_LINE_OUT_CTRL */ -0x0404 ,/* 0x002E, CHIP_LINE_OUT_VOL */ -0x7060 ,/* 0x0030, CHIP_ANA_POWER */ -0x5000 ,/* 0x0032, CHIP_PLL_CTRL */ -0x0000 ,/* 0x0034, CHIP_CLK_TOP_CTRL */ -0x0000 ,/* 0x0036, CHIP_ANA_STATUS */ -0x0000 ,/* 0x0038, reserved */ -0x0000 ,/* 0x003A, CHIP_ANA_TEST2 */ -0x0000 ,/* 0x003C, CHIP_SHORT_CTRL */ -0x0000 ,/* reserved */ -}; - -/* default value of dap registers */ -static const u16 sgtl5000_dap_regs[] = { -0x0000 ,/* 0x0100, DAP_CONTROL */ -0x0000 ,/* 0x0102, DAP_PEQ */ -0x0040 ,/* 0x0104, DAP_BASS_ENHANCE */ -0x051f ,/* 0x0106, DAP_BASS_ENHANCE_CTRL */ -0x0000 ,/* 0x0108, DAP_AUDIO_EQ */ -0x0040 ,/* 0x010A, DAP_SGTL_SURROUND */ -0x0000 ,/* 0x010C, DAP_FILTER_COEF_ACCESS */ -0x0000 ,/* 0x010E, DAP_COEF_WR_B0_MSB */ -0x0000 ,/* 0x0110, DAP_COEF_WR_B0_LSB */ -0x0000 ,/* 0x0112, reserved */ -0x0000 ,/* 0x0114, reserved */ -0x002f ,/* 0x0116, DAP_AUDIO_EQ_BASS_BAND0 */ -0x002f ,/* 0x0118, DAP_AUDIO_EQ_BAND0 */ -0x002f ,/* 0x011A, DAP_AUDIO_EQ_BAND2 */ -0x002f ,/* 0x011C, DAP_AUDIO_EQ_BAND3 */ -0x002f ,/* 0x011E, DAP_AUDIO_EQ_TREBLE_BAND4 */ -0x8000 ,/* 0x0120, DAP_MAIN_CHAN */ -0x0000 ,/* 0x0122, DAP_MIX_CHAN */ -0x0510 ,/* 0x0124, DAP_AVC_CTRL */ -0x1473 ,/* 0x0126, DAP_AVC_THRESHOLD */ -0x0028 ,/* 0x0128, DAP_AVC_ATTACK */ -0x0050 ,/* 0x012A, DAP_AVC_DECAY */ -0x0000 ,/* 0x012C, DAP_COEF_WR_B1_MSB */ -0x0000 ,/* 0x012E, DAP_COEF_WR_B1_LSB */ -0x0000 ,/* 0x0130, DAP_COEF_WR_B2_MSB */ -0x0000 ,/* 0x0132, DAP_COEF_WR_B2_LSB */ -0x0000 ,/* 0x0134, DAP_COEF_WR_A1_MSB */ -0x0000 ,/* 0x0136, DAP_COEF_WR_A1_LSB */ -0x0000 ,/* 0x0138, DAP_COEF_WR_A2_MSB */ -0x0000 ,/* 0x013A, DAP_COEF_WR_A2_LSB */ +/* default value of sgtl5000 registers */ +static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET ] = { + [SGTL5000_CHIP_CLK_CTRL ] =0x0008 , + [SGTL5000_CHIP_I2S_CTRL ] =0x0010 , + [SGTL5000_CHIP_SSS_CTRL ] =0x0008 , + [SGTL5000_CHIP_DAC_VOL ] =0x3c3c , + [SGTL5000_CHIP_PAD_STRENGTH ] =0x015f , + [SGTL5000_CHIP_ANA_HP_CTRL ] =0x1818 , + [SGTL5000_CHIP_ANA_CTRL ] =0x0111 , + [SGTL5000_CHIP_LINE_OUT_VOL ] =0x0404 , + [SGTL5000_CHIP_ANA_POWER ] =0x7060 , + [SGTL5000_CHIP_PLL_CTRL ] =0x5000 , + [SGTL5000_DAP_BASS_ENHANCE ] =0x0040 , + [SGTL5000_DAP_BASS_ENHANCE_CTRL ] =0x051f , + [SGTL5000_DAP_SURROUND ] =0x0040 , + [SGTL5000_DAP_EQ_BASS_BAND0 ] =0x002f , + [SGTL5000_DAP_EQ_BASS_BAND1 ] =0x002f , + [SGTL5000_DAP_EQ_BASS_BAND2 ] =0x002f , + [SGTL5000_DAP_EQ_BASS_BAND3 ] =0x002f , + [SGTL5000_DAP_EQ_BASS_BAND4 ] =0x002f , + [SGTL5000_DAP_MAIN_CHAN ] =0x8000 , + [SGTL5000_DAP_AVC_CTRL ] =0x0510 , + [SGTL5000_DAP_AVC_THRESHOLD ] =0x1473 , + [SGTL5000_DAP_AVC_ATTACK ] =0x0028 , + [SGTL5000_DAP_AVC_DECAY ] =0x0050 , };/* regulator supplies for sgtl5000, VDDD is an optional external supply */
@@ -1022,12 +980,10 @@ static int sgtl5000_suspend(struct snd_sstatic int sgtl5000_restore_regs (struct snd_soc_codec *codec) {u16 *cache = codec->reg_cache; -int i; -int regular_regs =SGTL5000_CHIP_SHORT_CTRL >>1 ; +u16 reg;/* restore regular registers */ -for (i =0 ; i < regular_regs; i++) { -int reg = i <<1 ; +for (reg =0 ; reg <=SGTL5000_CHIP_SHORT_CTRL ; reg +=2 ) {/* this regs depends on the others */ if (reg == SGTL5000_CHIP_ANA_POWER ||
@@ -1037,35 +993,31 @@ static int sgtl5000_restore_regs(struct reg == SGTL5000_CHIP_CLK_CTRL)continue ; -snd_soc_write (codec, reg, cache[i]); +snd_soc_write (codec, reg, cache[reg]); }/* restore dap registers */ -for (i =SGTL5000_DAP_REG_OFFSET >>1 ; - i <SGTL5000_MAX_REG_OFFSET >>1 ; i++) { -int reg = i <<1 ; - -snd_soc_write (codec, reg, cache[i]); - } +for (reg =SGTL5000_DAP_REG_OFFSET ; reg <SGTL5000_MAX_REG_OFFSET ; reg +=2 ) +snd_soc_write (codec, reg, cache[reg]);/* * restore power and other regs according * to set_power() and set_clock() */ snd_soc_write (codec,SGTL5000_CHIP_LINREG_CTRL , - cache[SGTL5000_CHIP_LINREG_CTRL >>1 ]); + cache[SGTL5000_CHIP_LINREG_CTRL ]);snd_soc_write (codec,SGTL5000_CHIP_ANA_POWER , - cache[SGTL5000_CHIP_ANA_POWER >>1 ]); + cache[SGTL5000_CHIP_ANA_POWER ]);snd_soc_write (codec,SGTL5000_CHIP_CLK_CTRL , - cache[SGTL5000_CHIP_CLK_CTRL >>1 ]); + cache[SGTL5000_CHIP_CLK_CTRL ]);snd_soc_write (codec,SGTL5000_CHIP_REF_CTRL , - cache[SGTL5000_CHIP_REF_CTRL >>1 ]); + cache[SGTL5000_CHIP_REF_CTRL ]);snd_soc_write (codec,SGTL5000_CHIP_LINE_OUT_CTRL , - cache[SGTL5000_CHIP_LINE_OUT_CTRL >>1 ]); + cache[SGTL5000_CHIP_LINE_OUT_CTRL ]);return 0 ; }
@@ -1460,16 +1412,6 @@ static __devinit int sgtl5000_i2c_probe(if (!sgtl5000)return -ENOMEM ; -/* -* copy DAP default values to default value array. -* sgtl5000 register space has a big hole, merge it -* at init phase makes life easy. -* FIXME: should we drop 'const' of sgtl5000_regs? -*/ -memcpy ((void *)(&sgtl5000_regs[0 ] + (SGTL5000_DAP_REG_OFFSET >>1 )), - sgtl5000_dap_regs, -SGTL5000_MAX_REG_OFFSET -SGTL5000_DAP_REG_OFFSET ); -i2c_set_clientdata (client, sgtl5000); ret = snd_soc_register_codec(&client->dev,
PATCH 37/90 ALSA: timer - Fix Oops at closing slave timer
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Takashi Iwai <[email protected]>
commit 0584ffa548b6e59aceb027112f23a55f0133400e upstream.
A slave-timer instance has no timer reference, and this results in NULL-dereference at stopping the timer, typically called at closing the device.
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=40682
--- sound/core/timer.c | 2 ++ 1 file changed, 2 insertions(+)
sound/core/timer.c +2 -0
@@ -531,6 +531,8 @@ int snd_timer_stop(struct snd_timer_instif (err <0 )return err; timer = timeri->timer; +if (!timer) +return -EINVAL ;spin_lock_irqsave (&timer->lock, flags); timeri->cticks = timeri->ticks; timeri->pticks =0 ;
PATCH 38/90 ALSA: snd-usb-caiaq: Fix keymap for RigKontrol3
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel Mack <[email protected]>
commit f4389489b5cbe60b3441869c68bb4afe760969c4 upstream.
--- sound/usb/caiaq/input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/caiaq/input.c +1 -1
@@ -30,7 +30,7 @@ static unsigned short keycode_ak1[] = {static unsigned short keycode_rk2[] = {KEY_1 ,KEY_2 ,KEY_3 ,KEY_4 ,KEY_5 ,KEY_6 ,KEY_7 };static unsigned short keycode_rk3[] = {KEY_1 ,KEY_2 ,KEY_3 ,KEY_4 , -KEY_5 ,KEY_6 ,KEY_7 ,KEY_5 ,KEY_6 }; +KEY_5 ,KEY_6 ,KEY_7 ,KEY_8 ,KEY_9 };static unsigned short keycode_kore[] = {KEY_FN_F1 ,/* "menu" */
PATCH 39/90 ALSA: snd-usb: avoid dividing by zero on invalid input
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Nicolai Krakowiak <[email protected]>
commit 60c961a9e1ed879a4d151df6076bf1203f595f73 upstream.
--- sound/usb/mixer.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/usb/mixer.c +5 -0
@@ -1191,6 +1191,11 @@ static int parse_audio_feature_unit(struif (state->mixer->protocol ==UAC_VERSION_1 ) { csize = hdr->bControlSize; +if (!csize) { +snd_printdd (KERN_ERR "usbaudio: unit %u: " +"invalid bControlSize == 0\n" , unitid); +return -EINVAL ; + } channels = (hdr->bLength -7 ) / csize -1 ; bmaControls = hdr->bmaControls; }else {
PATCH 40/90 ALSA: snd-usb: operate on given mixer interface only
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel Mack <[email protected]>
commit 1faa5d07a93fc5b0a4a5254fc940a79e20b55540 upstream.
When creating the mixers for an USB audio device, the current code looks at the host interface stored in mixer->chip->ctrl_if. Change this and rather keep a local pointer to the interface that was given when snd_usb_create_mixer() was called.
--- sound/usb/mixer.c | 20 ++++++++------------ sound/usb/mixer.h | 1 + 2 files changed, 9 insertions(+), 12 deletions(-)
sound/usb/mixer.c +8 -12
@@ -1939,15 +1939,13 @@ static int snd_usb_mixer_controls(structstruct mixer_build state;int err;const struct usbmix_ctl_map *map; -struct usb_host_interface *hostif;void *p; - hostif = mixer->chip->ctrl_intf;memset (&state,0 ,sizeof (state)); state.chip = mixer->chip; state.mixer = mixer; - state.buffer = hostif->extra; - state.buflen = hostif->extralen; + state.buffer = mixer->hostif->extra; + state.buflen = mixer->hostif->extralen;/* check the mapping table */ for (map = usbmix_ctl_maps; map->id; map++) {
@@ -1960,7 +1958,8 @@ static int snd_usb_mixer_controls(struct } p =NULL ; -while ((p =snd_usb_find_csint_desc (hostif->extra, hostif->extralen, p,UAC_OUTPUT_TERMINAL )) !=NULL ) { +while ((p =snd_usb_find_csint_desc (mixer->hostif->extra, mixer->hostif->extralen, + p,UAC_OUTPUT_TERMINAL )) !=NULL ) {if (mixer->protocol ==UAC_VERSION_1 ) {struct uac1_output_terminal_descriptor *desc = p;
@@ -2167,17 +2166,15 @@ int snd_usb_mixer_activate(struct usb_mi/* create the handler for the optional status interrupt endpoint */ static int snd_usb_mixer_status_create (struct usb_mixer_interface *mixer) { -struct usb_host_interface *hostif;struct usb_endpoint_descriptor *ep;void *transfer_buffer;int buffer_length;unsigned int epnum; - hostif = mixer->chip->ctrl_intf;/* we need one interrupt input endpoint */ -if (get_iface_desc (hostif)->bNumEndpoints <1 ) +if (get_iface_desc (mixer->hostif)->bNumEndpoints <1 )return 0 ; - ep =get_endpoint (hostif,0 ); + ep =get_endpoint (mixer->hostif,0 );if (!usb_endpoint_dir_in (ep) || !usb_endpoint_xfer_int (ep))return 0 ;
@@ -2207,7 +2204,6 @@ int snd_usb_create_mixer(struct snd_usb_ };struct usb_mixer_interface *mixer;struct snd_info_entry *entry; -struct usb_host_interface *host_iface;int err;strcpy (chip->card->mixername,"USB Mixer" );
@@ -2224,8 +2220,8 @@ int snd_usb_create_mixer(struct snd_usb_return -ENOMEM ; } - host_iface = &usb_ifnum_to_if (chip->dev, ctrlif)->altsetting[0 ]; -switch (get_iface_desc (host_iface)->bInterfaceProtocol) { + mixer->hostif = &usb_ifnum_to_if (chip->dev, ctrlif)->altsetting[0 ]; +switch (get_iface_desc (mixer->hostif)->bInterfaceProtocol) {case UAC_VERSION_1 :default : mixer->protocol =UAC_VERSION_1 ;
sound/usb/mixer.h +1 -0
@@ -3,6 +3,7 @@struct usb_mixer_interface {struct snd_usb_audio *chip; +struct usb_host_interface *hostif;struct list_head list;unsigned int ignore_ctl_error;struct urb *urb;
PATCH 41/90 ALSA: snd-usb: Accept UAC2 FORMAT_TYPE descriptors with
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
bLength > 6
From: Clemens Ladisch <[email protected]>
commit 824818b148db42173446707df4cbd61cd7133272 upstream.
The Focusrite Scarlett 18i6 USB has them that way, which is probably a bug. Anyway, the driver should simply ignore this fact.
--- sound/usb/endpoint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/endpoint.c +1 -1
@@ -352,7 +352,7 @@ int snd_usb_parse_audio_endpoints(structcontinue ; }if (((protocol ==UAC_VERSION_1 ) && (fmt->bLength <8 )) || - ((protocol ==UAC_VERSION_2 ) && (fmt->bLength !=6 ))) { + ((protocol ==UAC_VERSION_2 ) && (fmt->bLength <6 ))) {snd_printk (KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n" , dev->devnum, iface_no, altno);continue ;
PATCH 42/90 ipv6: make fragment identifications less predictable
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Dumazet <[email protected]>
[ Backport of upstream commit 87c48fa3b4630905f98268dde838ee43626a060c ]
Fernando Gont reported current IPv6 fragment identification generation was not secure, because using a very predictable system-wide generator, allowing various attacks.
IPv4 uses inetpeer cache to address this problem and to get good performance. We'll use this mechanism when IPv6 inetpeer is stable enough in linux-3.1
For the time being, we use jhash on destination address to provide less predictable identifications. Also remove a spinlock and use cmpxchg() to get better SMP performance.
--- include/net/ipv6.h | 12 +----------- include/net/transp_v6.h | 2 ++ net/ipv6/af_inet6.c | 2 ++ net/ipv6/ip6_output.c | 40 +++++++++++++++++++++++++++++++++++----- net/ipv6/udp.c | 2 +- 5 files changed, 41 insertions(+), 17 deletions(-)
include/net/ipv6.h +1 -11
@@ -463,17 +463,7 @@ static inline int ipv6_addr_diff(const sreturn __ipv6_addr_diff (a1, a2,sizeof (struct in6_addr )); } -static __inline__void ipv6_select_ident (struct frag_hdr *fhdr) -{ -static u32 ipv6_fragmentation_id =1 ; -static DEFINE_SPINLOCK (ip6_id_lock); - -spin_lock_bh (&ip6_id_lock); - fhdr->identification =htonl (ipv6_fragmentation_id); -if (++ipv6_fragmentation_id ==0 ) - ipv6_fragmentation_id =1 ; -spin_unlock_bh (&ip6_id_lock); -} +extern void ipv6_select_ident (struct frag_hdr *fhdr,struct rt6_info *rt);/* * Prototypes exported by ipv6
include/net/transp_v6.h +2 -0
@@ -14,6 +14,8 @@ extern struct proto tcpv6_prot;struct flowi6 ; +extern void initialize_hashidentrnd (void ); +/* extension headers */ extern int ipv6_exthdrs_init (void );extern void ipv6_exthdrs_exit (void );
net/ipv6/af_inet6.c +2 -0
@@ -1078,6 +1078,8 @@ static int __init inet6_init(void) goto out; } +initialize_hashidentrnd (); + err =proto_register (&tcpv6_prot,1 );if (err) goto out;
net/ipv6/ip6_output.c +35 -5
@@ -596,6 +596,35 @@ int ip6_find_1stfragopt(struct sk_buff *return offset; } +static u32 hashidentrnd__read_mostly ; +#define FID_HASH_SZ 16 +static u32 ipv6_fragmentation_id[FID_HASH_SZ ]; + +void __init initialize_hashidentrnd (void ) +{ +get_random_bytes (&hashidentrnd,sizeof (hashidentrnd)); +} + +static u32 __ipv6_select_ident (const struct in6_addr *addr) +{ +u32 newid, oldid, hash =jhash2 ((u32 *)addr,4 , hashidentrnd); +u32 *pid = &ipv6_fragmentation_id[hash %FID_HASH_SZ ]; + +do { + oldid = *pid; + newid = oldid +1 ; +if (!(hash + newid)) + newid++; + }while (cmpxchg (pid, oldid, newid) != oldid); + +return hash + newid; +} + +void ipv6_select_ident (struct frag_hdr *fhdr,struct rt6_info *rt) +{ + fhdr->identification =htonl (__ipv6_select_ident (&rt->rt6i_dst.addr)); +} +int ip6_fragment (struct sk_buff *skb,int (*output)(struct sk_buff *)) {struct sk_buff *frag;
@@ -680,7 +709,7 @@ int ip6_fragment(struct sk_buff *skb, inskb_reset_network_header (skb);memcpy (skb_network_header (skb), tmp_hdr, hlen); -ipv6_select_ident (fh); +ipv6_select_ident (fh, rt); fh->nexthdr = nexthdr; fh->reserved =0 ; fh->frag_off =htons (IP6_MF );
@@ -826,7 +855,7 @@ slow_path: fh->nexthdr = nexthdr; fh->reserved =0 ;if (!frag_id) { -ipv6_select_ident (fh); +ipv6_select_ident (fh, rt); frag_id = fh->identification; }else fh->identification = frag_id;
@@ -1072,7 +1101,8 @@ static inline int ip6_ufo_append_data(stint getfrag (void *from,char *to,int offset,int len,int odd,struct sk_buff *skb), void *from, int length, int hh_len, int fragheaderlen, - int transhdrlen, int mtu,unsigned int flags) + int transhdrlen, int mtu,unsigned int flags, + struct rt6_info *rt) { struct sk_buff *skb;
@@ -1116,7 +1146,7 @@ static inline int ip6_ufo_append_data(stskb_shinfo (skb)->gso_size = (mtu - fragheaderlen -sizeof (struct frag_hdr )) & ~7 ;skb_shinfo (skb)->gso_type =SKB_GSO_UDP ; -ipv6_select_ident (&fhdr); +ipv6_select_ident (&fhdr, rt);skb_shinfo (skb)->ip6_frag_id = fhdr.identification;__skb_queue_tail (&sk->sk_write_queue, skb);
@@ -1282,7 +1312,7 @@ int ip6_append_data(struct sock *sk, int err =ip6_ufo_append_data (sk, getfrag, from, length, hh_len, fragheaderlen, - transhdrlen, mtu, flags); + transhdrlen, mtu, flags, rt);if (err) goto error;return 0 ;
net/ipv6/udp.c +1 -1
@@ -1359,7 +1359,7 @@ static struct sk_buff *udp6_ufo_fragment fptr = (struct frag_hdr *)(skb_network_header (skb) + unfrag_ip6hlen); fptr->nexthdr = nexthdr; fptr->reserved =0 ; -ipv6_select_ident (fptr); +ipv6_select_ident (fptr, (struct rt6_info *)skb_dst (skb));/* Fragment the skb. ipv6 header and the remaining fields of the * fragment header are updated in ipv6_gso_segment()
PATCH 43/90 icmp: Fix regression in nexthop resolution during replies.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 415b3334a21aa67806c52d1acf4e72e14f7f402f ]
icmp_route_lookup() uses the wrong flow parameters if the reverse session route lookup isn't used.
So do not commit to the re-decoded flow until we actually make a final decision to use a real route saved in 'rt2'.
--- net/ipv4/icmp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
net/ipv4/icmp.c +8 -6
@@ -380,6 +380,7 @@ static struct rtable *icmp_route_lookup( struct icmp_bxm *param) {struct rtable *rt, *rt2; +struct flowi4 fl4_dec;int err;memset (fl4,0 ,sizeof (*fl4));
@@ -408,19 +409,19 @@ static struct rtable *icmp_route_lookup( }else return rt; - err =xfrm_decode_session_reverse (skb_in,flowi4_to_flowi (fl4),AF_INET ); + err =xfrm_decode_session_reverse (skb_in,flowi4_to_flowi (&fl4_dec),AF_INET );if (err) goto relookup_failed; -if (inet_addr_type (net, fl4->saddr) ==RTN_LOCAL ) { - rt2 =__ip_route_output_key (net, fl4); +if (inet_addr_type (net, fl4_dec.saddr) ==RTN_LOCAL ) { + rt2 =__ip_route_output_key (net, &fl4_dec);if (IS_ERR (rt2)) err =PTR_ERR (rt2); }else {struct flowi4 fl4_2 = {};unsigned long orefdst; - fl4_2.daddr = fl4->saddr; + fl4_2.daddr = fl4_dec.saddr; rt2 =ip_route_output_key (net, &fl4_2);if (IS_ERR (rt2)) { err =PTR_ERR (rt2);
@@ -428,7 +429,7 @@ static struct rtable *icmp_route_lookup( }/* Ugh! */ orefdst = skb_in->_skb_refdst;/* save old refdst */ - err =ip_route_input (skb_in, fl4->daddr, fl4->saddr, + err =ip_route_input (skb_in, fl4_dec.daddr, fl4_dec.saddr,RT_TOS (tos), rt2->dst.dev);dst_release (&rt2->dst);
@@ -440,10 +441,11 @@ static struct rtable *icmp_route_lookup( goto relookup_failed; rt2 = (struct rtable *)xfrm_lookup (net, &rt2->dst, -flowi4_to_flowi (fl4),NULL , +flowi4_to_flowi (&fl4_dec),NULL ,XFRM_LOOKUP_ICMP );if (!IS_ERR (rt2)) {dst_release (&rt->dst); +memcpy (fl4, &fl4_dec,sizeof (*fl4)); rt = rt2; }else if (PTR_ERR (rt2) == -EPERM ) {if (rt)
PATCH 44/90 ipv4: Constrain UFO fragment sizes to multiples of 8 bytes
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bill Sommerfeld <[email protected]>
[ Upstream commit d9be4f7a6f5a8da3133b832eca41c3591420b1ca ]
Because the ip fragment offset field counts 8-byte chunks, ip fragments other than the last must contain a multiple of 8 bytes of payload. ip_ufo_append_data wasn't respecting this constraint and, depending on the MTU and ip option sizes, could create malformed non-final fragments.
Google-Bug-Id: 5009328
--- net/ipv4/ip_output.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/ipv4/ip_output.c +3 -3
@@ -734,7 +734,7 @@ static inline int ip_ufo_append_data(strint getfrag (void *from,char *to,int offset,int len,int odd,struct sk_buff *skb), void *from, int length, int hh_len, int fragheaderlen, - int transhdrlen, int mtu, unsigned int flags) + int transhdrlen, int maxfraglen, unsigned int flags) { struct sk_buff *skb;int err;
@@ -767,7 +767,7 @@ static inline int ip_ufo_append_data(str skb->csum =0 ;/* specify the length of each IP datagram fragment */ -skb_shinfo (skb)->gso_size = mtu - fragheaderlen; +skb_shinfo (skb)->gso_size = maxfraglen - fragheaderlen;skb_shinfo (skb)->gso_type =SKB_GSO_UDP ;__skb_queue_tail (queue, skb); }
@@ -831,7 +831,7 @@ static int __ip_append_data(struct sock (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) { err =ip_ufo_append_data (sk, queue, getfrag, from, length, hh_len, fragheaderlen, transhdrlen, - mtu, flags); + maxfraglen, flags);if (err) goto error;return 0 ;
PATCH 45/90 ipv4: fix the reusing of routing cache entries
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Julian Anastasov <[email protected]>
[ Upstream commit d547f727df86059104af2234804fdd538e112015 ]
compare_keys and ip_route_input_common rely onrt_oif for distinguishing of input and output routes with same keys values. But sometimes the input route has also same hash chain (keyed by iif != 0) with the output routes (keyed by orig_oif=0). Problem visible if running with small number of rhash_entries.
Fix them to use rt_route_iif instead. By this way
input route can not be returned to users that request output route.
The patch fixes the ip_rt_bug errors that were
reported in ip_local_out context, mostly for 255.255.255.255 destinations.
--- net/ipv4/route.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/route.c +2 -1
@@ -726,6 +726,7 @@ static inline int compare_keys(struct rt ((__force u32 )rt1->rt_key_src ^ (__force u32 )rt2->rt_key_src) | (rt1->rt_mark ^ rt2->rt_mark) | (rt1->rt_key_tos ^ rt2->rt_key_tos) | + (rt1->rt_route_iif ^ rt2->rt_route_iif) | (rt1->rt_oif ^ rt2->rt_oif) | (rt1->rt_iif ^ rt2->rt_iif)) == 0; }
@@ -2282,8 +2283,8 @@ int ip_route_input_common(struct sk_buffif ((((__force u32 )rth->rt_key_dst ^ (__force u32 )daddr) | ((__force u32 )rth->rt_key_src ^ (__force u32 )saddr) | (rth->rt_iif ^ iif) | - rth->rt_oif | (rth->rt_key_tos ^ tos)) ==0 && +rt_is_input_route (rth) && rth->rt_mark == skb->mark &&net_eq (dev_net (rth->dst.dev), net) && !rt_is_expired (rth)) {
PATCH 46/90 IPVS: Free resources on module removal
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Simon Horman <[email protected]>
[ Upstream commit 7676e345824f162191b1fe2058ad948a6cf91c20 ]
This resolves a panic on module removal.
--- net/netfilter/ipvs/ip_vs_ctl.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/ipvs/ip_vs_ctl.c +1 -0
@@ -3771,6 +3771,7 @@ err_sock:void ip_vs_control_cleanup (void ) {EnterFunction (2 ); +unregister_netdevice_notifier (&ip_vs_dst_notifier);ip_vs_genl_unregister ();nf_unregister_sockopt (&ip_vs_sockopts);LeaveFunction (2 );
PATCH 47/90 net: adjust array index
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Julia Lawall <[email protected]>
[ Upstream commit a1889c0d2039a53ae04abb9f20c62500bd312bf3 ]
Convert array index from the loop bound to the loop index.
A simplified version of the semantic patch that fixes this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
expression e1,e2,ar;
@@
for(e1 = 0; e1 < e2; e1++) { <...
ar[
- e2
+ e1
]
...> }
// </smpl>
--- net/ipv4/igmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/igmp.c +1 -1
@@ -1718,7 +1718,7 @@ static int ip_mc_add_src(struct in_devic pmc->sfcount[sfmode]--;for (j=0 ; j<i; j++) - (void )ip_mc_del1_src (pmc, sfmode, &psfsrc[i]); + (void )ip_mc_del1_src (pmc, sfmode, &psfsrc[j]); }else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE ] !=0 )) {#ifdef CONFIG_IP_MULTICAST struct ip_sf_list *psf;
PATCH 48/90 drivers/net/niu.c: adjust array index
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Julia Lawall <[email protected]>
[ Upstream commit 956837f7c954443f426a82ba6f17b33488cf9a0c ]
Convert array index from the loop bound to the loop index.
A simplified version of the semantic patch that fixes this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
expression e1,e2,ar;
@@
for(e1 = 0; e1 < e2; e1++) { <...
ar[
- e2
+ e1
]
...> }
// </smpl>
--- drivers/net/niu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/niu.c +2 -2
@@ -9196,7 +9196,7 @@ static int __devinit niu_ldg_init(struct first_chan =0 ;for (i =0 ; i < port; i++) - first_chan += parent->rxchan_per_port[port]; + first_chan += parent->rxchan_per_port[i]; num_chan = parent->rxchan_per_port[port];for (i = first_chan; i < (first_chan + num_chan); i++) {
@@ -9212,7 +9212,7 @@ static int __devinit niu_ldg_init(struct first_chan =0 ;for (i =0 ; i < port; i++) - first_chan += parent->txchan_per_port[port]; + first_chan += parent->txchan_per_port[i]; num_chan = parent->txchan_per_port[port];for (i = first_chan; i < (first_chan + num_chan); i++) { err = niu_ldg_assign_ldn(np, parent,
PATCH 49/90 sch_sfq: fix sfq_enqueue()
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit e1738bd9cecc5c867b0e2996470c1ff20f66ba79 ]
commit 8efa88540635 (sch_sfq: avoid giving spurious NET_XMIT_CN signals) forgot to call qdisc_tree_decrease_qlen() to signal upper levels that a packet (from another flow) was dropped, leading to various problems.
With help from Michal Soltys and Michal Pokrywka, who did a bisection.
Bugzilla ref: https://bugzilla.kernel.org/show_bug.cgi?id=39372
Debian ref: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=631945
--- net/sched/sch_sfq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/sched/sch_sfq.c +6 -1
@@ -410,7 +410,12 @@ sfq_enqueue(struct sk_buff *skb, struct/* Return Congestion Notification only if we dropped a packet * from this flow. */ -return (qlen != slot->qlen) ?NET_XMIT_CN :NET_XMIT_SUCCESS ; +if (qlen != slot->qlen) +return NET_XMIT_CN ; + +/* As we dropped a packet, better let upper stack know this */ +qdisc_tree_decrease_qlen (sch,1 ); +return NET_XMIT_SUCCESS ; } static struct sk_buff *
PATCH 50/90 IPv4: Send gratuitous ARP for secondary IP addresses also
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Zoltan Kiss <[email protected]>
[ Upstream commit b76d0789c92a816a5539dc14232a700b8d62a53a ]
If a device event generates gratuitous ARP messages, only primary address is used for sending. This patch iterates through the whole list. Tested with 2 IP addresses configuration on bonding interface.
--- net/ipv4/devinet.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
net/ipv4/devinet.c +8 -8
@@ -1134,15 +1134,15 @@ static void inetdev_send_gratuitous_arp( struct in_device *in_dev) { -struct in_ifaddr *ifa = in_dev->ifa_list; +struct in_ifaddr *ifa; -if (!ifa) -return ; - -arp_send (ARPOP_REQUEST ,ETH_P_ARP , - ifa->ifa_local, dev, - ifa->ifa_local,NULL , - dev->dev_addr,NULL ); +for (ifa = in_dev->ifa_list; ifa; + ifa = ifa->ifa_next) { +arp_send (ARPOP_REQUEST ,ETH_P_ARP , + ifa->ifa_local, dev, + ifa->ifa_local,NULL , + dev->dev_addr,NULL ); + } }/* Called only under RTNL semaphore */
PATCH 51/90 net: add IFF_SKB_TX_SHARED flag to priv_flags
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Neil Horman <[email protected]>
[ Upstream commit d8873315065f1f527c7c380402cf59b1e1d0ae36 ]
Pktgen attempts to transmit shared skbs to net devices, which can't be used by some drivers as they keep state information in skbs. This patch adds a flag marking drivers as being able to handle shared skbs in their tx path. Drivers are defaulted to being unable to do so, but calling ether_setup enables this flag, as 90% of the drivers calling ether_setup touch real hardware and can handle shared skbs. A subsequent patch will audit drivers to ensure that the flag is set properly
--- include/linux/if.h | 2 ++ net/core/pktgen.c | 8 +++++--- net/ethernet/eth.c | 1 + 3 files changed, 8 insertions(+), 3 deletions(-)
include/linux/if.h +2 -0
@@ -76,6 +76,8 @@#define IFF_BRIDGE_PORT 0x4000/* device used as bridge port */ #define IFF_OVS_DATAPATH 0x8000/* device used as Open vSwitch * datapath port */ +#define IFF_TX_SKB_SHARING 0x10000/* The interface supports sharing +* skbs on transmit */ #define IF_GET_IFACE 0x0001/* for querying only */ #define IF_GET_PROTO 0x0002
net/core/pktgen.c +5 -3
@@ -1070,7 +1070,9 @@ static ssize_t pktgen_if_write(struct fi len =num_arg (&user_buffer[i],10 , &value);if (len <0 )return len; - +if ((value >0 ) && + (!(pkt_dev->odev->priv_flags &IFF_TX_SKB_SHARING ))) +return -ENOTSUPP ; i += len; pkt_dev->clone_skb = value;
@@ -3555,7 +3557,6 @@ static int pktgen_add_device(struct pktg pkt_dev->min_pkt_size =ETH_ZLEN ; pkt_dev->max_pkt_size =ETH_ZLEN ; pkt_dev->nfrags =0 ; - pkt_dev->clone_skb = pg_clone_skb_d; pkt_dev->delay = pg_delay_d; pkt_dev->count = pg_count_d; pkt_dev->sofar =0 ;
@@ -3563,7 +3564,6 @@ static int pktgen_add_device(struct pktg pkt_dev->udp_src_max =9 ; pkt_dev->udp_dst_min =9 ; pkt_dev->udp_dst_max =9 ; - pkt_dev->vlan_p =0 ; pkt_dev->vlan_cfi =0 ; pkt_dev->vlan_id =0xffff ;
@@ -3575,6 +3575,8 @@ static int pktgen_add_device(struct pktg err =pktgen_setup_dev (pkt_dev, ifname);if (err) goto out1; +if (pkt_dev->odev->priv_flags &IFF_TX_SKB_SHARING ) + pkt_dev->clone_skb = pg_clone_skb_d; pkt_dev->entry =proc_create_data (ifname,0600 , pg_proc_dir, &pktgen_if_fops, pkt_dev);
net/ethernet/eth.c +1 -0
@@ -340,6 +340,7 @@ void ether_setup(struct net_device *dev) dev->addr_len =ETH_ALEN ; dev->tx_queue_len =1000 ;/* Ethernet wants good queues */ dev->flags =IFF_BROADCAST |IFF_MULTICAST ; + dev->priv_flags =IFF_TX_SKB_SHARING ;memset (dev->broadcast,0xFF ,ETH_ALEN );
PATCH 52/90 net: Audit drivers to identify those needing IFF_TX_SKB_SHARING cleared
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Neil Horman <[email protected]>
[ Upstream commit 550fd08c2cebad61c548def135f67aba284c6162 ]
After the last patch, We are left in a state in which only drivers calling ether_setup have IFF_TX_SKB_SHARING set (we assume that drivers touching real hardware call ether_setup for their net_devices and don't hold any state in their skbs. There are a handful of drivers that violate this assumption of course, and need to be fixed up. This patch identifies those drivers, and marks them as not being able to support the safe transmission of skbs by clearning the IFF_TX_SKB_SHARING flag in priv_flags
--- drivers/isdn/i4l/isdn_net.c | 3 +++ drivers/net/bonding/bond_main.c | 6 ++++-- drivers/net/ifb.c | 2 +- drivers/net/macvlan.c | 2 +- drivers/net/tun.c | 1 + drivers/net/veth.c | 2 ++ drivers/net/wan/hdlc_fr.c | 5 +++-- drivers/net/wireless/airo.c | 1 + drivers/net/wireless/hostap/hostap_main.c | 1 + drivers/staging/ath6kl/os/linux/ar6000_drv.c | 1 + net/8021q/vlan_dev.c | 2 +- net/bluetooth/bnep/netdev.c | 1 + net/l2tp/l2tp_eth.c | 2 +- net/mac80211/iface.c | 1 + 14 files changed, 22 insertions(+), 8 deletions(-)
drivers/isdn/i4l/isdn_net.c +3 -0
@@ -2531,6 +2531,9 @@ static void _isdn_setup(struct net_devic/* Setup the generic properties */ dev->flags =IFF_NOARP |IFF_POINTOPOINT ; + +/* isdn prepends a header in the tx path, can't share skbs */ + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; dev->header_ops =NULL ; dev->netdev_ops = &isdn_netdev_ops;
drivers/net/bonding/bond_main.c +4 -2
@@ -1625,8 +1625,10 @@ int bond_enslave(struct net_device *bondif (slave_dev->type !=ARPHRD_ETHER )bond_setup_by_slave (bond_dev, slave_dev); -else +else {ether_setup (bond_dev); + bond_dev->priv_flags &= ~IFF_TX_SKB_SHARING ; + }netdev_bonding_change (bond_dev,NETDEV_POST_TYPE_CHANGE );
@@ -4398,7 +4400,7 @@ static void bond_setup(struct net_device bond_dev->tx_queue_len =0 ; bond_dev->flags |=IFF_MASTER |IFF_MULTICAST ; bond_dev->priv_flags |=IFF_BONDING ; - bond_dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; + bond_dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE |IFF_TX_SKB_SHARING );/* At first, we block adding VLANs. That's the only way to * prevent problems that occur when adding VLANs over an
drivers/net/ifb.c +1 -1
@@ -145,7 +145,7 @@ static void ifb_setup(struct net_device dev->flags |=IFF_NOARP ; dev->flags &= ~IFF_MULTICAST ; - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE |IFF_TX_SKB_SHARING );random_ether_addr (dev->dev_addr); }
drivers/net/macvlan.c +1 -1
@@ -547,7 +547,7 @@ void macvlan_common_setup(struct net_dev {ether_setup (dev); - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE |IFF_TX_SKB_SHARING ); dev->netdev_ops = &macvlan_netdev_ops; dev->destructor = free_netdev; dev->header_ops = &macvlan_hard_header_ops,
drivers/net/tun.c +1 -0
@@ -528,6 +528,7 @@ static void tun_net_init(struct net_devi dev->netdev_ops = &tap_netdev_ops;/* Ethernet TAP Device */ ether_setup (dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ;random_ether_addr (dev->dev_addr);
drivers/net/veth.c +2 -0
@@ -262,6 +262,8 @@ static void veth_setup(struct net_device {ether_setup (dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; + dev->netdev_ops = &veth_netdev_ops; dev->ethtool_ops = &veth_ethtool_ops; dev->features |=NETIF_F_LLTX ;
drivers/net/wan/hdlc_fr.c +3 -2
@@ -1083,9 +1083,10 @@ static int fr_add_pvc(struct net_device used =pvc_is_used (pvc); -if (type ==ARPHRD_ETHER ) +if (type ==ARPHRD_ETHER ) { dev =alloc_netdev (0 ,"pvceth%d" , ether_setup); -else + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; + }else dev =alloc_netdev (0 ,"pvc%d" , pvc_setup);if (!dev) {
drivers/net/wireless/airo.c +1 -0
@@ -2823,6 +2823,7 @@ static struct net_device *_init_airo_car dev->wireless_data = &ai->wireless_data; dev->irq = irq; dev->base_addr = port; + dev->priv_flags &= ~IFF_TX_SKB_SHARING ;SET_NETDEV_DEV (dev, dmdev);
drivers/net/wireless/hostap/hostap_main.c +1 -0
@@ -855,6 +855,7 @@ void hostap_setup_dev(struct net_device iface =netdev_priv (dev);ether_setup (dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ;/* kernel callbacks */ if (iface) {
drivers/staging/ath6kl/os/linux/ar6000_drv.c +1 -0
@@ -6198,6 +6198,7 @@ int ar6000_create_ap_interface(struct arether_setup (dev);init_netdev (dev, ap_ifname); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ;if (register_netdev (dev)) {AR_DEBUG_PRINTF (ATH_DEBUG_ERR ,("ar6000_create_ap_interface: register_netdev failed\n" ));
net/8021q/vlan_dev.c +1 -1
@@ -694,7 +694,7 @@ void vlan_setup(struct net_device *dev)ether_setup (dev); dev->priv_flags |=IFF_802_1Q_VLAN ; - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE |IFF_TX_SKB_SHARING ); dev->tx_queue_len =0 ; dev->netdev_ops = &vlan_netdev_ops;
net/bluetooth/bnep/netdev.c +1 -0
@@ -231,6 +231,7 @@ void bnep_net_setup(struct net_device *d dev->addr_len =ETH_ALEN ;ether_setup (dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; dev->netdev_ops = &bnep_netdev_ops; dev->watchdog_timeo =HZ *2 ;
net/l2tp/l2tp_eth.c +1 -1
@@ -103,7 +103,7 @@ static struct net_device_ops l2tp_eth_nestatic void l2tp_eth_dev_setup (struct net_device *dev) {ether_setup (dev); - + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; dev->netdev_ops = &l2tp_eth_netdev_ops; dev->destructor = free_netdev; }
net/mac80211/iface.c +1 -0
@@ -699,6 +699,7 @@ static const struct net_device_ops ieee8static void ieee80211_if_setup (struct net_device *dev) {ether_setup (dev); + dev->priv_flags &= ~IFF_TX_SKB_SHARING ; dev->netdev_ops = &ieee80211_dataif_ops; dev->destructor = free_netdev; }
PATCH 53/90 bonding: fix string comparison errors
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Andy Gospodarek <[email protected]>
[ Upstream commit f4bb2e9c4fa9e5fdddf90589703613fd1a9c519f ]
When a bond contains a device where one name is the subset of another (eth1 and eth10, for example), one cannot properly set the primary device or the currently active device.
This was reported and based on work by Takuma Umeya. I also verified the problem and tested that this fix resolves it.
V2: A few did not like the the current code or my changes, so I refactored bonding_store_primary and bonding_store_active_slave to be a bit cleaner, dropped the use of strnicmp since we did not really need the comparison to be case insensitive, and formatted the input string from sysfs so a comparison to IFNAMSIZ could be used.
I also discovered an error in bonding_store_active_slave that would modify bond->primary_slave rather than bond->curr_active_slave before forcing the bonding driver to choose a new active slave.
V3: Actually sending the proper patch....
--- drivers/net/bonding/bond_sysfs.c | 133 ++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 62 deletions(-)
drivers/net/bonding/bond_sysfs.c +71 -62
@@ -992,6 +992,7 @@ static ssize_t bonding_store_primary(strint i;struct slave *slave;struct bonding *bond =to_bond (d); +char ifname[IFNAMSIZ ];if (!rtnl_trylock ())return restart_syscall ();
@@ -1002,32 +1003,33 @@ static ssize_t bonding_store_primary(strif (!USES_PRIMARY (bond->params.mode)) {pr_info ("%s: Unable to set primary slave; %s is in mode %d\n" , bond->dev->name, bond->dev->name, bond->params.mode); - }else { -bond_for_each_slave (bond, slave, i) { -if (strnicmp - (slave->dev->name, buf, -strlen (slave->dev->name)) ==0 ) { -pr_info ("%s: Setting %s as primary slave.\n" , - bond->dev->name, slave->dev->name); - bond->primary_slave = slave; -strcpy (bond->params.primary, slave->dev->name); -bond_select_active_slave (bond); - goto out; - } - } + goto out; + } -/* if we got here, then we didn't match the name of any slave */ +sscanf (buf,"%16s" , ifname);/* IFNAMSIZ */ -if (strlen (buf) ==0 || buf[0 ] =='\n' ) { -pr_info ("%s: Setting primary slave to None.\n" , - bond->dev->name); - bond->primary_slave =NULL ; -bond_select_active_slave (bond); - }else { -pr_info ("%s: Unable to set %.*s as primary slave as it is not a slave.\n" , - bond->dev->name, (int )strlen (buf) -1 , buf); +/* check to see if we are clearing primary */ +if (!strlen (ifname) || buf[0 ] =='\n' ) { +pr_info ("%s: Setting primary slave to None.\n" , + bond->dev->name); + bond->primary_slave =NULL ; +bond_select_active_slave (bond); + goto out; + } + +bond_for_each_slave (bond, slave, i) { +if (strncmp (slave->dev->name, ifname,IFNAMSIZ ) ==0 ) { +pr_info ("%s: Setting %s as primary slave.\n" , + bond->dev->name, slave->dev->name); + bond->primary_slave = slave; +strcpy (bond->params.primary, slave->dev->name); +bond_select_active_slave (bond); + goto out; } } + +pr_info ("%s: Unable to set %.*s as primary slave.\n" , + bond->dev->name, (int )strlen (buf) -1 , buf); out:write_unlock_bh (&bond->curr_slave_lock);read_unlock (&bond->lock);
@@ -1162,6 +1164,7 @@ static ssize_t bonding_store_active_slavstruct slave *old_active =NULL ;struct slave *new_active =NULL ;struct bonding *bond =to_bond (d); +char ifname[IFNAMSIZ ];if (!rtnl_trylock ())return restart_syscall ();
@@ -1170,56 +1173,62 @@ static ssize_t bonding_store_active_slavread_lock (&bond->lock);write_lock_bh (&bond->curr_slave_lock); -if (!USES_PRIMARY (bond->params.mode)) +if (!USES_PRIMARY (bond->params.mode)) {pr_info ("%s: Unable to change active slave; %s is in mode %d\n" , bond->dev->name, bond->dev->name, bond->params.mode); -else { -bond_for_each_slave (bond, slave, i) { -if (strnicmp - (slave->dev->name, buf, -strlen (slave->dev->name)) ==0 ) { - old_active = bond->curr_active_slave; - new_active = slave; -if (new_active == old_active) { -/* do nothing */ -pr_info ("%s: %s is already the current active slave.\n" , + goto out; + } + +sscanf (buf,"%16s" , ifname);/* IFNAMSIZ */ + +/* check to see if we are clearing active */ +if (!strlen (ifname) || buf[0 ] =='\n' ) { +pr_info ("%s: Clearing current active slave.\n" , + bond->dev->name); + bond->curr_active_slave =NULL ; +bond_select_active_slave (bond); + goto out; + } + +bond_for_each_slave (bond, slave, i) { +if (strncmp (slave->dev->name, ifname,IFNAMSIZ ) ==0 ) { + old_active = bond->curr_active_slave; + new_active = slave; +if (new_active == old_active) { +/* do nothing */ +pr_info ("%s: %s is already the current" +" active slave.\n" , + bond->dev->name, + slave->dev->name); + goto out; + } +else { +if ((new_active) && + (old_active) && + (new_active->link ==BOND_LINK_UP ) && +IS_UP (new_active->dev)) { +pr_info ("%s: Setting %s as active" +" slave.\n" , bond->dev->name, slave->dev->name); - goto out; +bond_change_active_slave (bond, + new_active); }else { -if ((new_active) && - (old_active) && - (new_active->link ==BOND_LINK_UP ) && -IS_UP (new_active->dev)) { -pr_info ("%s: Setting %s as active slave.\n" , - bond->dev->name, - slave->dev->name); -bond_change_active_slave (bond, new_active); - } -else { -pr_info ("%s: Could not set %s as active slave; either %s is down or the link is down.\n" , - bond->dev->name, - slave->dev->name, - slave->dev->name); - } - goto out; +pr_info ("%s: Could not set %s as" +" active slave; either %s is" +" down or the link is down.\n" , + bond->dev->name, + slave->dev->name, + slave->dev->name); } + goto out; } } - -/* if we got here, then we didn't match the name of any slave */ - -if (strlen (buf) ==0 || buf[0 ] =='\n' ) { -pr_info ("%s: Setting active slave to None.\n" , - bond->dev->name); - bond->primary_slave =NULL ; -bond_select_active_slave (bond); - }else { -pr_info ("%s: Unable to set %.*s as active slave as it is not a slave.\n" , - bond->dev->name, (int )strlen (buf) -1 , buf); - } } + +pr_info ("%s: Unable to set %.*s as active slave.\n" , + bond->dev->name, (int )strlen (buf) -1 , buf); out:write_unlock_bh (&bond->curr_slave_lock);read_unlock (&bond->lock);
PATCH 54/90 Fix cdc-phonet build
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Chris Clayton <[email protected]>
[ Upstream commit a0295a3b6775ab88f5883684e14bbda8d287822d ]
Try to send to correct address this time!
---------- Forwarded Message ----------
Subject: [54/90] [PATCH] Fix cdc-phonet build
Date: Saturday 23 Jul 2011
From: Chris Clayton <[email protected]>
To: [email protected]
cdc-phonet does not presently build on linux-3.0 because there is no entry for it in drivers/net/Makefile. This patch adds that entry.
--- drivers/net/Makefile | 1 + 1 file changed, 1 insertion(+)
drivers/net/Makefile +1 -0
@@ -283,6 +283,7 @@ obj-$(CONFIG_USB_HSO) += usb/ obj-$(CONFIG_USB_USBNET) += usb/ obj-$(CONFIG_USB_ZD1201) += usb/ obj-$(CONFIG_USB_IPHETH) += usb/ +obj-$(CONFIG_USB_CDC_PHONET) += usb/ obj-$(CONFIG_WLAN) += wireless/ obj-$(CONFIG_NET_TULIP) += tulip/
PATCH 55/90 xfrm: Fix key lengths for rfc3686(ctr(aes))
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tushar Gohad <[email protected]>
[ Upstream commit 4203223a1aed862b4445fdcd260d6139603a51d9 ]
Fix the min and max bit lengths for AES-CTR (RFC3686) keys. The number of bits in key spec is the key length (128/256) plus 32 bits of nonce.
This change takes care of the "Invalid key length" errors reported by setkey when specifying 288 bit keys for aes-ctr.
--- net/xfrm/xfrm_algo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/xfrm/xfrm_algo.c +2 -2
@@ -462,8 +462,8 @@ static struct xfrm_algo_desc ealg_list[] .desc = { .sadb_alg_id = SADB_X_EALG_AESCTR, .sadb_alg_ivlen = 8, - .sadb_alg_minbits = 128, - .sadb_alg_maxbits = 256 + .sadb_alg_minbits = 160, + .sadb_alg_maxbits = 288 } }, };
PATCH 56/90 sis190: Rx filter init is needed for MAC address change.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Klement Fish <[email protected]>
[ Upstream commit fe66101f14813b77d84f6450d51772a2af2b81a1 ]
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=34552
--- drivers/net/sis190.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/net/sis190.c +11 -1
@@ -1824,6 +1824,16 @@ static int sis190_ioctl(struct net_devicgeneric_mii_ioctl (&tp->mii_if,if_mii (ifr), cmd,NULL ); } +static int sis190_mac_addr (struct net_device *dev,void *p) +{ +int rc; + + rc =eth_mac_addr (dev, p); +if (!rc) +sis190_init_rxfilter (dev); +return rc; +} +static const struct net_device_ops sis190_netdev_ops = { .ndo_open = sis190_open, .ndo_stop = sis190_close,
@@ -1832,7 +1842,7 @@ static const struct net_device_ops sis19 .ndo_tx_timeout = sis190_tx_timeout, .ndo_set_multicast_list = sis190_set_rx_mode, .ndo_change_mtu = eth_change_mtu, - .ndo_set_mac_address = eth_mac_addr, + .ndo_set_mac_address = sis190_mac_addr, .ndo_validate_addr = eth_validate_addr, #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = sis190_netpoll,
PATCH 57/90 r8169: Add support for D-Link 530T rev C1 (Kernel Bug 38862)
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Lennart Sorensen <[email protected]>
[ Upstream commit 93a3aa25933461d76141179fc94aa32d5f9d954a ]
The D-Link DGE-530T rev C1 is a re-badged Realtek 8169 named DLG10028C, unlike the previous revisions which were skge based. It is probably the same as the discontinued DGE-528T (0x4300) other than the PCI ID.
The PCI ID is 0x1186:0x4302.
Adding it to r8169.c where 0x1186:0x4300 is already found makes the card be detected and work.
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=38862
--- drivers/net/r8169.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/r8169.c +1 -0
@@ -236,6 +236,7 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_p { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 }, { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 }, { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 }, + { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4302), 0, 0, RTL_CFG_0 }, { PCI_DEVICE(PCI_VENDOR_ID_AT, 0xc107), 0, 0, RTL_CFG_0 }, { PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 }, { PCI_VENDOR_ID_LINKSYS, 0x1032,
PATCH 58/90 net: allow netif_carrier to be called safely from IRQ
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: stephen hemminger <[email protected]>
[ Upstream commit 1821f7cd65ad9ea56580b830ac79bf4c4fef59cb ]
As reported by Ben Greer and Froncois Romieu. The code path in the netif_carrier code leads it to try and disable
a late workqueue to reenable it immediately netif_carrier_on
-> linkwatch_fire_event
-> linkwatch_schedule_work
-> cancel_delayed_work
-> del_timer_syncIf __cancel_delayed_work is used instead then there is no problem of waiting for running linkwatch_event.
There is a race between linkwatch_event running re-scheduling but it is harmless to schedule an extra scan of the linkwatch queue.
--- net/core/link_watch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/link_watch.c +1 -1
@@ -126,7 +126,7 @@ static void linkwatch_schedule_work(intreturn ;/* It's already running which is good enough. */ -if (!cancel_delayed_work (&linkwatch_work)) +if (!__cancel_delayed_work (&linkwatch_work))return ;/* Otherwise we reschedule it again for immediate execution. */
PATCH 59/90 ipv4: use RT_TOS after some rt_tos conversions
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Julian Anastasov <[email protected]>
[ Upstream commit b0fe4a31849063fcac0bdc93716ca92615e93f57 ]
rt_tos was changed to iph->tos but it must be filtered by RT_TOS
--- net/ipv4/ipmr.c | 2 +- net/ipv4/route.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ipmr.c +1 -1
@@ -1796,7 +1796,7 @@ static struct mr_table *ipmr_rt_fib_lookstruct flowi4 fl4 = { .daddr = iph->daddr, .saddr = iph->saddr, - .flowi4_tos = iph->tos, + .flowi4_tos =RT_TOS (iph->tos), .flowi4_oif = rt->rt_oif, .flowi4_iif = rt->rt_iif, .flowi4_mark = rt->rt_mark,
net/ipv4/route.c +1 -1
@@ -1705,7 +1705,7 @@ void ip_rt_get_source(u8 *addr, struct smemset (&fl4,0 ,sizeof (fl4)); fl4.daddr = iph->daddr; fl4.saddr = iph->saddr; - fl4.flowi4_tos = iph->tos; + fl4.flowi4_tos =RT_TOS (iph->tos); fl4.flowi4_oif = rt->dst.dev->ifindex; fl4.flowi4_iif = skb->dev->ifindex; fl4.flowi4_mark = skb->mark;
PATCH 60/90 gre: fix improper error handling
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "[email protected]" <[email protected]>
[ Upstream commit 559fafb94ad9e4cd8774f39241917c57396f9fc5 ]
Fix improper protocol err_handler, current implementation is fully unapplicable and may cause kernel crash due to double kfree_skb.
--- net/ipv4/gre.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-)
net/ipv4/gre.c +6 -15
@@ -15,6 +15,7 @@#include <linux/kmod.h> #include <linux/skbuff.h> #include <linux/in.h> +#include <linux/ip.h> #include <linux/netdevice.h> #include <linux/version.h> #include <linux/spinlock.h>
@@ -97,27 +98,17 @@ drop:static void gre_err (struct sk_buff *skb,u32 info) {const struct gre_protocol *proto; -u8 ver; - -if (!pskb_may_pull (skb,12 )) - goto drop; +const struct iphdr *iph = (const struct iphdr *)skb->data; +u8 ver = skb->data[(iph->ihl<<2 ) +1 ]&0x7f ; - ver = skb->data[1 ]&0x7f ;if (ver >=GREPROTO_MAX ) - goto drop; +return ;rcu_read_lock (); proto =rcu_dereference (gre_proto[ver]); -if (!proto || !proto->err_handler) - goto drop_unlock; - proto->err_handler (skb, info); -rcu_read_unlock (); -return ; - -drop_unlock: +if (proto && proto->err_handler) + proto->err_handler (skb, info);rcu_read_unlock (); -drop: -kfree_skb (skb); }static const struct net_protocol net_gre_protocol = {
PATCH 61/90 iwlagn: 5000 do not support idle mode
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wey-Yi Guy <[email protected]>
commit f35291082294ca6737953bbe4e9491ede04ab822 upstream.
5000 series has issue supporting power save idle mode:
commit 9dc2153315650eae220898668b6aa56a25c130be
iwlwifi: always support idle mode for agn devices
For agn devices, always support idle mode which help power consumption in idle unassociated state.
the above changes cause 5000 become not stable when power management is "on"
http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2312
--- drivers/net/wireless/iwlwifi/iwl-5000.c | 1 + drivers/net/wireless/iwlwifi/iwl-core.h | 2 ++ drivers/net/wireless/iwlwifi/iwl-power.c | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/iwlwifi/iwl-5000.c +1 -0
@@ -421,6 +421,7 @@ static struct iwl_base_params iwl5000_ba .chain_noise_scale = 1000, .wd_timeout = IWL_LONG_WD_TIMEOUT, .max_event_log_size = 512, + .no_idle_support = true, };static struct iwl_ht_params iwl5000_ht_params = { .ht_greenfield_support = true,
drivers/net/wireless/iwlwifi/iwl-core.h +2 -0
@@ -195,6 +195,7 @@ struct iwl_mod_params {* @temperature_kelvin: temperature report by uCode in kelvin * @max_event_log_size: size of event log buffer size for ucode event logging * @shadow_reg_enable: HW shadhow register bit +* @no_idle_support: do not support idle mode */ struct iwl_base_params {int eeprom_size;
@@ -216,6 +217,7 @@ struct iwl_base_params {bool temperature_kelvin;u32 max_event_log_size;const bool shadow_reg_enable; +const bool no_idle_support; };/* * @advanced_bt_coexist: support advanced bt coexist
drivers/net/wireless/iwlwifi/iwl-power.c +2 -1
@@ -355,7 +355,8 @@ static void iwl_power_build_cmd(struct i dtimper = priv->hw->conf.ps_dtim_period ?:1 ; -if (priv->hw->conf.flags &IEEE80211_CONF_IDLE ) +if (!priv->cfg->base_params->no_idle_support && + priv->hw->conf.flags &IEEE80211_CONF_IDLE )iwl_static_sleep_cmd (priv, cmd,IWL_POWER_INDEX_5 ,20 );else if (iwl_tt_is_low_power_state (priv)) {/* in thermal throttling low power state */
PATCH 62/90 mpt2sas: Fixed Big Indian Issues on 32 bit PPC
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Kashyap, Desai" <[email protected]>
commit c97951ec46d4b076c2236b77db34eeed6dddb8eb upstream.
This patch addresses many endian issues solved by runing sparse with the option __CHECK_ENDIAN__ turned on.
--- drivers/scsi/mpt2sas/mpt2sas_base.c | 65 +++++++++++-------------------- drivers/scsi/mpt2sas/mpt2sas_base.h | 53 +++++++++++++++++++++++-- drivers/scsi/mpt2sas/mpt2sas_ctl.c | 10 ++-- drivers/scsi/mpt2sas/mpt2sas_debug.h | 2 drivers/scsi/mpt2sas/mpt2sas_scsih.c | 12 ++--- drivers/scsi/mpt2sas/mpt2sas_transport.c | 24 ++++------- 6 files changed, 96 insertions(+), 70 deletions(-)
drivers/scsi/mpt2sas/mpt2sas_base.c +25 -40
@@ -94,7 +94,7 @@ module_param(diag_buffer_enable, int, 0)MODULE_PARM_DESC (diag_buffer_enable," post diag buffers " "(TRACE=1/SNAPSHOT=2/EXTENDED=4/default=0)" ); -int mpt2sas_fwfault_debug; +static int mpt2sas_fwfault_debug;MODULE_PARM_DESC (mpt2sas_fwfault_debug," enable detection of firmware fault " "and halt firmware - (default=0)" );
@@ -857,7 +857,7 @@ _base_interrupt(int irq, void *bus_id) completed_cmds =0 ; cb_idx =0xFF ; do { - rd.word = rpf->Words; + rd.word = le64_to_cpu(rpf->Words); if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX) goto out; reply = 0;
@@ -906,7 +906,7 @@ _base_interrupt(int irq, void *bus_id) next: - rpf->Words =ULLONG_MAX ; + rpf->Words =cpu_to_le64 (ULLONG_MAX ); ioc->reply_post_host_index = (ioc->reply_post_host_index == (ioc->reply_post_queue_depth -1 )) ?0 : ioc->reply_post_host_index +1 ;
@@ -1817,7 +1817,9 @@ _base_display_ioc_capabilities(struct MPchar desc[16 ];u8 revision;u32 iounit_pg1_flags; +u32 bios_version; + bios_version =le32_to_cpu (ioc->bios_pg3.BiosVersion);pci_read_config_byte (ioc->pdev,PCI_CLASS_REVISION , &revision);strncpy (desc, ioc->manu_pg0.ChipName,16 ); printk(MPT2SAS_INFO_FMT "%s: FWVersion(%02d.%02d.%02d.%02d), "
@@ -1828,10 +1830,10 @@ _base_display_ioc_capabilities(struct MP (ioc->facts.FWVersion.Word &0x0000FF00 ) >>8 , ioc->facts.FWVersion.Word &0x000000FF , revision, - (ioc->bios_pg3.BiosVersion &0xFF000000 ) >>24 , - (ioc->bios_pg3.BiosVersion &0x00FF0000 ) >>16 , - (ioc->bios_pg3.BiosVersion &0x0000FF00 ) >>8 , - ioc->bios_pg3.BiosVersion & 0x000000FF); + (bios_version &0xFF000000 ) >>24 , + (bios_version &0x00FF0000 ) >>16 , + (bios_version &0x0000FF00 ) >>8 , + bios_version & 0x000000FF);_base_display_dell_branding (ioc);_base_display_intel_branding (ioc);
@@ -2150,7 +2152,7 @@ _base_release_memory_pools(struct MPT2SAstatic int _base_allocate_memory_pools (struct MPT2SAS_ADAPTER *ioc,int sleep_flag) { -Mpi2IOCFactsReply_t *facts; +struct mpt2sas_facts *facts;u32 queue_size, queue_diff;u16 max_sge_elements;u16 num_of_reply_frames;
@@ -2783,7 +2785,7 @@ _base_handshake_req_reply_wait(struct MPint i;u8 failed;u16 dummy; -u32 *mfp; +__le32 *mfp;/* make sure doorbell is not in use */ if ((readl (&ioc->chip->Doorbell) &MPI2_DOORBELL_USED )) {
@@ -2871,7 +2873,7 @@ _base_handshake_req_reply_wait(struct MPwritel (0 , &ioc->chip->HostInterruptStatus);if (ioc->logging_level &MPT_DEBUG_INIT ) { - mfp = (u32 *)reply; + mfp = (__le32 *)reply;printk (KERN_INFO "\toffset:data\n" );for (i =0 ; i < reply_bytes/4 ; i++) printk(KERN_INFO "\t[0x%02x]:%08x\n", i*4,
@@ -3097,7 +3099,8 @@ static int _base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag) { Mpi2PortFactsRequest_t mpi_request; -Mpi2PortFactsReply_t mpi_reply, *pfacts; +Mpi2PortFactsReply_t mpi_reply; +struct mpt2sas_port_facts *pfacts;int mpi_reply_sz, mpi_request_sz, r; dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
@@ -3139,7 +3142,8 @@ static int _base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) {Mpi2IOCFactsRequest_t mpi_request; -Mpi2IOCFactsReply_t mpi_reply, *facts; +Mpi2IOCFactsReply_t mpi_reply; +struct mpt2sas_facts *facts;int mpi_reply_sz, mpi_request_sz, r; dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "%s\n", ioc->name,
@@ -3225,17 +3229,6 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT mpi_request.MsgVersion =cpu_to_le16 (MPI2_VERSION ); mpi_request.HeaderVersion =cpu_to_le16 (MPI2_HEADER_VERSION ); -/* In MPI Revision I (0xA), the SystemReplyFrameSize(offset 0x18) was -* removed and made reserved. For those with older firmware will need -* this fix. It was decided that the Reply and Request frame sizes are -* the same. -*/ -if ((ioc->facts.HeaderVersion >>8 ) <0xA ) { - mpi_request.Reserved7 =cpu_to_le16 (ioc->reply_sz); -/* mpi_request.SystemReplyFrameSize = -* cpu_to_le16(ioc->reply_sz); -*/ - } mpi_request.SystemRequestFrameSize =cpu_to_le16 (ioc->request_sz/4 ); mpi_request.ReplyDescriptorPostQueueDepth =
@@ -3243,25 +3236,17 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT mpi_request.ReplyFreeQueueDepth =cpu_to_le16 (ioc->reply_free_queue_depth); -#if BITS_PER_LONG >32 mpi_request.SenseBufferAddressHigh = -cpu_to_le32 (ioc->sense_dma >>32 ); +cpu_to_le32 ((u64 )ioc->sense_dma >>32 ); mpi_request.SystemReplyAddressHigh = -cpu_to_le32 (ioc->reply_dma >>32 ); +cpu_to_le32 ((u64 )ioc->reply_dma >>32 ); mpi_request.SystemRequestFrameBaseAddress = -cpu_to_le64 (ioc->request_dma); +cpu_to_le64 ((u64 )ioc->request_dma); mpi_request.ReplyFreeQueueAddress = -cpu_to_le64 (ioc->reply_free_dma); +cpu_to_le64 ((u64 )ioc->reply_free_dma); mpi_request.ReplyDescriptorPostQueueAddress = -cpu_to_le64 (ioc->reply_post_free_dma); -#else - mpi_request.SystemRequestFrameBaseAddress = -cpu_to_le32 (ioc->request_dma); - mpi_request.ReplyFreeQueueAddress = -cpu_to_le32 (ioc->reply_free_dma); - mpi_request.ReplyDescriptorPostQueueAddress = -cpu_to_le32 (ioc->reply_post_free_dma); -#endif +cpu_to_le64 ((u64 )ioc->reply_post_free_dma); +/* This time stamp specifies number of milliseconds * since epoch ~ midnight January 1, 1970.
@@ -3271,10 +3256,10 @@ _base_send_ioc_init(struct MPT2SAS_ADAPT (current_time.tv_usec / 1000));if (ioc->logging_level &MPT_DEBUG_INIT ) { -u32 *mfp; +__le32 *mfp;int i; - mfp = (u32 *)&mpi_request; + mfp = (__le32 *)&mpi_request;printk (KERN_INFO "\toffset:data\n" );for (i =0 ; i <sizeof (Mpi2IOCInitRequest_t)/4 ; i++) printk(KERN_INFO "\t[0x%02x]:%08x\n", i*4,
@@ -3759,7 +3744,7 @@ _base_make_ioc_operational(struct MPT2SA/* initialize Reply Post Free Queue */ for (i =0 ; i < ioc->reply_post_queue_depth; i++) - ioc->reply_post_free[i].Words =ULLONG_MAX ; + ioc->reply_post_free[i].Words =cpu_to_le64 (ULLONG_MAX ); r =_base_send_ioc_init (ioc, sleep_flag);if (r)
drivers/scsi/mpt2sas/mpt2sas_base.h +50 -3
71 lines not on this page · raw message
drivers/scsi/mpt2sas/mpt2sas_ctl.c +5 -5
@@ -2706,13 +2706,13 @@ static DEVICE_ATTR(ioc_reset_count, S_IR _ctl_ioc_reset_count_show, NULL);struct DIAG_BUFFER_START { -u32 Size; -u32 DiagVersion; +__le32 Size; +__le32 DiagVersion;u8 BufferType;u8 Reserved[3 ]; -u32 Reserved1; -u32 Reserved2; -u32 Reserved3; +__le32 Reserved1; +__le32 Reserved2; +__le32 Reserved3; };/** * _ctl_host_trace_buffer_size_show - host buffer size (trace only)
drivers/scsi/mpt2sas/mpt2sas_debug.h +1 -1
@@ -164,7 +164,7 @@ static inline void _debug_dump_mf(void *mpi_request, int sz) {int i; -u32 *mfp = (u32 *)mpi_request; +__le32 *mfp = (__le32 *)mpi_request;printk (KERN_INFO "mf:\n\t" );for (i =0 ; i < sz; i++) {
drivers/scsi/mpt2sas/mpt2sas_scsih.c +6 -6
@@ -1956,7 +1956,7 @@ _scsih_slave_configure(struct scsi_deviccase MPI2_RAID_VOL_TYPE_RAID1E : qdepth =MPT2SAS_RAID_QUEUE_DEPTH ;if (ioc->manu_pg10.OEMIdentifier && - (ioc->manu_pg10.GenericFlags0 & + (le32_to_cpu (ioc->manu_pg10.GenericFlags0) &MFG10_GF0_R10_DISPLAY ) && !(raid_device->num_pds %2 )) r_level ="RAID10" ;
@@ -4598,7 +4598,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTMpi2SasEnclosurePage0_t enclosure_pg0;u32 ioc_status;u16 parent_handle; -__le64 sas_address, sas_address_parent =0 ; +u64 sas_address, sas_address_parent =0 ;int i;unsigned long flags;struct _sas_port *mpt2sas_port =NULL ;
@@ -5404,7 +5404,7 @@ _scsih_sas_device_status_change_event(st {struct MPT2SAS_TARGET *target_priv_data;struct _sas_device *sas_device; -__le64 sas_address; +u64 sas_address;unsigned long flags;Mpi2EventDataSasDeviceStatusChange_t *event_data = fw_event->event_data;
@@ -6566,7 +6566,7 @@ _scsih_search_responding_expanders(strucMpi2ExpanderPage0_t expander_pg0;Mpi2ConfigReply_t mpi_reply;u16 ioc_status; -__le64 sas_address; +u64 sas_address;u16 handle;printk (MPT2SAS_INFO_FMT "%s\n" , ioc->name, __func__);
@@ -7505,7 +7505,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_ {struct Scsi_Host *shost =pci_get_drvdata (pdev);struct MPT2SAS_ADAPTER *ioc =shost_priv (shost); -u32 device_state; +pci_power_t device_state;mpt2sas_base_stop_watchdog (ioc);scsi_block_requests (shost);
@@ -7532,7 +7532,7 @@ _scsih_resume(struct pci_dev *pdev) {struct Scsi_Host *shost =pci_get_drvdata (pdev);struct MPT2SAS_ADAPTER *ioc =shost_priv (shost); -u32 device_state = pdev->current_state; +pci_power_t device_state = pdev->current_state;int r; printk(MPT2SAS_INFO_FMT "pdev=0x%p, slot=%s, previous "
drivers/scsi/mpt2sas/mpt2sas_transport.c +9 -15
@@ -299,7 +299,6 @@ _transport_expander_report_manufacture(svoid *data_out =NULL ;dma_addr_t data_out_dma;u32 sz; -u64 *sas_address_le;u16 wait_state_count;if (ioc->shost_recovery || ioc->pci_error_recovery) {
@@ -372,8 +371,7 @@ _transport_expander_report_manufacture(s mpi_request->PhysicalPort =0xFF ; mpi_request->VF_ID =0 ;/* TODO */ mpi_request->VP_ID =0 ; - sas_address_le = (u64 *)&mpi_request->SASAddress; - *sas_address_le =cpu_to_le64 (sas_address); + mpi_request->SASAddress =cpu_to_le64 (sas_address); mpi_request->RequestDataLength =cpu_to_le16 (sizeof (struct rep_manu_request )); psge = &mpi_request->SGL;
@@ -1049,14 +1047,14 @@ struct phy_error_log_reply{u8 function;/* 0x11 */ u8 function_result;u8 response_length; -u16 expander_change_count; +__be16 expander_change_count;u8 reserved_1[3 ];u8 phy_identifier;u8 reserved_2[2 ]; -u32 invalid_dword; -u32 running_disparity_error; -u32 loss_of_dword_sync; -u32 phy_reset_problem; +__be32 invalid_dword; +__be32 running_disparity_error; +__be32 loss_of_dword_sync; +__be32 phy_reset_problem; };/**
@@ -1085,7 +1083,6 @@ _transport_get_expander_phy_error_log(stvoid *data_out =NULL ;dma_addr_t data_out_dma;u32 sz; -u64 *sas_address_le;u16 wait_state_count;if (ioc->shost_recovery || ioc->pci_error_recovery) {
@@ -1160,8 +1157,7 @@ _transport_get_expander_phy_error_log(st mpi_request->PhysicalPort =0xFF ; mpi_request->VF_ID =0 ;/* TODO */ mpi_request->VP_ID =0 ; - sas_address_le = (u64 *)&mpi_request->SASAddress; - *sas_address_le =cpu_to_le64 (phy->identify.sas_address); + mpi_request->SASAddress =cpu_to_le64 (phy->identify.sas_address); mpi_request->RequestDataLength =cpu_to_le16 (sizeof (struct phy_error_log_request )); psge = &mpi_request->SGL;
@@ -1406,7 +1402,6 @@ _transport_expander_phy_control(struct Mvoid *data_out =NULL ;dma_addr_t data_out_dma;u32 sz; -u64 *sas_address_le;u16 wait_state_count;if (ioc->shost_recovery) {
@@ -1486,8 +1481,7 @@ _transport_expander_phy_control(struct M mpi_request->PhysicalPort =0xFF ; mpi_request->VF_ID =0 ;/* TODO */ mpi_request->VP_ID =0 ; - sas_address_le = (u64 *)&mpi_request->SASAddress; - *sas_address_le =cpu_to_le64 (phy->identify.sas_address); + mpi_request->SASAddress =cpu_to_le64 (phy->identify.sas_address); mpi_request->RequestDataLength =cpu_to_le16 (sizeof (struct phy_error_log_request )); psge = &mpi_request->SGL;
@@ -1914,7 +1908,7 @@ _transport_smp_handler(struct Scsi_Host mpi_request->PhysicalPort =0xFF ; mpi_request->VF_ID =0 ;/* TODO */ mpi_request->VP_ID =0 ; - *((u64 *)&mpi_request->SASAddress) = (rphy) ? + mpi_request->SASAddress = (rphy) ?cpu_to_le64 (rphy->identify.sas_address) :cpu_to_le64 (ioc->sas_hba.sas_address); mpi_request->RequestDataLength =cpu_to_le16 (blk_rq_bytes (req) -4 );
PATCH 63/90 sparc: Dont leave sparc_pmu_type NULL on sun4v.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit facfddef2c76110b8e321921f7e54518c3dd1579 ]
Otherwise we'll crash in the sparc perf init code.
--- arch/sparc/kernel/cpu.c | 1 + 1 file changed, 1 insertion(+)
arch/sparc/kernel/cpu.c +1 -0
@@ -479,6 +479,7 @@ static void __init sun4v_cpu_probe(void) prom_cpu_compatible); sparc_cpu_type ="Unknown SUN4V CPU" ; sparc_fpu_type ="Unknown SUN4V FPU" ; + sparc_pmu_type ="Unknown SUN4V PMU" ;break ; } }
PATCH 64/90 sparc: Add T3 sun4v cpu type and hypervisor group defines.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 15e3608d7c273947dbf2eadbcaa66e51143928fb ]
--- arch/sparc/include/asm/hypervisor.h | 1 + arch/sparc/include/asm/spitfire.h | 1 + arch/sparc/kernel/hvapi.c | 1 + 3 files changed, 3 insertions(+)
arch/sparc/include/asm/hypervisor.h +1 -0
@@ -2950,6 +2950,7 @@ extern unsigned long sun4v_ncs_request(u#define HV_GRP_N2_CPU 0x0202#define HV_GRP_NIU 0x0204#define HV_GRP_VF_CPU 0x0205 +#define HV_GRP_KT_CPU 0x0209#define HV_GRP_DIAG 0x0300#ifndef __ASSEMBLY__
arch/sparc/include/asm/spitfire.h +1 -0
@@ -42,6 +42,7 @@#define SUN4V_CHIP_INVALID 0x00#define SUN4V_CHIP_NIAGARA1 0x01#define SUN4V_CHIP_NIAGARA2 0x02 +#define SUN4V_CHIP_NIAGARA3 0x03#define SUN4V_CHIP_UNKNOWN 0xff#ifndef __ASSEMBLY__
arch/sparc/kernel/hvapi.c +1 -0
@@ -38,6 +38,7 @@ static struct api_info api_table[] = { { .group = HV_GRP_N2_CPU, }, { .group = HV_GRP_NIU, }, { .group = HV_GRP_VF_CPU, }, + { .group = HV_GRP_KT_CPU, }, { .group = HV_GRP_DIAG, .flags = FLAG_PRE_API }, };
PATCH 65/90 sparc: Dont do expensive hypervisor PCR write unless necessary.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 314ff52727fe94dfbe07f3a9a489ab3ca8d8df5a ]
The hypervisor call is only necessary if hypervisor events are being requested.
So if we're not tracking hypervisor events, simply do a direct register write.
--- arch/sparc/kernel/pcr.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/sparc/kernel/pcr.c +5 -2
@@ -80,8 +80,11 @@ static void n2_pcr_write(u64 val) {unsigned long ret; - ret =sun4v_niagara2_setperf (HV_N2_PERF_SPARC_CTL , val); -if (ret !=HV_EOK ) +if (val &PCR_N2_HTRACE ) { + ret =sun4v_niagara2_setperf (HV_N2_PERF_SPARC_CTL , val); +if (ret !=HV_EOK ) +write_pcr (val); + }else write_pcr (val); }
PATCH 66/90 sparc: Detect and handle UltraSPARC-T3 cpu types.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 4ba991d3eb379fbaa22049e7002341e97a673685 ]
The cpu compatible string we look for is "SPARC-T3".
As far as memset/memcpy optimizations go, we treat this chip the same as Niagara-T2/T2+. Use cache initializing stores for memset, and use perfetch, FPU block loads, cache initializing stores, and block stores for copies.
We use the Niagara-T2 perf support, since T3 is a close relative in this regard. Later we'll add support for the new events T3 can report, plus enable T3's new "sample" mode.
For now I haven't added any new ELF hwcap flags. We probably need to add a couple, for example:
T2 and T3 both support the population count instruction in hardware.
T3 supports VIS3 instructions, including support (finally) for partitioned shift. One can also now move directly between float and integer registers.
T3 supports instructions meant to help with Galois Field and other HPC calculations, such as XOR multiply. Also there are "OP and negate" instructions, for example "fnmul" which is multiply-and-negate.
T3 recognizes the transactional memory opcodes, however since transactional memory isn't supported: 1) 'commit' behaves as a NOP and
2) 'chkpt' always branches 3) 'rdcps' returns all zeros and 4) 'wrcps' behaves as a NOP.
So we'll need about 3 new elf capability flags in the end to represent all of these things.
--- arch/sparc/include/asm/elf_64.h | 6 ++++-- arch/sparc/include/asm/xor_64.h | 3 ++- arch/sparc/kernel/cpu.c | 6 ++++++ arch/sparc/kernel/cpumap.c | 1 + arch/sparc/kernel/head_64.S | 31 +++++++++++++++++++++++++++++++ arch/sparc/kernel/pcr.c | 4 ++++ arch/sparc/kernel/perf_event.c | 3 ++- 7 files changed, 50 insertions(+), 4 deletions(-)
arch/sparc/include/asm/elf_64.h +4 -2
@@ -177,9 +177,11 @@ static inline unsigned int sparc64_elf_h cap |=HWCAP_SPARC_ULTRA3 ; else if (tlb_type == hypervisor) {if (sun4v_chip_type ==SUN4V_CHIP_NIAGARA1 || - sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 ) + sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 || + sun4v_chip_type ==SUN4V_CHIP_NIAGARA3 ) cap |=HWCAP_SPARC_BLKINIT ; -if (sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 ) +if (sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 || + sun4v_chip_type ==SUN4V_CHIP_NIAGARA3 ) cap |=HWCAP_SPARC_N2 ; }
arch/sparc/include/asm/xor_64.h +2 -1
@@ -65,6 +65,7 @@ static struct xor_block_template xor_blo#define XOR_SELECT_TEMPLATE (FASTEST ) \ ((tlb_type == hypervisor && \ (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 || \ - sun4v_chip_type == SUN4V_CHIP_NIAGARA2)) ? \ + sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || \ + sun4v_chip_type == SUN4V_CHIP_NIAGARA3)) ? \ &xor_block_niagara : \ &xor_block_VIS)
arch/sparc/kernel/cpu.c +6 -0
@@ -474,6 +474,12 @@ static void __init sun4v_cpu_probe(void) sparc_pmu_type ="niagara2" ;break ; +case SUN4V_CHIP_NIAGARA3 : + sparc_cpu_type ="UltraSparc T3 (Niagara3)" ; + sparc_fpu_type ="UltraSparc T3 integrated FPU" ; + sparc_pmu_type ="niagara3" ; +break ; +default :printk (KERN_WARNING "CPU: Unknown sun4v cpu type [%s]\n" , prom_cpu_compatible);
arch/sparc/kernel/cpumap.c +1 -0
@@ -324,6 +324,7 @@ static int iterate_cpu(struct cpuinfo_trswitch (sun4v_chip_type) {case SUN4V_CHIP_NIAGARA1 :case SUN4V_CHIP_NIAGARA2 : +case SUN4V_CHIP_NIAGARA3 : rover_inc_table = niagara_iterate_method;break ;default :
arch/sparc/kernel/head_64.S +31 -0
@@ -132,6 +132,8 @@ prom_sun4v_name: .asciz "sun4v" prom_niagara_prefix: .asciz "SUNW,UltraSPARC-T" +prom_sparc_prefix: + .asciz "SPARC-T" .align 4 prom_root_compatible: .skip 64
@@ -382,6 +384,22 @@ sun4v_chip_type: 90: ldub [%g7], %g2 ldub [%g1], %g4 cmp %g2, %g4 + bne,pn %icc, 89f + add %g7, 1, %g7 + subcc %g3, 1, %g3 + bne,pt %xcc, 90b + add %g1, 1, %g1 + ba,pt %xcc, 91f + nop + +89: sethi %hi(prom_cpu_compatible), %g1 + or %g1, %lo(prom_cpu_compatible), %g1 + sethi %hi(prom_sparc_prefix), %g7 + or %g7, %lo(prom_sparc_prefix), %g7 + mov 7, %g3 +90: ldub [%g7], %g2 + ldub [%g1], %g4 + cmp %g2, %g4 bne,pn %icc, 4f add %g7, 1, %g7 subcc %g3, 1, %g3
@@ -390,6 +408,15 @@ sun4v_chip_type: sethi %hi(prom_cpu_compatible), %g1 or %g1, %lo(prom_cpu_compatible), %g1 + ldub [%g1 + 7], %g2 + cmp %g2, '3' + be,pt %xcc, 5f + mov SUN4V_CHIP_NIAGARA3, %g4 + ba,pt %xcc, 4f + nop + +91: sethi %hi(prom_cpu_compatible), %g1 + or %g1, %lo(prom_cpu_compatible), %g1 ldub [%g1 + 17], %g2 cmp %g2, '1' be,pt %xcc, 5f
@@ -397,6 +424,7 @@ sun4v_chip_type: cmp %g2, '2' be,pt %xcc, 5f mov SUN4V_CHIP_NIAGARA2, %g4 + 4: mov SUN4V_CHIP_UNKNOWN, %g4 5: sethi %hi(sun4v_chip_type), %g2
@@ -514,6 +542,9 @@ niagara_tlb_fixup: cmp %g1, SUN4V_CHIP_NIAGARA2 be,pt %xcc, niagara2_patch nop + cmp %g1, SUN4V_CHIP_NIAGARA3 + be,pt %xcc, niagara2_patch + nop call generic_patch_copyops nop
arch/sparc/kernel/pcr.c +4 -0
@@ -109,6 +109,10 @@ static int __init register_perf_hsvc(voi perf_hsvc_group =HV_GRP_N2_CPU ;break ; +case SUN4V_CHIP_NIAGARA3 : + perf_hsvc_group =HV_GRP_KT_CPU ; +break ; +default :return -ENODEV ; }
arch/sparc/kernel/perf_event.c +2 -1
@@ -1301,7 +1301,8 @@ static bool __init supported_pmu(void) sparc_pmu = &niagara1_pmu;return true; } -if (!strcmp (sparc_pmu_type,"niagara2" )) { +if (!strcmp (sparc_pmu_type,"niagara2" ) || + !strcmp (sparc_pmu_type,"niagara3" )) { sparc_pmu = &niagara2_pmu;return true; }
PATCH 67/90 sparc: Sanitize cpu feature detection and reporting.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit ac85fe8b21248054851e05bfaa352562e5b06dd3 ]
Instead of evaluating the cpu features for ELF_HWCAP every exec, calculate it once at boot time.
Add AV_SPARC_* capability flag bits, compatible with what Solaris reports to applications.
Report these capabilities once in the kernel log, and also via /proc/cpuinfo in a new "cpucaps" entry.
If available, fetch the cpu features from the machine description 'hwcap-list' property of the 'cpu' node.
--- arch/sparc/include/asm/elf_64.h | 65 +++++++---------- arch/sparc/kernel/cpu.c | 1 arch/sparc/kernel/kernel.h | 6 + arch/sparc/kernel/setup_64.c | 149 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+), 36 deletions(-)
arch/sparc/include/asm/elf_64.h +29 -36
@@ -59,15 +59,33 @@#define R_SPARC_6 45/* Bits present in AT_HWCAP, primarily for Sparc32. */ - -#define HWCAP_SPARC_FLUSH 1/* CPU supports flush instruction. */ -#define HWCAP_SPARC_STBAR 2 -#define HWCAP_SPARC_SWAP 4 -#define HWCAP_SPARC_MULDIV 8 -#define HWCAP_SPARC_V9 16 -#define HWCAP_SPARC_ULTRA3 32 -#define HWCAP_SPARC_BLKINIT 64 -#define HWCAP_SPARC_N2 128 +#define HWCAP_SPARC_FLUSH 0x00000001 +#define HWCAP_SPARC_STBAR 0x00000002 +#define HWCAP_SPARC_SWAP 0x00000004 +#define HWCAP_SPARC_MULDIV 0x00000008 +#define HWCAP_SPARC_V9 0x00000010 +#define HWCAP_SPARC_ULTRA3 0x00000020 +#define HWCAP_SPARC_BLKINIT 0x00000040 +#define HWCAP_SPARC_N2 0x00000080 + +/* Solaris compatible AT_HWCAP bits. */ +#define AV_SPARC_MUL32 0x00000100/* 32x32 multiply is efficient */ +#define AV_SPARC_DIV32 0x00000200/* 32x32 divide is efficient */ +#define AV_SPARC_FSMULD 0x00000400/* 'fsmuld' is efficient */ +#define AV_SPARC_V8PLUS 0x00000800/* v9 insn available to 32bit */ +#define AV_SPARC_POPC 0x00001000/* 'popc' is efficient */ +#define AV_SPARC_VIS 0x00002000/* VIS insns available */ +#define AV_SPARC_VIS2 0x00004000/* VIS2 insns available */ +#define AV_SPARC_ASI_BLK_INIT 0x00008000/* block init ASIs available */ +#define AV_SPARC_FMAF 0x00010000/* fused multiply-add */ +#define AV_SPARC_VIS3 0x00020000/* VIS3 insns available */ +#define AV_SPARC_HPC 0x00040000/* HPC insns available */ +#define AV_SPARC_RANDOM 0x00080000/* 'random' insn available */ +#define AV_SPARC_TRANS 0x00100000/* transaction insns available */ +#define AV_SPARC_FJFMAU 0x00200000/* unfused multiply-add */ +#define AV_SPARC_IMA 0x00400000/* integer multiply-add */ +#define AV_SPARC_ASI_CACHE_SPARING \ + 0x00800000/* cache sparing ASIs available */ #define CORE_DUMP_USE_REGSET
@@ -162,33 +180,8 @@ typedef struct {#define ELF_ET_DYN_BASE 0x0000010000000000UL#define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL - -/* This yields a mask that user programs can use to figure out what -instruction set this cpu supports. */ - -/* On Ultra, we support all of the v8 capabilities. */ -static inline unsigned int sparc64_elf_hwcap (void ) -{ -unsigned int cap = (HWCAP_SPARC_FLUSH |HWCAP_SPARC_STBAR | -HWCAP_SPARC_SWAP |HWCAP_SPARC_MULDIV | -HWCAP_SPARC_V9 ); - -if (tlb_type == cheetah || tlb_type == cheetah_plus) - cap |=HWCAP_SPARC_ULTRA3 ; -else if (tlb_type == hypervisor) { -if (sun4v_chip_type ==SUN4V_CHIP_NIAGARA1 || - sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 || - sun4v_chip_type ==SUN4V_CHIP_NIAGARA3 ) - cap |=HWCAP_SPARC_BLKINIT ; -if (sun4v_chip_type ==SUN4V_CHIP_NIAGARA2 || - sun4v_chip_type ==SUN4V_CHIP_NIAGARA3 ) - cap |=HWCAP_SPARC_N2 ; - } - -return cap; -} - -#define ELF_HWCAP sparc64_elf_hwcap(); +extern unsigned long sparc64_elf_hwcap; +#define ELF_HWCAP sparc64_elf_hwcap/* This yields a string that ld.so will use to load implementation specific libraries for optimization. This is more specific in
arch/sparc/kernel/cpu.c +1 -0
@@ -396,6 +396,7 @@ static int show_cpuinfo(struct seq_file , cpu_data(0).clock_tick#endif ); +cpucap_info (m);#ifdef CONFIG_SMP smp_bogo (m);#endif
arch/sparc/kernel/kernel.h +6 -0
@@ -10,6 +10,12 @@ extern const char *sparc_pmu_type;extern unsigned int fsr_storage;extern int ncpus_probed; +#ifdef CONFIG_SPARC64 +/* setup_64.c */ +struct seq_file ; +extern void cpucap_info (struct seq_file *); +#endif +#ifdef CONFIG_SPARC32 /* cpu.c */ extern void cpu_probe (void );
arch/sparc/kernel/setup_64.c +149 -0
173 lines not on this page · raw message
PATCH 68/90 sparc: Minor tweaks to Niagara page copy/clear.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit e95ade083939dcb4b0c51c1a2c8504ea9ef3d6ef ]
Don't use floating point on Niagara2, use the traditional plain Niagara code instead.
Unroll Niagara loops to 128 bytes for copy, and 256 bytes for clear.
--- arch/sparc/kernel/head_64.S | 2 arch/sparc/lib/Makefile | 2 arch/sparc/lib/NG2page.S | 61 ----------------------- arch/sparc/lib/NGpage.S | 114 ++++++++++++++++++++++++++++---------------- 4 files changed, 77 insertions(+), 102 deletions(-) delete mode 100644 arch/sparc/lib/NG2page.S
arch/sparc/kernel/head_64.S +1 -1
@@ -559,7 +559,7 @@ niagara2_patch: nop call niagara_patch_bzero nop - call niagara2_patch_pageops + call niagara_patch_pageops nop ba,a,pt %xcc, 80f
arch/sparc/lib/Makefile +1 -1
@@ -31,7 +31,7 @@ lib-$(CONFIG_SPARC64) += NGmemcpy.o NGco lib-$(CONFIG_SPARC64) += NGpatch.o NGpage.o NGbzero.o lib-$(CONFIG_SPARC64) += NG2memcpy.o NG2copy_from_user.o NG2copy_to_user.o -lib-$(CONFIG_SPARC64) += NG2patch.o NG2page.o +lib-$(CONFIG_SPARC64) += NG2patch.o lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o
arch/sparc/lib/NG2page.S deleted +0 -61
61 lines not on this page · raw message
arch/sparc/lib/NGpage.S +75 -39
130 lines not on this page · raw message
PATCH 69/90 sparc: Use popc if possible for hweight routines.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit ef7c4d4675d2a9206f913f26ca1a5cd41bff9d41 ]
Just like powerpc, we code patch at boot time.
--- arch/sparc/include/asm/bitops_64.h | 42 ++---------------------------- arch/sparc/kernel/entry.h | 7 +++++ arch/sparc/kernel/setup_64.c | 27 +++++++++++++++++++ arch/sparc/kernel/sparc_ksyms_64.c | 7 +++++ arch/sparc/kernel/vmlinux.lds.S | 6 +++- arch/sparc/lib/Makefile | 2 - arch/sparc/lib/hweight.S | 51 +++++++++++++++++++++++++++++++++++++ 7 files changed, 102 insertions(+), 40 deletions(-) create mode 100644 arch/sparc/lib/hweight.S
arch/sparc/include/asm/bitops_64.h +4 -38
@@ -42,45 +42,11 @@ extern void change_bit(unsigned long nr,* of bits set) of a N-bit word */ -#ifdef ULTRA_HAS_POPULATION_COUNT +extern unsigned long __arch_hweight64 (__u64 w); +extern unsigned int __arch_hweight32 (unsigned int w); +extern unsigned int __arch_hweight16 (unsigned int w); +extern unsigned int __arch_hweight8 (unsigned int w); -static inline unsigned int __arch_hweight64 (unsigned long w) -{ -unsigned int res; - - __asm__ ("popc %1,%0" :"=r" (res) :"r" (w)); -return res; -} - -static inline unsigned int __arch_hweight32 (unsigned int w) -{ -unsigned int res; - - __asm__ ("popc %1,%0" :"=r" (res) :"r" (w &0xffffffff )); -return res; -} - -static inline unsigned int __arch_hweight16 (unsigned int w) -{ -unsigned int res; - - __asm__ ("popc %1,%0" :"=r" (res) :"r" (w &0xffff )); -return res; -} - -static inline unsigned int __arch_hweight8 (unsigned int w) -{ -unsigned int res; - - __asm__ ("popc %1,%0" :"=r" (res) :"r" (w &0xff )); -return res; -} - -#else - -#include <asm-generic/bitops/arch_hweight.h> - -#endif #include <asm-generic/bitops/const_hweight.h> #include <asm-generic/bitops/lock.h> #endif /* __KERNEL__ */
arch/sparc/kernel/entry.h +7 -0
@@ -42,6 +42,13 @@ extern void fpsave(unsigned long *fpregsextern void fpload (unsigned long *fpregs,unsigned long *fsr);#else /* CONFIG_SPARC32 */ +struct popc_3insn_patch_entry { +unsigned int addr; +unsigned int insns[3 ]; +}; +extern struct popc_3insn_patch_entry __popc_3insn_patch, + __popc_3insn_patch_end; +extern void __init per_cpu_patch (void );extern void __init sun4v_patch (void );extern void __init boot_cpu_id_too_large (int cpu);
arch/sparc/kernel/setup_64.c +27 -0
@@ -272,6 +272,30 @@ void __init sun4v_patch(void)sun4v_hvapi_init (); } +static void __init popc_patch (void ) +{ +struct popc_3insn_patch_entry *p3; + + p3 = &__popc_3insn_patch; +while (p3 < &__popc_3insn_patch_end) { +unsigned long addr = p3->addr; + + *(unsigned int *) (addr +0 ) = p3->insns[0 ]; +wmb (); + __asm__ __volatile__("flush %0" : :"r" (addr +0 )); + + *(unsigned int *) (addr +4 ) = p3->insns[1 ]; +wmb (); + __asm__ __volatile__("flush %0" : :"r" (addr +4 )); + + *(unsigned int *) (addr +8 ) = p3->insns[2 ]; +wmb (); + __asm__ __volatile__("flush %0" : :"r" (addr +4 )); + + p3++; + } +} +#ifdef CONFIG_SMP void __init boot_cpu_id_too_large (int cpu) {
@@ -424,6 +448,9 @@ static void __init init_sparc64_elf_hwca sparc64_elf_hwcap = cap | mdesc_caps;report_hwcaps (sparc64_elf_hwcap); + +if (sparc64_elf_hwcap &AV_SPARC_POPC ) +popc_patch (); }void __init setup_arch (char **cmdline_p)
arch/sparc/kernel/sparc_ksyms_64.c +7 -0
@@ -8,6 +8,7 @@#include <linux/module.h> #include <linux/pci.h> #include <linux/init.h> +#include <linux/bitops.h> #include <asm/system.h> #include <asm/cpudata.h>
@@ -38,5 +39,11 @@ EXPORT_SYMBOL(sun4v_niagara_setperf);EXPORT_SYMBOL (sun4v_niagara2_getperf);EXPORT_SYMBOL (sun4v_niagara2_setperf); +/* from hweight.S */ +EXPORT_SYMBOL (__arch_hweight8); +EXPORT_SYMBOL (__arch_hweight16); +EXPORT_SYMBOL (__arch_hweight32); +EXPORT_SYMBOL (__arch_hweight64); +/* Exporting a symbol from /init/main.c */ EXPORT_SYMBOL (saved_command_line);
arch/sparc/kernel/vmlinux.lds.S +5 -1
@@ -107,7 +107,11 @@ SECTIONS *(.sun4v_2insn_patch) __sun4v_2insn_patch_end = .; } - + .popc_3insn_patch : { + __popc_3insn_patch = .; + *(.popc_3insn_patch) + __popc_3insn_patch_end = .; + } PERCPU_SECTION(SMP_CACHE_BYTES) . = ALIGN(PAGE_SIZE);
arch/sparc/lib/Makefile +1 -1
@@ -37,7 +37,7 @@ lib-$(CONFIG_SPARC64) += GENmemcpy.o GEN lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o -lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o +lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o obj-y += iomap.o obj-$(CONFIG_SPARC32) += atomic32.o
arch/sparc/lib/hweight.S new file +51 -0
51 lines not on this page · raw message
PATCH 70/90 sparc: Use hweight64() in popc emulation.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit d600cbed0fe8fceec04500824f638dfe4996c653 ]
--- arch/sparc/kernel/unaligned_64.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-)
arch/sparc/kernel/unaligned_64.c +4 -11
@@ -22,6 +22,7 @@#include <linux/bitops.h> #include <linux/perf_event.h> #include <linux/ratelimit.h> +#include <linux/bitops.h> #include <asm/fpumacro.h> enum direction {
@@ -373,16 +374,11 @@ asmlinkage void kernel_unaligned_trap(st } } -static char popc_helper[] = { -0 ,1 ,1 ,2 ,1 ,2 ,2 ,3 , -1 ,2 ,2 ,3 ,2 ,3 ,3 ,4 , -}; -int handle_popc (u32 insn,struct pt_regs *regs) { -u64 value; -int ret, i, rd = ((insn >>25 ) &0x1f );int from_kernel = (regs->tstate &TSTATE_PRIV ) !=0 ; +int ret, rd = ((insn >>25 ) &0x1f ); +u64 value;perf_sw_event (PERF_COUNT_SW_EMULATION_FAULTS ,1 ,0 , regs,0 );if (insn &0x2000 ) {
@@ -392,10 +388,7 @@ int handle_popc(u32 insn, struct pt_regsmaybe_flush_windows (0 , insn &0x1f , rd, from_kernel); value =fetch_reg (insn &0x1f , regs); } -for (ret =0 , i =0 ; i <16 ; i++) { - ret += popc_helper[value &0xf ]; - value >>=4 ; - } + ret =hweight64 (value);if (rd <16 ) {if (rd) regs->u_regs[rd] = ret;
PATCH 71/90 sparc: Add some missing hypervisor API groups.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit e2eb9f8158ead43a88c0f0b4d74257b1be938a18 ]
--- arch/sparc/include/asm/hypervisor.h | 6 ++++++ arch/sparc/kernel/hvapi.c | 6 ++++++ 2 files changed, 12 insertions(+)
arch/sparc/include/asm/hypervisor.h +6 -0
@@ -2940,11 +2940,17 @@ extern unsigned long sun4v_ncs_request(u#define HV_GRP_CORE 0x0001#define HV_GRP_INTR 0x0002#define HV_GRP_SOFT_STATE 0x0003 +#define HV_GRP_TM 0x0080#define HV_GRP_PCI 0x0100#define HV_GRP_LDOM 0x0101#define HV_GRP_SVC_CHAN 0x0102#define HV_GRP_NCS 0x0103#define HV_GRP_RNG 0x0104 +#define HV_GRP_PBOOT 0x0105 +#define HV_GRP_TPM 0x0107 +#define HV_GRP_SDIO 0x0108 +#define HV_GRP_SDIO_ERR 0x0109 +#define HV_GRP_REBOOT_DATA 0x0110#define HV_GRP_NIAG_PERF 0x0200#define HV_GRP_FIRE_PERF 0x0201#define HV_GRP_N2_CPU 0x0202
arch/sparc/kernel/hvapi.c +6 -0
@@ -28,11 +28,17 @@ static struct api_info api_table[] = { { .group = HV_GRP_CORE, .flags = FLAG_PRE_API }, { .group = HV_GRP_INTR, }, { .group = HV_GRP_SOFT_STATE, }, + { .group = HV_GRP_TM, }, { .group = HV_GRP_PCI, .flags = FLAG_PRE_API }, { .group = HV_GRP_LDOM, }, { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, { .group = HV_GRP_RNG, }, + { .group = HV_GRP_PBOOT, }, + { .group = HV_GRP_TPM, }, + { .group = HV_GRP_SDIO, }, + { .group = HV_GRP_SDIO_ERR, }, + { .group = HV_GRP_REBOOT_DATA, }, { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, { .group = HV_GRP_FIRE_PERF, }, { .group = HV_GRP_N2_CPU, },
PATCH 72/90 sparc: Set reboot-cmd using reboot data hypervisor call if available.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit ea5e7447ea9d555558e0f13798f5143dd51a915a ]
--- arch/sparc/include/asm/hypervisor.h | 7 +++++++ arch/sparc/kernel/ds.c | 30 ++++++++++++++++++++++++++++-- arch/sparc/kernel/hvcalls.S | 7 +++++++ arch/sparc/kernel/kernel.h | 9 +++++++++ arch/sparc/kernel/sstate.c | 9 ++------- 5 files changed, 53 insertions(+), 9 deletions(-)
arch/sparc/include/asm/hypervisor.h +7 -0
@@ -2927,6 +2927,13 @@ extern unsigned long sun4v_ncs_request(u#define HV_FAST_FIRE_GET_PERFREG 0x120#define HV_FAST_FIRE_SET_PERFREG 0x121 +#define HV_FAST_REBOOT_DATA_SET 0x172 + +#ifndef __ASSEMBLY__ +extern unsigned long sun4v_reboot_data_set (unsigned long ra, +unsigned long len); +#endif +/* Function numbers for HV_CORE_TRAP. */ #define HV_CORE_SET_VER 0x00#define HV_CORE_PUTCHAR 0x01
arch/sparc/kernel/ds.c +28 -2
@@ -15,12 +15,15 @@#include <linux/reboot.h> #include <linux/cpu.h> +#include <asm/hypervisor.h> #include <asm/ldc.h> #include <asm/vio.h> #include <asm/mdesc.h> #include <asm/head.h> #include <asm/irq.h> +#include "kernel.h" +#define DRV_MODULE_NAME "ds"#define PFX DRV_MODULE_NAME ": "#define DRV_MODULE_VERSION "1.0"
@@ -828,18 +831,32 @@ void ldom_set_var(const char *var, const } } +static char full_boot_str[256] __attribute__((aligned(32))); +static int reboot_data_supported; +void ldom_reboot (const char *boot_command) {/* Don't bother with any of this if the boot_command * is empty. */ if (boot_command &&strlen (boot_command)) { -char full_boot_str[256 ]; +unsigned long len;strcpy (full_boot_str,"boot " );strcpy (full_boot_str +strlen ("boot " ), boot_command); + len =strlen (full_boot_str); -ldom_set_var ("reboot-command" , full_boot_str); +if (reboot_data_supported) { +unsigned long ra =kimage_addr_to_ra (full_boot_str); +unsigned long hv_ret; + + hv_ret =sun4v_reboot_data_set (ra, len); +if (hv_ret !=HV_EOK ) +pr_err ("SUN4V: Unable to set reboot data " +"hv_ret=%lu\n" , hv_ret); + }else { +ldom_set_var ("reboot-command" , full_boot_str); + } }sun4v_mach_sir (); }
@@ -1237,6 +1254,15 @@ static struct vio_driver ds_driver = {static int __init ds_init (void ) { +unsigned long hv_ret, major, minor; + + hv_ret =sun4v_get_version (HV_GRP_REBOOT_DATA , &major, &minor); +if (hv_ret ==HV_EOK ) { +pr_info ("SUN4V: Reboot data supported (maj=%lu,min=%lu).\n" , + major, minor); + reboot_data_supported =1 ; + } +kthread_run (ds_thread,NULL ,"kldomd" );return vio_register_driver (&ds_driver);
arch/sparc/kernel/hvcalls.S +7 -0
@@ -798,3 +798,10 @@ ENTRY(sun4v_niagara2_setperf) retl nop ENDPROC(sun4v_niagara2_setperf) + +ENTRY(sun4v_reboot_data_set) + mov HV_FAST_REBOOT_DATA_SET, %o5 + ta HV_FAST_TRAP + retl + nop +ENDPROC(sun4v_reboot_data_set)
arch/sparc/kernel/kernel.h +9 -0
@@ -4,6 +4,8 @@#include <linux/interrupt.h> #include <asm/traps.h> +#include <asm/head.h> +#include <asm/io.h> /* cpu.c */ extern const char *sparc_pmu_type;
@@ -14,6 +16,13 @@ extern int ncpus_probed;/* setup_64.c */ struct seq_file ;extern void cpucap_info (struct seq_file *); + +static inline unsigned long kimage_addr_to_ra (const char *p) +{ +unsigned long val = (unsigned long ) p; + +return kern_base + (val -KERNBASE ); +}#endif #ifdef CONFIG_SPARC32
arch/sparc/kernel/sstate.c +2 -7
@@ -14,14 +14,9 @@#include <asm/head.h> #include <asm/io.h> -static int hv_supports_soft_state; - -static unsigned long kimage_addr_to_ra (const char *p) -{ -unsigned long val = (unsigned long ) p; +#include "kernel.h" -return kern_base + (val -KERNBASE ); -} +static int hv_supports_soft_state;static void do_set_sstate (unsigned long state,const char *msg) {
PATCH 73/90 sparc: Use popc when possible for ffs/__ffs/ffz.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 56d205cc5c0a3032a605121d4253e111193bf923 ]
--- arch/sparc/include/asm/bitops_64.h | 7 +-- arch/sparc/kernel/entry.h | 7 +++ arch/sparc/kernel/setup_64.c | 34 +++++++++----- arch/sparc/kernel/sparc_ksyms_64.c | 4 + arch/sparc/kernel/vmlinux.lds.S | 5 ++ arch/sparc/lib/Makefile | 2 arch/sparc/lib/ffs.S | 84 +++++++++++++++++++++++++++++++++++++ 7 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 arch/sparc/lib/ffs.S
arch/sparc/include/asm/bitops_64.h +4 -3
@@ -26,16 +26,17 @@ extern void change_bit(unsigned long nr,#define smp_mb__before_clear_bit () barrier()#define smp_mb__after_clear_bit () barrier() -#include <asm-generic/bitops/ffz.h> -#include <asm-generic/bitops/__ffs.h> #include <asm-generic/bitops/fls.h> #include <asm-generic/bitops/__fls.h> #include <asm-generic/bitops/fls64.h> #ifdef __KERNEL__ +extern int ffs (int x); +extern unsigned long __ffs (unsigned long ); + +#include <asm-generic/bitops/ffz.h> #include <asm-generic/bitops/sched.h> -#include <asm-generic/bitops/ffs.h> /* * hweightN: returns the hamming weight (i.e. the number
arch/sparc/kernel/entry.h +7 -0
@@ -49,6 +49,13 @@ struct popc_3insn_patch_entry {extern struct popc_3insn_patch_entry __popc_3insn_patch, __popc_3insn_patch_end; +struct popc_6insn_patch_entry { +unsigned int addr; +unsigned int insns[6 ]; +}; +extern struct popc_6insn_patch_entry __popc_6insn_patch, + __popc_6insn_patch_end; +extern void __init per_cpu_patch (void );extern void __init sun4v_patch (void );extern void __init boot_cpu_id_too_large (int cpu);
arch/sparc/kernel/setup_64.c +22 -12
@@ -275,25 +275,35 @@ void __init sun4v_patch(void)static void __init popc_patch (void ) {struct popc_3insn_patch_entry *p3; +struct popc_6insn_patch_entry *p6; p3 = &__popc_3insn_patch;while (p3 < &__popc_3insn_patch_end) { -unsigned long addr = p3->addr; +unsigned long i, addr = p3->addr; - *(unsigned int *) (addr +0 ) = p3->insns[0 ]; -wmb (); - __asm__ __volatile__("flush %0" : :"r" (addr +0 )); - - *(unsigned int *) (addr +4 ) = p3->insns[1 ]; -wmb (); - __asm__ __volatile__("flush %0" : :"r" (addr +4 )); - - *(unsigned int *) (addr +8 ) = p3->insns[2 ]; -wmb (); - __asm__ __volatile__("flush %0" : :"r" (addr +4 )); +for (i =0 ; i <3 ; i++) { + *(unsigned int *) (addr + (i *4 )) = p3->insns[i]; +wmb (); + __asm__ __volatile__("flush %0" + : :"r" (addr + (i *4 ))); + } p3++; } + + p6 = &__popc_6insn_patch; +while (p6 < &__popc_6insn_patch_end) { +unsigned long i, addr = p6->addr; + +for (i =0 ; i <6 ; i++) { + *(unsigned int *) (addr + (i *4 )) = p6->insns[i]; +wmb (); + __asm__ __volatile__("flush %0" + : :"r" (addr + (i *4 ))); + } + + p6++; + } }#ifdef CONFIG_SMP
arch/sparc/kernel/sparc_ksyms_64.c +4 -0
@@ -45,5 +45,9 @@ EXPORT_SYMBOL(__arch_hweight16);EXPORT_SYMBOL (__arch_hweight32);EXPORT_SYMBOL (__arch_hweight64); +/* from ffs_ffz.S */ +EXPORT_SYMBOL (ffs); +EXPORT_SYMBOL (__ffs); +/* Exporting a symbol from /init/main.c */ EXPORT_SYMBOL (saved_command_line);
arch/sparc/kernel/vmlinux.lds.S +5 -0
@@ -112,6 +112,11 @@ SECTIONS *(.popc_3insn_patch) __popc_3insn_patch_end = .; } + .popc_6insn_patch : { + __popc_6insn_patch = .; + *(.popc_6insn_patch) + __popc_6insn_patch_end = .; + } PERCPU_SECTION(SMP_CACHE_BYTES) . = ALIGN(PAGE_SIZE);
arch/sparc/lib/Makefile +1 -1
@@ -37,7 +37,7 @@ lib-$(CONFIG_SPARC64) += GENmemcpy.o GEN lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o -lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o +lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o obj-y += iomap.o obj-$(CONFIG_SPARC32) += atomic32.o
arch/sparc/lib/ffs.S new file +84 -0
84 lines not on this page · raw message
PATCH 74/90 sparc: Access kernel TSB using physical addressing when possible.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 9076d0e7e02b98f7a65df10d1956326c8d8ba61a ]
On sun4v this is basically required since we point the hypervisor and the TSB walking hardware at these tables using physical addressing too.
--- arch/sparc/include/asm/tsb.h | 51 ++++++++++++++++++---------------------- arch/sparc/kernel/ktlb.S | 24 +++++++++--------- arch/sparc/kernel/vmlinux.lds.S | 10 +++++++ arch/sparc/mm/init_64.c | 40 ++++++++++++++++++++++++++++++- 4 files changed, 85 insertions(+), 40 deletions(-)
arch/sparc/include/asm/tsb.h +24 -27
@@ -133,29 +133,6 @@ extern struct tsb_phys_patch_entry __tsb sub TSB, 0x8, TSB; \TSB_STORE (TSB ,TAG ); -#define KTSB_LOAD_QUAD (TSB ,REG ) \ - ldda [TSB] ASI_NUCLEUS_QUAD_LDD, REG; - -#define KTSB_STORE (ADDR ,VAL ) \ - stxa VAL, [ADDR] ASI_N; - -#define KTSB_LOCK_TAG (TSB ,REG1 ,REG2 ) \ -99: lduwa [TSB] ASI_N, REG1; \ - sethi %hi(TSB_TAG_LOCK_HIGH), REG2;\ - andcc REG1, REG2, %g0; \ - bne,pn %icc, 99b; \ - nop; \ - casa [TSB] ASI_N, REG1, REG2;\ - cmp REG1, REG2; \ - bne,pn %icc, 99b; \ - nop; \ - -#define KTSB_WRITE (TSB ,TTE ,TAG ) \ - add TSB, 0x8, TSB; \ - stxa TTE, [TSB] ASI_N; \ - sub TSB, 0x8, TSB; \ - stxa TAG, [TSB] ASI_N; -/* Do a kernel page table walk. Leaves physical PTE pointer in * REG1. Jumps to FAIL_LABEL on early page table walk termination. * VADDR will not be clobbered, but REG2 will.
@@ -239,6 +216,8 @@ extern struct tsb_phys_patch_entry __tsb (KERNEL_TSB_SIZE_BYTES / 16)#define KERNEL_TSB4M_NENTRIES 4096 +#define KTSB_PHYS_SHIFT 15 +/* Do a kernel TSB lookup at tl>0 on VADDR+TAG, branch to OK_LABEL * on TSB hit. REG1, REG2, REG3, and REG4 are used as temporaries * and the found TTE will be left in REG1. REG3 and REG4 must
@@ -247,13 +226,22 @@ extern struct tsb_phys_patch_entry __tsb* VADDR and TAG will be preserved and not clobbered by this macro. */ #define KERN_TSB_LOOKUP_TL1 (VADDR ,TAG ,REG1 ,REG2 ,REG3 ,REG4 ,OK_LABEL ) \ - sethi %hi(swapper_tsb), REG1; \ +661: sethi %hi(swapper_tsb), REG1; \ or REG1, %lo(swapper_tsb), REG1; \ + .section .swapper_tsb_phys_patch, "ax"; \ + .word 661b; \ + .previous; \ +661: nop; \ + .section .tsb_ldquad_phys_patch, "ax"; \ + .word 661b; \ + sllx REG1, KTSB_PHYS_SHIFT, REG1; \ + sllx REG1, KTSB_PHYS_SHIFT, REG1; \ + .previous; \ srlx VADDR, PAGE_SHIFT, REG2; \ and REG2, (KERNEL_TSB_NENTRIES - 1), REG2; \ sllx REG2, 4, REG2; \ add REG1, REG2, REG2; \ - KTSB_LOAD_QUAD(REG2, REG3); \ + TSB_LOAD_QUAD(REG2, REG3); \ cmp REG3, TAG; \ be,a,pt %xcc, OK_LABEL; \ mov REG4, REG1;
@@ -263,12 +251,21 @@ extern struct tsb_phys_patch_entry __tsb* we can make use of that for the index computation. */ #define KERN_TSB4M_LOOKUP_TL1 (TAG ,REG1 ,REG2 ,REG3 ,REG4 ,OK_LABEL ) \ - sethi %hi(swapper_4m_tsb), REG1; \ +661: sethi %hi(swapper_4m_tsb), REG1; \ or REG1, %lo(swapper_4m_tsb), REG1; \ + .section .swapper_4m_tsb_phys_patch, "ax"; \ + .word 661b; \ + .previous; \ +661: nop; \ + .section .tsb_ldquad_phys_patch, "ax"; \ + .word 661b; \ + sllx REG1, KTSB_PHYS_SHIFT, REG1; \ + sllx REG1, KTSB_PHYS_SHIFT, REG1; \ + .previous; \ and TAG, (KERNEL_TSB4M_NENTRIES - 1), REG2; \ sllx REG2, 4, REG2; \ add REG1, REG2, REG2; \ - KTSB_LOAD_QUAD(REG2, REG3); \ + TSB_LOAD_QUAD(REG2, REG3); \ cmp REG3, TAG; \ be,a,pt %xcc, OK_LABEL; \ mov REG4, REG1;
arch/sparc/kernel/ktlb.S +12 -12
@@ -47,16 +47,16 @@ kvmap_itlb_tsb_miss: kvmap_itlb_vmalloc_addr: KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_itlb_longpath) - KTSB_LOCK_TAG(%g1, %g2, %g7) + TSB_LOCK_TAG(%g1, %g2, %g7) /* Load and check PTE. */ ldxa [%g5] ASI_PHYS_USE_EC, %g5 mov 1, %g7 sllx %g7, TSB_TAG_INVALID_BIT, %g7 brgez,a,pn %g5, kvmap_itlb_longpath - KTSB_STORE(%g1, %g7) + TSB_STORE(%g1, %g7) - KTSB_WRITE(%g1, %g5, %g6) + TSB_WRITE(%g1, %g5, %g6) /* fallthrough to TLB load */
@@ -102,9 +102,9 @@ kvmap_itlb_longpath: kvmap_itlb_obp: OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_itlb_longpath) - KTSB_LOCK_TAG(%g1, %g2, %g7) + TSB_LOCK_TAG(%g1, %g2, %g7) - KTSB_WRITE(%g1, %g5, %g6) + TSB_WRITE(%g1, %g5, %g6) ba,pt %xcc, kvmap_itlb_load nop
@@ -112,17 +112,17 @@ kvmap_itlb_obp: kvmap_dtlb_obp: OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_dtlb_longpath) - KTSB_LOCK_TAG(%g1, %g2, %g7) + TSB_LOCK_TAG(%g1, %g2, %g7) - KTSB_WRITE(%g1, %g5, %g6) + TSB_WRITE(%g1, %g5, %g6) ba,pt %xcc, kvmap_dtlb_load nop .align 32 kvmap_dtlb_tsb4m_load: - KTSB_LOCK_TAG(%g1, %g2, %g7) - KTSB_WRITE(%g1, %g5, %g6) + TSB_LOCK_TAG(%g1, %g2, %g7) + TSB_WRITE(%g1, %g5, %g6) ba,pt %xcc, kvmap_dtlb_load nop
@@ -222,16 +222,16 @@ kvmap_linear_patch: kvmap_dtlb_vmalloc_addr: KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_dtlb_longpath) - KTSB_LOCK_TAG(%g1, %g2, %g7) + TSB_LOCK_TAG(%g1, %g2, %g7) /* Load and check PTE. */ ldxa [%g5] ASI_PHYS_USE_EC, %g5 mov 1, %g7 sllx %g7, TSB_TAG_INVALID_BIT, %g7 brgez,a,pn %g5, kvmap_dtlb_longpath - KTSB_STORE(%g1, %g7) + TSB_STORE(%g1, %g7) - KTSB_WRITE(%g1, %g5, %g6) + TSB_WRITE(%g1, %g5, %g6) /* fallthrough to TLB load */
arch/sparc/kernel/vmlinux.lds.S +10 -0
@@ -107,6 +107,16 @@ SECTIONS *(.sun4v_2insn_patch) __sun4v_2insn_patch_end = .; } + .swapper_tsb_phys_patch : { + __swapper_tsb_phys_patch = .; + *(.swapper_tsb_phys_patch) + __swapper_tsb_phys_patch_end = .; + } + .swapper_4m_tsb_phys_patch : { + __swapper_4m_tsb_phys_patch = .; + *(.swapper_4m_tsb_phys_patch) + __swapper_4m_tsb_phys_patch_end = .; + } .popc_3insn_patch : { __popc_3insn_patch = .; *(.popc_3insn_patch)
arch/sparc/mm/init_64.c +39 -1
@@ -1597,6 +1597,42 @@ static void __init tsb_phys_patch(void)static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR ];extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES ]; +static void patch_one_ktsb_phys (unsigned int *start,unsigned int *end,unsigned long pa) +{ + pa >>=KTSB_PHYS_SHIFT ; + +while (start < end) { +unsigned int *ia = (unsigned int *)(unsigned long )*start; + + ia[0 ] = (ia[0 ] & ~0x3fffff ) | (pa >>10 ); + __asm__ __volatile__("flush %0" : :"r" (ia)); + + ia[1 ] = (ia[1 ] & ~0x3ff ) | (pa &0x3ff ); + __asm__ __volatile__("flush %0" : :"r" (ia +1 )); + + start++; + } +} + +static void ktsb_phys_patch (void ) +{ +extern unsigned int __swapper_tsb_phys_patch; +extern unsigned int __swapper_tsb_phys_patch_end; +extern unsigned int __swapper_4m_tsb_phys_patch; +extern unsigned int __swapper_4m_tsb_phys_patch_end; +unsigned long ktsb_pa; + + ktsb_pa = kern_base + ((unsigned long )&swapper_tsb[0 ] -KERNBASE ); +patch_one_ktsb_phys (&__swapper_tsb_phys_patch, + &__swapper_tsb_phys_patch_end, ktsb_pa); +#ifndef CONFIG_DEBUG_PAGEALLOC + ktsb_pa = (kern_base + + ((unsigned long )&swapper_4m_tsb[0 ] -KERNBASE )); +patch_one_ktsb_phys (&__swapper_4m_tsb_phys_patch, + &__swapper_4m_tsb_phys_patch_end, ktsb_pa); +#endif +} +static void __init sun4v_ktsb_init (void ) {unsigned long ktsb_pa;
@@ -1716,8 +1752,10 @@ void __init paging_init(void)sun4u_pgprot_init ();if (tlb_type == cheetah_plus || - tlb_type == hypervisor) + tlb_type == hypervisor) {tsb_phys_patch (); +ktsb_phys_patch (); + }if (tlb_type == hypervisor) {sun4v_patch_tlb_handlers ();
PATCH 75/90 sparc: Size mondo queues more sanely.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 961f65fc41cdc1f9099a6075258816c0db98e390 ]
There is currently no upper limit on the mondo queue sizes we'll use, which guarentees that we'll eventually his page allocation limits, and thus allocation failures, due to MAX_ORDER.
Cap the sizes sanely, current limits are:
CPU MONDO 2 * max_possible_cpus DEV MONDO 256 (basically NR_IRQS) RES MONDO 128
NRES MONDO 4
--- arch/sparc/kernel/mdesc.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-)
arch/sparc/kernel/mdesc.c +23 -7
@@ -508,6 +508,8 @@ const char *mdesc_node_name(struct mdesc }EXPORT_SYMBOL (mdesc_node_name); +static u64 max_cpus =64 ; +static void __init report_platform_properties (void ) {struct mdesc_handle *hp =mdesc_grab ();
@@ -543,8 +545,10 @@ static void __init report_platform_propeif (v)printk ("PLATFORM: watchdog-max-timeout [%llu ms]\n" , *v); v =mdesc_get_property (hp, pn,"max-cpus" ,NULL ); -if (v) -printk ("PLATFORM: max-cpus [%llu]\n" , *v); +if (v) { + max_cpus = *v; +printk ("PLATFORM: max-cpus [%llu]\n" , max_cpus); + }#ifdef CONFIG_SMP {
@@ -715,7 +719,7 @@ static void __cpuinit set_proc_ids(struc }static void __cpuinit get_one_mondo_bits (const u64 *p,unsigned int *mask, -unsigned char def) +unsigned long def,unsigned long max) {u64 val;
@@ -726,6 +730,9 @@ static void __cpuinit get_one_mondo_bitsif (!val || val >=64 ) goto use_default; +if (val > max) + val = max; + *mask = ((1U << val) *64U ) -1U ;return ;
@@ -736,19 +743,28 @@ use_default:static void __cpuinit get_mondo_data (struct mdesc_handle *hp,u64 mp,struct trap_per_cpu *tb) { +static int printed;const u64 *val; val =mdesc_get_property (hp, mp,"q-cpu-mondo-#bits" ,NULL ); -get_one_mondo_bits (val, &tb->cpu_mondo_qmask,7 ); +get_one_mondo_bits (val, &tb->cpu_mondo_qmask,7 ,ilog2 (max_cpus *2 )); val =mdesc_get_property (hp, mp,"q-dev-mondo-#bits" ,NULL ); -get_one_mondo_bits (val, &tb->dev_mondo_qmask,7 ); +get_one_mondo_bits (val, &tb->dev_mondo_qmask,7 ,8 ); val =mdesc_get_property (hp, mp,"q-resumable-#bits" ,NULL ); -get_one_mondo_bits (val, &tb->resum_qmask,6 ); +get_one_mondo_bits (val, &tb->resum_qmask,6 ,7 ); val =mdesc_get_property (hp, mp,"q-nonresumable-#bits" ,NULL ); -get_one_mondo_bits (val, &tb->nonresum_qmask,2 ); +get_one_mondo_bits (val, &tb->nonresum_qmask,2 ,2 ); +if (!printed++) { +pr_info ("SUN4V: Mondo queue sizes " +"[cpu(%u) dev(%u) r(%u) nr(%u)]\n" , + tb->cpu_mondo_qmask +1 , + tb->dev_mondo_qmask +1 , + tb->resum_qmask +1 , + tb->nonresum_qmask +1 ); + } }static void *__cpuinit mdesc_iterate_over_cpus (void *(*func)(struct mdesc_handle *,u64 ,int ,void *),void *arg,cpumask_t *mask)
PATCH 76/90 sparc: Fix build with DEBUG_PAGEALLOC enabled.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
[ Upstream commit 0785a8e87be0202744d8681363aecbd4ffbb5f5a ]
arch/sparc/mm/init_64.c:1622:22: error: unused variable '__swapper_4m_tsb_phys_patch_end' [-Werror=unused-variable] arch/sparc/mm/init_64.c:1621:22: error: unused variable '__swapper_4m_tsb_phys_patch' [-Werror=unused-variable]
--- arch/sparc/mm/init_64.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/sparc/mm/init_64.c +4 -2
@@ -1618,18 +1618,20 @@ static void ktsb_phys_patch(void) {extern unsigned int __swapper_tsb_phys_patch;extern unsigned int __swapper_tsb_phys_patch_end; -extern unsigned int __swapper_4m_tsb_phys_patch; -extern unsigned int __swapper_4m_tsb_phys_patch_end;unsigned long ktsb_pa; ktsb_pa = kern_base + ((unsigned long )&swapper_tsb[0 ] -KERNBASE );patch_one_ktsb_phys (&__swapper_tsb_phys_patch, &__swapper_tsb_phys_patch_end, ktsb_pa);#ifndef CONFIG_DEBUG_PAGEALLOC + { +extern unsigned int __swapper_4m_tsb_phys_patch; +extern unsigned int __swapper_4m_tsb_phys_patch_end; ktsb_pa = (kern_base + ((unsigned long )&swapper_4m_tsb[0 ] -KERNBASE ));patch_one_ktsb_phys (&__swapper_4m_tsb_phys_patch, &__swapper_4m_tsb_phys_patch_end, ktsb_pa); + }#endif }
PATCH 77/90 Ecryptfs: Add mount option to check uid of device being
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
mounted = expect uid
From: John Johansen <[email protected]>
commit 764355487ea220fdc2faf128d577d7f679b91f97 upstream.
Close a TOCTOU race for mounts done via ecryptfs-mount-private. The mount source (device) can be raced when the ownership test is done in userspace. Provide Ecryptfs a means to force the uid check at mount time.
--- fs/ecryptfs/main.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
fs/ecryptfs/main.c +21 -2
@@ -175,6 +175,7 @@ enum { ecryptfs_opt_sig, ecryptfs_opt_ec ecryptfs_opt_encrypted_view, ecryptfs_opt_fnek_sig, ecryptfs_opt_fn_cipher, ecryptfs_opt_fn_cipher_key_bytes, ecryptfs_opt_unlink_sigs, ecryptfs_opt_mount_auth_tok_only, + ecryptfs_opt_check_dev_ruid, ecryptfs_opt_err }; static const match_table_t tokens = {
@@ -191,6 +192,7 @@ static const match_table_t tokens = { {ecryptfs_opt_fn_cipher_key_bytes, "ecryptfs_fn_key_bytes=%u"}, {ecryptfs_opt_unlink_sigs, "ecryptfs_unlink_sigs"}, {ecryptfs_opt_mount_auth_tok_only, "ecryptfs_mount_auth_tok_only"}, + {ecryptfs_opt_check_dev_ruid, "ecryptfs_check_dev_ruid"}, {ecryptfs_opt_err, NULL} };
@@ -236,6 +238,7 @@ static void ecryptfs_init_mount_crypt_st* ecryptfs_parse_options * @sb: The ecryptfs super block * @options: The options passed to the kernel +* @check_ruid: set to 1 if device uid should be checked against the ruid * * Parse mount options: * debug=N - ecryptfs_verbosity level for debug output
@@ -251,7 +254,8 @@ static void ecryptfs_init_mount_crypt_st* * Returns zero on success; non-zero on error */ -static int ecryptfs_parse_options (struct ecryptfs_sb_info *sbi,char *options) +static int ecryptfs_parse_options (struct ecryptfs_sb_info *sbi,char *options, +uid_t *check_ruid) {char *p;int rc =0 ;
@@ -276,6 +280,8 @@ static int ecryptfs_parse_options(structchar *cipher_key_bytes_src;char *fn_cipher_key_bytes_src; + *check_ruid =0 ; +if (!options) { rc = -EINVAL ; goto out;
@@ -380,6 +386,9 @@ static int ecryptfs_parse_options(struct mount_crypt_stat->flags |=ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY ;break ; +case ecryptfs_opt_check_dev_ruid: + *check_ruid =1 ; +break ;case ecryptfs_opt_err:default : printk(KERN_WARNING
@@ -475,6 +484,7 @@ static struct dentry *ecryptfs_mount(strconst char *err ="Getting sb failed" ;struct inode *inode;struct path path; +uid_t check_ruid;int rc; sbi =kmem_cache_zalloc (ecryptfs_sb_info_cache,GFP_KERNEL );
@@ -483,7 +493,7 @@ static struct dentry *ecryptfs_mount(str goto out; } - rc =ecryptfs_parse_options (sbi, raw_data); + rc =ecryptfs_parse_options (sbi, raw_data, &check_ruid);if (rc) { err ="Error parsing options" ; goto out;
@@ -521,6 +531,15 @@ static struct dentry *ecryptfs_mount(str "known incompatibilities\n"); goto out_free; } + +if (check_ruid && path.dentry->d_inode->i_uid !=current_uid ()) { + rc = -EPERM ; +printk (KERN_ERR "Mount of device (uid: %d) not owned by " +"requested user (uid: %d)\n" , + path.dentry->d_inode->i_uid,current_uid ()); + goto out_free; + } +ecryptfs_set_superblock_lower (s, path.dentry->d_sb); s->s_maxbytes = path.dentry->d_sb->s_maxbytes; s->s_blocksize = path.dentry->d_sb->s_blocksize;
PATCH 78/90 eCryptfs: Return error when lower file pointer is NULL
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tyler Hicks <[email protected]>
commit f61500e000eedc0c7a0201200a7f00ba5529c002 upstream.
When an eCryptfs inode's lower file has been closed, and the pointer has been set to NULL, return an error when trying to do a lower read or write rather than calling BUG().
https://bugzilla.kernel.org/show_bug.cgi?id=37292
--- fs/ecryptfs/read_write.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
fs/ecryptfs/read_write.c +10 -8
@@ -39,15 +39,16 @@int ecryptfs_write_lower (struct inode *ecryptfs_inode,char *data,loff_t offset,size_t size) { -struct ecryptfs_inode_info *inode_info; +struct file *lower_file;mm_segment_t fs_save;ssize_t rc; - inode_info =ecryptfs_inode_to_private (ecryptfs_inode); -BUG_ON (!inode_info->lower_file); + lower_file =ecryptfs_inode_to_private (ecryptfs_inode)->lower_file; +if (!lower_file) +return -EIO ; fs_save =get_fs ();set_fs (get_ds ()); - rc =vfs_write (inode_info->lower_file, data, size, &offset); + rc =vfs_write (lower_file, data, size, &offset);set_fs (fs_save);mark_inode_dirty_sync (ecryptfs_inode);return rc;
@@ -225,15 +226,16 @@ out:int ecryptfs_read_lower (char *data,loff_t offset,size_t size,struct inode *ecryptfs_inode) { -struct ecryptfs_inode_info *inode_info = -ecryptfs_inode_to_private (ecryptfs_inode); +struct file *lower_file;mm_segment_t fs_save;ssize_t rc; -BUG_ON (!inode_info->lower_file); + lower_file =ecryptfs_inode_to_private (ecryptfs_inode)->lower_file; +if (!lower_file) +return -EIO ; fs_save =get_fs ();set_fs (get_ds ()); - rc =vfs_read (inode_info->lower_file, data, size, &offset); + rc =vfs_read (lower_file, data, size, &offset);set_fs (fs_save);return rc; }
PATCH 79/90 powerpc/pseries: Fix kexec on recent firmware versions
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit b1301797f30370c430244979671978fc232f4533 upstream.
Recent versions of firmware will fail to unmap the virtual processor area if we have a dispatch trace log registered. This causes kexec to fail.
If a trace log is registered this patch unregisters it before the SLB shadow and virtual processor areas, fixing the problem.
The address argument is ignored by firmware on unregister so we may as well remove it.
--- arch/powerpc/platforms/pseries/dtl.c | 2 +- arch/powerpc/platforms/pseries/kexec.c | 11 +++++++++++ arch/powerpc/platforms/pseries/plpar_wrappers.h | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-)
arch/powerpc/platforms/pseries/dtl.c +1 -1
@@ -181,7 +181,7 @@ static void dtl_stop(struct dtl *dtl)lppaca_of (dtl->cpu).dtl_enable_mask =0x0 ; -unregister_dtl (hwcpu,__pa (dtl->buf)); +unregister_dtl (hwcpu); }static u64 dtl_current_index (struct dtl *dtl)
arch/powerpc/platforms/pseries/kexec.c +11 -0
@@ -26,6 +26,17 @@ static void pseries_kexec_cpu_down(int c/* Don't risk a hypervisor call if we're crashing */ if (firmware_has_feature (FW_FEATURE_SPLPAR ) && !crash_shutdown) {unsigned long addr; +int ret; + +if (get_lppaca ()->dtl_enable_mask) { + ret =unregister_dtl (hard_smp_processor_id ()); +if (ret) { +pr_err ("WARNING: DTL deregistration for cpu " +"%d (hw %d) failed with %d\n" , +smp_processor_id (), +hard_smp_processor_id (), ret); + } + } addr =__pa (get_slb_shadow ());if (unregister_slb_shadow (hard_smp_processor_id (), addr))
arch/powerpc/platforms/pseries/plpar_wrappers.h +2 -2
@@ -73,9 +73,9 @@ static inline long register_slb_shadow(ureturn vpa_call (0x3 , cpu, vpa); } -static inline long unregister_dtl (unsigned long cpu,unsigned long vpa) +static inline long unregister_dtl (unsigned long cpu) { -return vpa_call (0x6 , cpu, vpa); +return vpa_call (0x6 , cpu,0 ); }static inline long register_dtl (unsigned long cpu,unsigned long vpa)
PATCH 80/90 powerpc: Fix device tree claim code
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit 966728dd88b4026ec58fee169ccceaeaf56ef120 upstream.
I have a box that fails in OF during boot with:
DEFAULT CATCH!, exception-handler=fff00400
at %SRR0: 49424d2c4c6f6768 %SRR1: 800000004000b002
ie "IBM,Logh". OF got corrupted with a device tree string.
Looking at make_room and alloc_up, we claim the first chunk (1 MB) but we never claim any more. mem_end is always set to alloc_top which is the top of our available address space, guaranteeing we will never call alloc_up and claim more memory.
Also alloc_up wasn't setting alloc_bottom to the bottom of the available address space.
This doesn't help the box to boot, but we at least fail with an obvious error. We could relocate the device tree in a future patch.
--- arch/powerpc/kernel/prom_init.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/kernel/prom_init.c +3 -3
@@ -1020,7 +1020,7 @@ static unsigned long __init alloc_up(uns }if (addr ==0 )return 0 ; -RELOC (alloc_bottom) = addr; +RELOC (alloc_bottom) = addr + size;prom_debug (" -> %x\n" , addr);prom_debug (" alloc_bottom : %x\n" ,RELOC (alloc_bottom));
@@ -1834,7 +1834,7 @@ static void __init *make_room(unsigned l chunk =alloc_up (room,0 );if (chunk ==0 )prom_panic ("No memory for flatten_device_tree (claim failed)" ); - *mem_end =RELOC (alloc_top); + *mem_end = chunk + room; } ret = (void *)*mem_start;
@@ -2053,7 +2053,7 @@ static void __init flatten_device_tree(v mem_start = (unsigned long )alloc_up (room,PAGE_SIZE );if (mem_start ==0 )prom_panic ("Can't allocate initial device-tree chunk\n" ); - mem_end =RELOC (alloc_top); + mem_end = mem_start + room;/* Get root of tree */ root =call_prom ("peer" ,1 ,1 , (phandle )0 );
PATCH 81/90 powerpc: pseries: Fix kexec on machines with more than 4TB of RAM
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anton Blanchard <[email protected]>
commit bed9a31527af8ff3dfbad62a1a42815cef4baab7 upstream.
On a box with 8TB of RAM the MMU hashtable is 64GB in size. That means we have 4G PTEs. pSeries_lpar_hptab_clear was using a signed int to store the index which will overflow at 2G.
--- arch/powerpc/platforms/pseries/lpar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/pseries/lpar.c +1 -1
@@ -395,7 +395,7 @@ static void pSeries_lpar_hptab_clear(voiunsigned long ptel; } ptes[4 ];long lpar_rc; -int i, j; +unsigned long i, j;/* Read in batches of 4, * invalidate only valid entries not in the VRMA
PATCH 82/90 ext3: Properly count journal credits for long symlinks
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Sandeen <[email protected]>
commit d2db60df1e7eb39cf0f378dfc4dd8813666d46ef upstream.
Commit ae54870a1dc9 ("ext3: Fix lock inversion in ext3_symlink()") recalculated the number of credits needed for a long symlink, in the process of splitting it into two transactions. However, the first credit calculation under-counted because if selinux is enabled, credits are needed to create the selinux xattr as well.
Overrunning the reservation will result in an OOPS in journal_dirty_metadata() due to this assert:
J_ASSERT_JH(jh, handle->h_buffer_credits > 0);
Fix this by increasing the reservation size.
--- fs/ext3/namei.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/ext3/namei.c +4 -2
@@ -2210,9 +2210,11 @@ static int ext3_symlink (struct inode */* * For non-fast symlinks, we just allocate inode and put it on * orphan list in the first transaction => we need bitmap, -* group descriptor, sb, inode block, quota blocks. +* group descriptor, sb, inode block, quota blocks, and +* possibly selinux xattr blocks. */ - credits =4 +EXT3_MAXQUOTAS_INIT_BLOCKS (dir->i_sb); + credits =4 +EXT3_MAXQUOTAS_INIT_BLOCKS (dir->i_sb) + +EXT3_XATTR_TRANS_BLOCKS ; }else {/* * Fast symlink. We have to add entry to directory
PATCH 83/90 ext4: Properly count journal credits for long symlinks
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Sandeen <[email protected]>
commit 8c20871998c082f6fbc963f1449a5ba5140ee39a upstream.
Commit df5e6223407e ("ext4: fix deadlock in ext4_symlink() in ENOSPC conditions") recalculated the number of credits needed for a long symlink, in the process of splitting it into two transactions. However, the first credit calculation under-counted because if selinux is enabled, credits are needed to create the selinux xattr as well.
Overrunning the reservation will result in an OOPS in jbd2_journal_dirty_metadata() due to this assert:
J_ASSERT_JH(jh, handle->h_buffer_credits > 0);
Fix this by increasing the reservation size.
--- fs/ext4/namei.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/ext4/namei.c +4 -2
@@ -2264,9 +2264,11 @@ static int ext4_symlink(struct inode *di/* * For non-fast symlinks, we just allocate inode and put it on * orphan list in the first transaction => we need bitmap, -* group descriptor, sb, inode block, quota blocks. +* group descriptor, sb, inode block, quota blocks, and +* possibly selinux xattr blocks. */ - credits =4 +EXT4_MAXQUOTAS_INIT_BLOCKS (dir->i_sb); + credits =4 +EXT4_MAXQUOTAS_INIT_BLOCKS (dir->i_sb) + +EXT4_XATTR_TRANS_BLOCKS ; }else {/* * Fast symlink. We have to add entry to directory
PATCH 84/90 e1000e: alternate MAC address does not work on device id 0x1060
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bruce Allan <[email protected]>
commit c407bee8a56d874b91f3e4ee790660959ff1a25e upstream.
This issue is present all the way back to 2.6.34 kernels.
--- drivers/net/e1000e/lib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/e1000e/lib.c +2 -1
@@ -190,7 +190,8 @@ s32 e1000_check_alt_mac_addr_generic(str/* Check for LOM (vs. NIC) or one of two valid mezzanine cards */ if (!((nvm_data &NVM_COMPAT_LOM ) || (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES_DUAL ) || - (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES_QUAD ))) + (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES_QUAD ) || + (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES ))) goto out; ret_val = e1000_read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1,
PATCH 85/90 gianfar: fix fiper alignment after resetting the time
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Richard Cochran <[email protected]>
commit cbc056602c7c63620c86904c431ff6b61e029dcc upstream.
After resetting the time, the PPS signals on the FIPER output channels are incorrectly offset from the clock time, as can be readily verified by a looping back the FIPER to the external time stamp input.
Despite its name, setting the "Fiper Realignment Disable" bit seems to fix the problem, at least on the P2020.
Also, following the example code from the Freescale BSP, it is not really necessary to disable and re-enable the timer in order to reprogram the FIPER. (The documentation is rather unclear on this point. It seems that writing to the alarm register also disables the FIPER.)
--- drivers/net/gianfar_ptp.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/net/gianfar_ptp.c +2 -7
@@ -193,14 +193,9 @@ static void set_alarm(struct etsects *et/* Caller must hold etsects->lock. */ static void set_fipers (struct etsects *etsects) { -u32 tmr_ctrl =gfar_read (&etsects->regs->tmr_ctrl); - -gfar_write (&etsects->regs->tmr_ctrl, tmr_ctrl & (~TE )); -gfar_write (&etsects->regs->tmr_prsc, etsects->tmr_prsc); +set_alarm (etsects);gfar_write (&etsects->regs->tmr_fiper1, etsects->tmr_fiper1);gfar_write (&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); -set_alarm (etsects); -gfar_write (&etsects->regs->tmr_ctrl, tmr_ctrl|TE ); }/*
@@ -511,7 +506,7 @@ static int gianfar_ptp_probe(struct platgfar_write (&etsects->regs->tmr_fiper1, etsects->tmr_fiper1);gfar_write (&etsects->regs->tmr_fiper2, etsects->tmr_fiper2);set_alarm (etsects); -gfar_write (&etsects->regs->tmr_ctrl, tmr_ctrl|FS |RTPE |TE ); +gfar_write (&etsects->regs->tmr_ctrl, tmr_ctrl|FS |RTPE |TE |FRD );spin_unlock_irqrestore (&etsects->lock, flags);
PATCH 86/90 dp83640: increase receive time stamp buffer size
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Richard Cochran <[email protected]>
commit 8028837d71ba9904b17281b40f94b93e947fbe38 upstream.
The dp83640 buffers receive time stamps from special PHY status frames, matching them to received PTP packets in a work queue. Because the timeout for orphaned time stamps is so long and the buffer is so small, the driver can drop time stamps under moderate PTP traffic.
This commit fixes the issue by decreasing the timeout to (at least) one timer tick and increasing the buffer size.
--- drivers/net/phy/dp83640.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/phy/dp83640.c +2 -3
@@ -34,8 +34,7 @@#define PAGESEL 0x13#define LAYER4 0x02#define LAYER2 0x01 -#define MAX_RXTS 4 -#define MAX_TXTS 4 +#define MAX_RXTS 64#define N_EXT_TS 1#define PSF_PTPVER 2#define PSF_EVNT 0x4000
@@ -218,7 +217,7 @@ static void phy2rxts(struct phy_rxts *p, rxts->seqid = p->seqid; rxts->msgtype = (p->msgtype >>12 ) &0xf ; rxts->hash = p->msgtype &0x0fff ; - rxts->tmo = jiffies +HZ ; + rxts->tmo = jiffies +2 ; }static u64 phy2txts (struct phy_txts *p)
PATCH 87/90 ath9k_hw: Fix incorrect Tx control power in AR9003 template
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Rajkumar Manoharan <[email protected]>
commit 15052f81d255eac44e745bc630b36aa86779ad9d upstream.
CTL power data incorrect in ctlPowerData_2G field of ar9300_eeprom. Setting incorrect CTL power in calibration is causing lower tx power. Tx power was reported as 3dBm while operating in channel 6 HT40+/ in channel 11 HT40- due to CTL powers in the calibration is set to zero.
--- drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +3 -3
@@ -306,7 +306,7 @@ static const struct ar9300_eeprom ar9300 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, - { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, + { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
@@ -883,7 +883,7 @@ static const struct ar9300_eeprom ar9300 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, - { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, + { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
@@ -2039,7 +2039,7 @@ static const struct ar9300_eeprom ar9300 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } }, - { { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } }, + { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } }, { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
PATCH 88/90 ath9k: fix a misprint which leads to incorrect calibration
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Hacker <[email protected]>
commit 118c9db51e7acaf8f16deae8311cce6588b83e31 upstream.
This patch addresses an issue with incorrect HW register AR_PHY_TX_IQCAL_CORR_COEFF_B1 definition which leads to incorrect clibration.
--- drivers/net/wireless/ath/ath9k/ar9003_phy.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/ar9003_phy.h +1 -1
@@ -848,7 +848,7 @@#define AR_PHY_TPC_11_B1 (AR_SM1_BASE + 0x220)#define AR_PHY_PDADC_TAB_1 (AR_SM1_BASE + 0x240)#define AR_PHY_TX_IQCAL_STATUS_B1 (AR_SM1_BASE + 0x48c) -#define AR_PHY_TX_IQCAL_CORR_COEFF_B1 (_i) (AR_SM_BASE + 0x450 + ((_i) << 2)) +#define AR_PHY_TX_IQCAL_CORR_COEFF_B1 (_i) (AR_SM1_BASE + 0x450 + ((_i) << 2))/* * Channel 2 Register Map
PATCH 89/90 sparc: Dont do hypervisor calls on non-sun4v in DS driver.
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: "David S. Miller" <[email protected]>
commit c92761fd9efcbbcb59e7bf4db88e29ce03229889 upstream.
--- arch/sparc/kernel/ds.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
arch/sparc/kernel/ds.c +7 -6
@@ -1256,13 +1256,14 @@ static int __init ds_init(void) {unsigned long hv_ret, major, minor; - hv_ret =sun4v_get_version (HV_GRP_REBOOT_DATA , &major, &minor); -if (hv_ret ==HV_EOK ) { -pr_info ("SUN4V: Reboot data supported (maj=%lu,min=%lu).\n" , - major, minor); - reboot_data_supported =1 ; +if (tlb_type == hypervisor) { + hv_ret =sun4v_get_version (HV_GRP_REBOOT_DATA , &major, &minor); +if (hv_ret ==HV_EOK ) { +pr_info ("SUN4V: Reboot data supported (maj=%lu,min=%lu).\n" , + major, minor); + reboot_data_supported =1 ; + } } -kthread_run (ds_thread,NULL ,"kldomd" );return vio_register_driver (&ds_driver);
PATCH 90/90 mm: Fix fixup_user_fault() for MMU=n
In reply to Greg KH3.0-stable review patch. If anyone has any objections, please let us know.
------------------
From: Peter Zijlstra <[email protected]>
commit 5c723ba5b7886909b2e430f2eae454c33f7fe5c6 upstream.
In commit 2efaca927f5c ("mm/futex: fix futex writes on archs with SW tracking of dirty & young") we forgot about MMU=n. This patch fixes that.
--- include/linux/mm.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
include/linux/mm.h +10 -2
@@ -959,6 +959,8 @@ int invalidate_inode_page(struct page *p#ifdef CONFIG_MMU extern int handle_mm_fault (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long address,unsigned int flags); +extern int fixup_user_fault (struct task_struct *tsk,struct mm_struct *mm, +unsigned long address,unsigned int fault_flags);#else static inline int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address,
@@ -968,6 +970,14 @@ static inline int handle_mm_fault(structBUG (); return VM_FAULT_SIGBUS; } +static inline int fixup_user_fault (struct task_struct *tsk, +struct mm_struct *mm,unsigned long address, +unsigned int fault_flags) +{ +/* should never happen if there's no MMU */ +BUG (); +return -EFAULT ; +}#endif extern int make_pages_present (unsigned long addr,unsigned long end);
@@ -985,8 +995,6 @@ int get_user_pages(struct task_struct *tint get_user_pages_fast (unsigned long start,int nr_pages,int write,struct page **pages);struct page *get_dump_page (unsigned long addr); -extern int fixup_user_fault (struct task_struct *tsk,struct mm_struct *mm, -unsigned long address,unsigned int fault_flags);extern int try_to_release_page (struct page * page,gfp_t gfp_mask);extern void do_invalidatepage (struct page *page,unsigned long offset);
Hi,
Quoted 9 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Monday, August 15, 2011, 20:00:00 UTC. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.0.2-rc1.gz and the diffstat can be found below.thanks,
greg k-h
It seems that this release has not yet reached the -allstable tree, moreover, the tree seem to not have seen any upgrade from Linus tree for 4 days. Is there anything broken ?
Thanks,
- Arnaud
Quoted 157 lines
Makefile | 4 +-
arch/cris/arch-v10/drivers/sync_serial.c| 6 +-arch/cris/arch-v10/kernel/irq.c| 3 +arch/cris/include/asm/thread_info.h| 6 +-arch/parisc/include/asm/atomic.h | 4 +- arch/parisc/include/asm/futex.h | 66 ++++- arch/parisc/include/asm/unistd.h | 3 +-arch/parisc/kernel/syscall_table.S | 1 +
arch/powerpc/kernel/prom_init.c| 6 +-arch/powerpc/platforms/pseries/dtl.c| 2 +-arch/powerpc/platforms/pseries/kexec.c| 11 +arch/powerpc/platforms/pseries/lpar.c| 2 +-arch/powerpc/platforms/pseries/plpar_wrappers.h| 4 +-arch/sparc/include/asm/bitops_64.h| 49 +---arch/sparc/include/asm/elf_64.h| 63 ++---arch/sparc/include/asm/hypervisor.h| 14 +arch/sparc/include/asm/spitfire.h| 1 +arch/sparc/include/asm/tsb.h| 51 ++--arch/sparc/include/asm/xor_64.h| 3 +-arch/sparc/kernel/cpu.c| 8 +arch/sparc/kernel/cpumap.c| 1 +arch/sparc/kernel/ds.c| 31 ++-arch/sparc/kernel/entry.h| 14 +arch/sparc/kernel/head_64.S| 33 +++-arch/sparc/kernel/hvapi.c| 7 +arch/sparc/kernel/hvcalls.S| 7 +arch/sparc/kernel/kernel.h| 15 +arch/sparc/kernel/ktlb.S| 24 +-arch/sparc/kernel/mdesc.c| 30 ++-arch/sparc/kernel/pcr.c| 11 +-arch/sparc/kernel/perf_event.c| 3 +-arch/sparc/kernel/setup_64.c| 186 +++++++++++++arch/sparc/kernel/sparc_ksyms_64.c| 11 +arch/sparc/kernel/sstate.c| 9 +-arch/sparc/kernel/unaligned_64.c| 15 +-arch/sparc/kernel/vmlinux.lds.S| 21 ++-arch/sparc/lib/Makefile | 4 +- arch/sparc/lib/NG2page.S | 61 ---- arch/sparc/lib/NGpage.S | 114 +++++---arch/sparc/lib/ffs.S | 84 ++++++
arch/sparc/lib/hweight.S| 51 ++++arch/sparc/mm/init_64.c| 42 +++-arch/x86/xen/Makefile| 2 +-arch/x86/xen/enlighten.c| 8 +arch/x86/xen/vga.c| 67 +++++arch/x86/xen/xen-ops.h| 11 +crypto/md5.c| 92 +------drivers/char/random.c| 334 +----------------------drivers/gpu/drm/drm_edid.c| 24 ++-drivers/gpu/drm/i915/i915_dma.c| 6 +-drivers/gpu/drm/i915/i915_irq.c| 3 +drivers/gpu/drm/i915/intel_display.c| 8 +-drivers/gpu/drm/i915/intel_panel.c| 4 +drivers/gpu/drm/i915/intel_ringbuffer.c| 3 +drivers/gpu/drm/radeon/radeon_connectors.c| 54 ++++-drivers/gpu/drm/radeon/radeon_device.c| 5 +-drivers/gpu/drm/radeon/radeon_display.c| 9 +drivers/gpu/drm/radeon/radeon_i2c.c| 32 ++-drivers/gpu/drm/radeon/radeon_mode.h| 6 +-drivers/isdn/i4l/isdn_net.c| 3 +drivers/net/Makefile| 1 +drivers/net/bonding/bond_main.c| 6 +-drivers/net/bonding/bond_sysfs.c| 133 +++++-----drivers/net/e1000e/lib.c| 3 +-drivers/net/gianfar_ptp.c| 9 +-drivers/net/ifb.c| 2 +-drivers/net/macvlan.c| 2 +-drivers/net/niu.c| 4 +-drivers/net/phy/dp83640.c| 5 +-drivers/net/r8169.c| 1 +drivers/net/sis190.c| 12 +-drivers/net/tun.c| 1 +drivers/net/veth.c| 2 +drivers/net/wan/hdlc_fr.c| 5 +-drivers/net/wireless/airo.c| 1 +drivers/net/wireless/ath/ath9k/ar9002_hw.c| 6 +-drivers/net/wireless/ath/ath9k/ar9003_eeprom.c| 6 +-drivers/net/wireless/ath/ath9k/ar9003_hw.c| 6 +-drivers/net/wireless/ath/ath9k/ar9003_phy.h| 2 +-drivers/net/wireless/ath/ath9k/hw.c| 11 +-drivers/net/wireless/ath/ath9k/hw.h| 3 +-drivers/net/wireless/ath/ath9k/init.c| 2 +drivers/net/wireless/ath/ath9k/pci.c| 27 ++drivers/net/wireless/hostap/hostap_main.c| 1 +drivers/net/wireless/iwlegacy/iwl-3945.c | 6 +- drivers/net/wireless/iwlegacy/iwl-4965.c | 8 +- drivers/net/wireless/iwlwifi/iwl-5000.c | 1 + drivers/net/wireless/iwlwifi/iwl-core.h | 2 + drivers/net/wireless/iwlwifi/iwl-power.c | 3 +- drivers/net/wireless/rt2x00/rt2800lib.c | 3 +- drivers/net/wireless/rt2x00/rt2x00mac.c | 5 +-drivers/net/wireless/rtlwifi/pci.c | 20 +-
drivers/platform/x86/asus-wmi.c| 17 +-drivers/scsi/mpt2sas/mpt2sas_base.c| 65 ++---drivers/scsi/mpt2sas/mpt2sas_base.h| 53 ++++-drivers/scsi/mpt2sas/mpt2sas_ctl.c| 10 +-drivers/scsi/mpt2sas/mpt2sas_debug.h| 2 +-drivers/scsi/mpt2sas/mpt2sas_scsih.c| 12 +-drivers/scsi/mpt2sas/mpt2sas_transport.c| 24 +-drivers/staging/ath6kl/os/linux/ar6000_drv.c| 1 +fs/cifs/cifsfs.c| 4 +fs/cifs/inode.c| 14 +-fs/cifs/transport.c| 2 +fs/ecryptfs/main.c| 23 ++-fs/ecryptfs/read_write.c| 18 +-fs/ext3/namei.c| 6 +-fs/ext4/namei.c| 6 +-include/drm/drm_crtc.h| 1 +include/drm/i915_drm.h| 2 +-include/linux/cryptohash.h| 5 +include/linux/if.h| 2 +include/linux/mm.h| 12 +-include/linux/random.h| 11 -include/net/ipv6.h| 12 +-include/net/secure_seq.h| 20 ++include/net/transp_v6.h| 2 +include/xen/interface/xen.h| 39 +++kernel/futex.c| 54 +++- lib/Makefile | 2 +-lib/md5.c| 95 +++++++net/8021q/vlan_dev.c| 2 +-net/bluetooth/bnep/netdev.c| 1 +net/core/Makefile| 2 +-net/core/link_watch.c| 2 +-net/core/pktgen.c| 8 +-net/core/secure_seq.c| 184 +++++++++++++net/dccp/ipv4.c| 1 +net/dccp/ipv6.c| 9 +-net/ethernet/eth.c| 1 +net/ipv4/devinet.c| 16 +-net/ipv4/gre.c| 21 +-net/ipv4/icmp.c| 14 +-net/ipv4/igmp.c| 2 +-net/ipv4/inet_hashtables.c| 1 +net/ipv4/inetpeer.c| 1 +net/ipv4/ip_output.c| 6 +-net/ipv4/ipmr.c| 2 +-net/ipv4/netfilter/nf_nat_proto_common.c| 1 +net/ipv4/route.c| 6 +-net/ipv4/tcp_ipv4.c| 1 +net/ipv6/af_inet6.c| 2 +net/ipv6/inet6_hashtables.c| 1 +net/ipv6/ip6_output.c| 40 +++-net/ipv6/tcp_ipv6.c| 1 +net/ipv6/udp.c| 2 +-net/l2tp/l2tp_eth.c| 2 +-net/mac80211/iface.c| 1 +net/netfilter/ipvs/ip_vs_ctl.c| 1 +net/sched/sch_sfq.c| 7 +-net/socket.c| 73 +++---net/xfrm/xfrm_algo.c| 4 +-sound/core/timer.c| 2 +sound/soc/codecs/sgtl5000.c| 128 +++-------sound/usb/caiaq/input.c| 2 +-sound/usb/endpoint.c| 2 +-sound/usb/mixer.c| 25 +-sound/usb/mixer.h| 1 +
Quoted 7 lines
157 files changed, 1967 insertions(+), 1173 deletions(-)--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
ÿôèº{.nÇ+‰·Ÿ®‰†+%ŠËÿ±éݶ¥Šwÿº{.nÇ+‰·¥Š{±þG«�éÿŠ{ayºÊ‡Ú™ë,j¢f£¢·hš�ï�êÿ‘êçz_è®(階ŠÝ¢j"�ú¶m§ÿÿ¾«þG«�éÿ¢¸?™¨èÚ&£ø§~�á¶iO•æ¬z·švØ^¶m§ÿÿÃÿ¶ìÿ¢¸?–I¥
Quoted 16 lines · Arnaud Lacombe
Hi,
Quoted 13 lines · Greg KH
This is the start of the stable review cycle for the 3.0.2 release. There are 90 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Monday, August 15, 2011, 20:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.0.2-rc1.gz and the diffstat can be found below.
Quoted 7 lines
Quoted 4 lines
thanks,
greg k-h
It seems that this release has not yet reached the -allstable tree, moreover, the tree seem to not have seen any upgrade from Linus tree for 4 days. Is there anything broken ?
kernel.org is having mirroring problems at the moment, sorry.
greg k-h
Quoted 2 lines · Greg KH
kernel.org is having mirroring problems at the moment, sorry.
Yeah, not just mirroring problems, there's been other problems there too. And for the last week or so, load average has hovered in the fifty range due to checksumming.
There's also been vacations, and people are traveling this week due to LinuxCon Vancouver too. So it's not getting fixed quite as quickly as it might have been otherwise.
Linus
H. Peter Anvin
reviewerQuoted 8 lines · Linus Torvalds
Quoted 2 lines · Greg KH
kernel.org is having mirroring problems at the moment, sorry.
Yeah, not just mirroring problems, there's been other problems there too. And for the last week or so, load average has hovered in the fifty range due to checksumming.
Quoted 5 lines
There's also been vacations, and people are traveling this week due to LinuxCon Vancouver too. So it's not getting fixed quite as quickly as it might have been otherwise.
Linus
I talked to John about this; he says hera needs a reboot for a kernel replacement.
Signature · 1 line
Sent from my mobile phone. Please excuse my brevity and lack of formatting.