ia64/xen-unstable

changeset 6021:e9b950192ba6

Add linux 2.6.12.3 patch
Signed-off-by: ian@xensource.com
author iap10@freefall.cl.cam.ac.uk
date Wed Aug 03 21:17:17 2005 +0000 (2005-08-03)
parents d9442abaa980
children f46bb706a38d
files patches/linux-2.6.12/linux-2.6.12.3.patch
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/linux-2.6.12/linux-2.6.12.3.patch	Wed Aug 03 21:17:17 2005 +0000
     1.3 @@ -0,0 +1,1047 @@
     1.4 +diff --git a/Makefile b/Makefile
     1.5 +--- a/Makefile
     1.6 ++++ b/Makefile
     1.7 +@@ -1,7 +1,7 @@
     1.8 + VERSION = 2
     1.9 + PATCHLEVEL = 6
    1.10 + SUBLEVEL = 12
    1.11 +-EXTRAVERSION =
    1.12 ++EXTRAVERSION = .3
    1.13 + NAME=Woozy Numbat
    1.14 + 
    1.15 + # *DOCUMENTATION*
    1.16 +diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
    1.17 +--- a/arch/ia64/kernel/ptrace.c
    1.18 ++++ b/arch/ia64/kernel/ptrace.c
    1.19 +@@ -945,6 +945,13 @@ access_uarea (struct task_struct *child,
    1.20 + 				*data = (pt->cr_ipsr & IPSR_MASK);
    1.21 + 			return 0;
    1.22 + 
    1.23 ++		      case PT_AR_RSC:
    1.24 ++			if (write_access)
    1.25 ++				pt->ar_rsc = *data | (3 << 2); /* force PL3 */
    1.26 ++			else
    1.27 ++				*data = pt->ar_rsc;
    1.28 ++			return 0;
    1.29 ++
    1.30 + 		      case PT_AR_RNAT:
    1.31 + 			urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
    1.32 + 			rnat_addr = (long) ia64_rse_rnat_addr((long *)
    1.33 +@@ -996,9 +1003,6 @@ access_uarea (struct task_struct *child,
    1.34 + 		      case PT_AR_BSPSTORE:
    1.35 + 			ptr = pt_reg_addr(pt, ar_bspstore);
    1.36 + 			break;
    1.37 +-		      case PT_AR_RSC:
    1.38 +-			ptr = pt_reg_addr(pt, ar_rsc);
    1.39 +-			break;
    1.40 + 		      case PT_AR_UNAT:
    1.41 + 			ptr = pt_reg_addr(pt, ar_unat);
    1.42 + 			break;
    1.43 +@@ -1234,7 +1238,7 @@ ptrace_getregs (struct task_struct *chil
    1.44 + static long
    1.45 + ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
    1.46 + {
    1.47 +-	unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0;
    1.48 ++	unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0;
    1.49 + 	struct unw_frame_info info;
    1.50 + 	struct switch_stack *sw;
    1.51 + 	struct ia64_fpreg fpval;
    1.52 +@@ -1267,7 +1271,7 @@ ptrace_setregs (struct task_struct *chil
    1.53 + 	/* app regs */
    1.54 + 
    1.55 + 	retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]);
    1.56 +-	retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]);
    1.57 ++	retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]);
    1.58 + 	retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]);
    1.59 + 	retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]);
    1.60 + 	retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]);
    1.61 +@@ -1365,6 +1369,7 @@ ptrace_setregs (struct task_struct *chil
    1.62 + 	retval |= __get_user(nat_bits, &ppr->nat);
    1.63 + 
    1.64 + 	retval |= access_uarea(child, PT_CR_IPSR, &psr, 1);
    1.65 ++	retval |= access_uarea(child, PT_AR_RSC, &rsc, 1);
    1.66 + 	retval |= access_uarea(child, PT_AR_EC, &ec, 1);
    1.67 + 	retval |= access_uarea(child, PT_AR_LC, &lc, 1);
    1.68 + 	retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1);
    1.69 +diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
    1.70 +--- a/arch/ia64/kernel/signal.c
    1.71 ++++ b/arch/ia64/kernel/signal.c
    1.72 +@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *u
    1.73 + static long
    1.74 + restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
    1.75 + {
    1.76 +-	unsigned long ip, flags, nat, um, cfm;
    1.77 ++	unsigned long ip, flags, nat, um, cfm, rsc;
    1.78 + 	long err;
    1.79 + 
    1.80 + 	/* Always make any pending restarted system calls return -EINTR */
    1.81 +@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __
    1.82 + 	err |= __get_user(ip, &sc->sc_ip);			/* instruction pointer */
    1.83 + 	err |= __get_user(cfm, &sc->sc_cfm);
    1.84 + 	err |= __get_user(um, &sc->sc_um);			/* user mask */
    1.85 +-	err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc);
    1.86 ++	err |= __get_user(rsc, &sc->sc_ar_rsc);
    1.87 + 	err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat);
    1.88 + 	err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr);
    1.89 + 	err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs);
    1.90 +@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __
    1.91 + 	err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8);	/* r15 */
    1.92 + 
    1.93 + 	scr->pt.cr_ifs = cfm | (1UL << 63);
    1.94 ++	scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */
    1.95 + 
    1.96 + 	/* establish new instruction pointer: */
    1.97 + 	scr->pt.cr_iip = ip & ~0x3UL;
    1.98 +diff --git a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c
    1.99 +--- a/arch/ppc/kernel/time.c
   1.100 ++++ b/arch/ppc/kernel/time.c
   1.101 +@@ -89,6 +89,9 @@ unsigned long tb_to_ns_scale;
   1.102 + 
   1.103 + extern unsigned long wall_jiffies;
   1.104 + 
   1.105 ++/* used for timezone offset */
   1.106 ++static long timezone_offset;
   1.107 ++
   1.108 + DEFINE_SPINLOCK(rtc_lock);
   1.109 + 
   1.110 + EXPORT_SYMBOL(rtc_lock);
   1.111 +@@ -170,7 +173,7 @@ void timer_interrupt(struct pt_regs * re
   1.112 + 		     xtime.tv_sec - last_rtc_update >= 659 &&
   1.113 + 		     abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ &&
   1.114 + 		     jiffies - wall_jiffies == 1) {
   1.115 +-		  	if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0)
   1.116 ++		  	if (ppc_md.set_rtc_time(xtime.tv_sec+1 + timezone_offset) == 0)
   1.117 + 				last_rtc_update = xtime.tv_sec+1;
   1.118 + 			else
   1.119 + 				/* Try again one minute later */
   1.120 +@@ -286,7 +289,7 @@ void __init time_init(void)
   1.121 + 	unsigned old_stamp, stamp, elapsed;
   1.122 + 
   1.123 +         if (ppc_md.time_init != NULL)
   1.124 +-                time_offset = ppc_md.time_init();
   1.125 ++                timezone_offset = ppc_md.time_init();
   1.126 + 
   1.127 + 	if (__USE_RTC()) {
   1.128 + 		/* 601 processor: dec counts down by 128 every 128ns */
   1.129 +@@ -331,10 +334,10 @@ void __init time_init(void)
   1.130 + 	set_dec(tb_ticks_per_jiffy);
   1.131 + 
   1.132 + 	/* If platform provided a timezone (pmac), we correct the time */
   1.133 +-        if (time_offset) {
   1.134 +-		sys_tz.tz_minuteswest = -time_offset / 60;
   1.135 ++        if (timezone_offset) {
   1.136 ++		sys_tz.tz_minuteswest = -timezone_offset / 60;
   1.137 + 		sys_tz.tz_dsttime = 0;
   1.138 +-		xtime.tv_sec -= time_offset;
   1.139 ++		xtime.tv_sec -= timezone_offset;
   1.140 +         }
   1.141 +         set_normalized_timespec(&wall_to_monotonic,
   1.142 +                                 -xtime.tv_sec, -xtime.tv_nsec);
   1.143 +diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
   1.144 +--- a/arch/um/kernel/process.c
   1.145 ++++ b/arch/um/kernel/process.c
   1.146 +@@ -130,7 +130,7 @@ int start_fork_tramp(void *thread_arg, u
   1.147 + 	return(arg.pid);
   1.148 + }
   1.149 + 
   1.150 +-static int ptrace_child(void)
   1.151 ++static int ptrace_child(void *arg)
   1.152 + {
   1.153 + 	int ret;
   1.154 + 	int pid = os_getpid(), ppid = getppid();
   1.155 +@@ -159,16 +159,20 @@ static int ptrace_child(void)
   1.156 + 	_exit(ret);
   1.157 + }
   1.158 + 
   1.159 +-static int start_ptraced_child(void)
   1.160 ++static int start_ptraced_child(void **stack_out)
   1.161 + {
   1.162 ++	void *stack;
   1.163 ++	unsigned long sp;
   1.164 + 	int pid, n, status;
   1.165 + 	
   1.166 +-	pid = fork();
   1.167 +-	if(pid == 0)
   1.168 +-		ptrace_child();
   1.169 +-
   1.170 ++	stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
   1.171 ++		     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
   1.172 ++	if(stack == MAP_FAILED)
   1.173 ++		panic("check_ptrace : mmap failed, errno = %d", errno);
   1.174 ++	sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *);
   1.175 ++	pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL);
   1.176 + 	if(pid < 0)
   1.177 +-		panic("check_ptrace : fork failed, errno = %d", errno);
   1.178 ++		panic("check_ptrace : clone failed, errno = %d", errno);
   1.179 + 	CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
   1.180 + 	if(n < 0)
   1.181 + 		panic("check_ptrace : wait failed, errno = %d", errno);
   1.182 +@@ -176,6 +180,7 @@ static int start_ptraced_child(void)
   1.183 + 		panic("check_ptrace : expected SIGSTOP, got status = %d",
   1.184 + 		      status);
   1.185 + 
   1.186 ++	*stack_out = stack;
   1.187 + 	return(pid);
   1.188 + }
   1.189 + 
   1.190 +@@ -183,12 +188,12 @@ static int start_ptraced_child(void)
   1.191 +  * just avoid using sysemu, not panic, but only if SYSEMU features are broken.
   1.192 +  * So only for SYSEMU features we test mustpanic, while normal host features
   1.193 +  * must work anyway!*/
   1.194 +-static int stop_ptraced_child(int pid, int exitcode, int mustexit)
   1.195 ++static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic)
   1.196 + {
   1.197 + 	int status, n, ret = 0;
   1.198 + 
   1.199 + 	if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
   1.200 +-		panic("stop_ptraced_child : ptrace failed, errno = %d", errno);
   1.201 ++		panic("check_ptrace : ptrace failed, errno = %d", errno);
   1.202 + 	CATCH_EINTR(n = waitpid(pid, &status, 0));
   1.203 + 	if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
   1.204 + 		int exit_with = WEXITSTATUS(status);
   1.205 +@@ -199,13 +204,15 @@ static int stop_ptraced_child(int pid, i
   1.206 + 		printk("check_ptrace : child exited with exitcode %d, while "
   1.207 + 		      "expecting %d; status 0x%x", exit_with,
   1.208 + 		      exitcode, status);
   1.209 +-		if (mustexit)
   1.210 ++		if (mustpanic)
   1.211 + 			panic("\n");
   1.212 + 		else
   1.213 + 			printk("\n");
   1.214 + 		ret = -1;
   1.215 + 	}
   1.216 + 
   1.217 ++	if(munmap(stack, PAGE_SIZE) < 0)
   1.218 ++		panic("check_ptrace : munmap failed, errno = %d", errno);
   1.219 + 	return ret;
   1.220 + }
   1.221 + 
   1.222 +@@ -227,11 +234,12 @@ __uml_setup("nosysemu", nosysemu_cmd_par
   1.223 + 
   1.224 + static void __init check_sysemu(void)
   1.225 + {
   1.226 ++	void *stack;
   1.227 + 	int pid, syscall, n, status, count=0;
   1.228 + 
   1.229 + 	printk("Checking syscall emulation patch for ptrace...");
   1.230 + 	sysemu_supported = 0;
   1.231 +-	pid = start_ptraced_child();
   1.232 ++	pid = start_ptraced_child(&stack);
   1.233 + 
   1.234 + 	if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0)
   1.235 + 		goto fail;
   1.236 +@@ -249,7 +257,7 @@ static void __init check_sysemu(void)
   1.237 + 		panic("check_sysemu : failed to modify system "
   1.238 + 		      "call return, errno = %d", errno);
   1.239 + 
   1.240 +-	if (stop_ptraced_child(pid, 0, 0) < 0)
   1.241 ++	if (stop_ptraced_child(pid, stack, 0, 0) < 0)
   1.242 + 		goto fail_stopped;
   1.243 + 
   1.244 + 	sysemu_supported = 1;
   1.245 +@@ -257,7 +265,7 @@ static void __init check_sysemu(void)
   1.246 + 	set_using_sysemu(!force_sysemu_disabled);
   1.247 + 
   1.248 + 	printk("Checking advanced syscall emulation patch for ptrace...");
   1.249 +-	pid = start_ptraced_child();
   1.250 ++	pid = start_ptraced_child(&stack);
   1.251 + 	while(1){
   1.252 + 		count++;
   1.253 + 		if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0)
   1.254 +@@ -282,7 +290,7 @@ static void __init check_sysemu(void)
   1.255 + 			break;
   1.256 + 		}
   1.257 + 	}
   1.258 +-	if (stop_ptraced_child(pid, 0, 0) < 0)
   1.259 ++	if (stop_ptraced_child(pid, stack, 0, 0) < 0)
   1.260 + 		goto fail_stopped;
   1.261 + 
   1.262 + 	sysemu_supported = 2;
   1.263 +@@ -293,17 +301,18 @@ static void __init check_sysemu(void)
   1.264 + 	return;
   1.265 + 
   1.266 + fail:
   1.267 +-	stop_ptraced_child(pid, 1, 0);
   1.268 ++	stop_ptraced_child(pid, stack, 1, 0);
   1.269 + fail_stopped:
   1.270 + 	printk("missing\n");
   1.271 + }
   1.272 + 
   1.273 + void __init check_ptrace(void)
   1.274 + {
   1.275 ++	void *stack;
   1.276 + 	int pid, syscall, n, status;
   1.277 + 
   1.278 + 	printk("Checking that ptrace can change system call numbers...");
   1.279 +-	pid = start_ptraced_child();
   1.280 ++	pid = start_ptraced_child(&stack);
   1.281 + 
   1.282 + 	if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
   1.283 + 		panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
   1.284 +@@ -330,7 +339,7 @@ void __init check_ptrace(void)
   1.285 + 			break;
   1.286 + 		}
   1.287 + 	}
   1.288 +-	stop_ptraced_child(pid, 0, 1);
   1.289 ++	stop_ptraced_child(pid, stack, 0, 1);
   1.290 + 	printk("OK\n");
   1.291 + 	check_sysemu();
   1.292 + }
   1.293 +@@ -362,10 +371,11 @@ void forward_pending_sigio(int target)
   1.294 + static inline int check_skas3_ptrace_support(void)
   1.295 + {
   1.296 + 	struct ptrace_faultinfo fi;
   1.297 ++	void *stack;
   1.298 + 	int pid, n, ret = 1;
   1.299 + 
   1.300 + 	printf("Checking for the skas3 patch in the host...");
   1.301 +-	pid = start_ptraced_child();
   1.302 ++	pid = start_ptraced_child(&stack);
   1.303 + 
   1.304 + 	n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
   1.305 + 	if (n < 0) {
   1.306 +@@ -380,7 +390,7 @@ static inline int check_skas3_ptrace_sup
   1.307 + 	}
   1.308 + 
   1.309 + 	init_registers(pid);
   1.310 +-	stop_ptraced_child(pid, 1, 1);
   1.311 ++	stop_ptraced_child(pid, stack, 1, 1);
   1.312 + 
   1.313 + 	return(ret);
   1.314 + }
   1.315 +diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
   1.316 +--- a/drivers/acpi/pci_irq.c
   1.317 ++++ b/drivers/acpi/pci_irq.c
   1.318 +@@ -433,8 +433,9 @@ acpi_pci_irq_enable (
   1.319 + 		printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: no GSI",
   1.320 + 			pci_name(dev), ('A' + pin));
   1.321 + 		/* Interrupt Line values above 0xF are forbidden */
   1.322 +-		if (dev->irq >= 0 && (dev->irq <= 0xF)) {
   1.323 ++		if (dev->irq > 0 && (dev->irq <= 0xF)) {
   1.324 + 			printk(" - using IRQ %d\n", dev->irq);
   1.325 ++			acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW);
   1.326 + 			return_VALUE(0);
   1.327 + 		}
   1.328 + 		else {
   1.329 +diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
   1.330 +--- a/drivers/char/tpm/tpm.c
   1.331 ++++ b/drivers/char/tpm/tpm.c
   1.332 +@@ -32,12 +32,6 @@
   1.333 + 
   1.334 + #define	TPM_BUFSIZE			2048
   1.335 + 
   1.336 +-/* PCI configuration addresses */
   1.337 +-#define	PCI_GEN_PMCON_1			0xA0
   1.338 +-#define	PCI_GEN1_DEC			0xE4
   1.339 +-#define	PCI_LPC_EN			0xE6
   1.340 +-#define	PCI_GEN2_DEC			0xEC
   1.341 +-
   1.342 + static LIST_HEAD(tpm_chip_list);
   1.343 + static DEFINE_SPINLOCK(driver_lock);
   1.344 + static int dev_mask[32];
   1.345 +@@ -61,72 +55,6 @@ void tpm_time_expired(unsigned long ptr)
   1.346 + EXPORT_SYMBOL_GPL(tpm_time_expired);
   1.347 + 
   1.348 + /*
   1.349 +- * Initialize the LPC bus and enable the TPM ports
   1.350 +- */
   1.351 +-int tpm_lpc_bus_init(struct pci_dev *pci_dev, u16 base)
   1.352 +-{
   1.353 +-	u32 lpcenable, tmp;
   1.354 +-	int is_lpcm = 0;
   1.355 +-
   1.356 +-	switch (pci_dev->vendor) {
   1.357 +-	case PCI_VENDOR_ID_INTEL:
   1.358 +-		switch (pci_dev->device) {
   1.359 +-		case PCI_DEVICE_ID_INTEL_82801CA_12:
   1.360 +-		case PCI_DEVICE_ID_INTEL_82801DB_12:
   1.361 +-			is_lpcm = 1;
   1.362 +-			break;
   1.363 +-		}
   1.364 +-		/* init ICH (enable LPC) */
   1.365 +-		pci_read_config_dword(pci_dev, PCI_GEN1_DEC, &lpcenable);
   1.366 +-		lpcenable |= 0x20000000;
   1.367 +-		pci_write_config_dword(pci_dev, PCI_GEN1_DEC, lpcenable);
   1.368 +-
   1.369 +-		if (is_lpcm) {
   1.370 +-			pci_read_config_dword(pci_dev, PCI_GEN1_DEC,
   1.371 +-					      &lpcenable);
   1.372 +-			if ((lpcenable & 0x20000000) == 0) {
   1.373 +-				dev_err(&pci_dev->dev,
   1.374 +-					"cannot enable LPC\n");
   1.375 +-				return -ENODEV;
   1.376 +-			}
   1.377 +-		}
   1.378 +-
   1.379 +-		/* initialize TPM registers */
   1.380 +-		pci_read_config_dword(pci_dev, PCI_GEN2_DEC, &tmp);
   1.381 +-
   1.382 +-		if (!is_lpcm)
   1.383 +-			tmp = (tmp & 0xFFFF0000) | (base & 0xFFF0);
   1.384 +-		else
   1.385 +-			tmp =
   1.386 +-			    (tmp & 0xFFFF0000) | (base & 0xFFF0) |
   1.387 +-			    0x00000001;
   1.388 +-
   1.389 +-		pci_write_config_dword(pci_dev, PCI_GEN2_DEC, tmp);
   1.390 +-
   1.391 +-		if (is_lpcm) {
   1.392 +-			pci_read_config_dword(pci_dev, PCI_GEN_PMCON_1,
   1.393 +-					      &tmp);
   1.394 +-			tmp |= 0x00000004;	/* enable CLKRUN */
   1.395 +-			pci_write_config_dword(pci_dev, PCI_GEN_PMCON_1,
   1.396 +-					       tmp);
   1.397 +-		}
   1.398 +-		tpm_write_index(0x0D, 0x55);	/* unlock 4F */
   1.399 +-		tpm_write_index(0x0A, 0x00);	/* int disable */
   1.400 +-		tpm_write_index(0x08, base);	/* base addr lo */
   1.401 +-		tpm_write_index(0x09, (base & 0xFF00) >> 8);	/* base addr hi */
   1.402 +-		tpm_write_index(0x0D, 0xAA);	/* lock 4F */
   1.403 +-		break;
   1.404 +-	case PCI_VENDOR_ID_AMD:
   1.405 +-		/* nothing yet */
   1.406 +-		break;
   1.407 +-	}
   1.408 +-
   1.409 +-	return 0;
   1.410 +-}
   1.411 +-
   1.412 +-EXPORT_SYMBOL_GPL(tpm_lpc_bus_init);
   1.413 +-
   1.414 +-/*
   1.415 +  * Internal kernel interface to transmit TPM commands
   1.416 +  */
   1.417 + static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
   1.418 +@@ -590,10 +518,6 @@ int tpm_pm_resume(struct pci_dev *pci_de
   1.419 + 	if (chip == NULL)
   1.420 + 		return -ENODEV;
   1.421 + 
   1.422 +-	spin_lock(&driver_lock);
   1.423 +-	tpm_lpc_bus_init(pci_dev, chip->vendor->base);
   1.424 +-	spin_unlock(&driver_lock);
   1.425 +-
   1.426 + 	return 0;
   1.427 + }
   1.428 + 
   1.429 +diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
   1.430 +--- a/drivers/char/tpm/tpm.h
   1.431 ++++ b/drivers/char/tpm/tpm.h
   1.432 +@@ -79,8 +79,6 @@ static inline void tpm_write_index(int i
   1.433 + }
   1.434 + 
   1.435 + extern void tpm_time_expired(unsigned long);
   1.436 +-extern int tpm_lpc_bus_init(struct pci_dev *, u16);
   1.437 +-
   1.438 + extern int tpm_register_hardware(struct pci_dev *,
   1.439 + 				 struct tpm_vendor_specific *);
   1.440 + extern int tpm_open(struct inode *, struct file *);
   1.441 +diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c
   1.442 +--- a/drivers/char/tpm/tpm_atmel.c
   1.443 ++++ b/drivers/char/tpm/tpm_atmel.c
   1.444 +@@ -22,7 +22,10 @@
   1.445 + #include "tpm.h"
   1.446 + 
   1.447 + /* Atmel definitions */
   1.448 +-#define	TPM_ATML_BASE			0x400
   1.449 ++enum tpm_atmel_addr {
   1.450 ++	TPM_ATMEL_BASE_ADDR_LO = 0x08,
   1.451 ++	TPM_ATMEL_BASE_ADDR_HI = 0x09
   1.452 ++};
   1.453 + 
   1.454 + /* write status bits */
   1.455 + #define	ATML_STATUS_ABORT		0x01
   1.456 +@@ -127,7 +130,6 @@ static struct tpm_vendor_specific tpm_at
   1.457 + 	.cancel = tpm_atml_cancel,
   1.458 + 	.req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL,
   1.459 + 	.req_complete_val = ATML_STATUS_DATA_AVAIL,
   1.460 +-	.base = TPM_ATML_BASE,
   1.461 + 	.miscdev = { .fops = &atmel_ops, },
   1.462 + };
   1.463 + 
   1.464 +@@ -136,14 +138,16 @@ static int __devinit tpm_atml_init(struc
   1.465 + {
   1.466 + 	u8 version[4];
   1.467 + 	int rc = 0;
   1.468 ++	int lo, hi;
   1.469 + 
   1.470 + 	if (pci_enable_device(pci_dev))
   1.471 + 		return -EIO;
   1.472 + 
   1.473 +-	if (tpm_lpc_bus_init(pci_dev, TPM_ATML_BASE)) {
   1.474 +-		rc = -ENODEV;
   1.475 +-		goto out_err;
   1.476 +-	}
   1.477 ++	lo = tpm_read_index( TPM_ATMEL_BASE_ADDR_LO );
   1.478 ++	hi = tpm_read_index( TPM_ATMEL_BASE_ADDR_HI );
   1.479 ++
   1.480 ++	tpm_atmel.base = (hi<<8)|lo;
   1.481 ++	dev_dbg( &pci_dev->dev, "Operating with base: 0x%x\n", tpm_atmel.base);
   1.482 + 
   1.483 + 	/* verify that it is an Atmel part */
   1.484 + 	if (tpm_read_index(4) != 'A' || tpm_read_index(5) != 'T'
   1.485 +diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c
   1.486 +--- a/drivers/char/tpm/tpm_nsc.c
   1.487 ++++ b/drivers/char/tpm/tpm_nsc.c
   1.488 +@@ -24,6 +24,10 @@
   1.489 + /* National definitions */
   1.490 + #define	TPM_NSC_BASE			0x360
   1.491 + #define	TPM_NSC_IRQ			0x07
   1.492 ++#define	TPM_NSC_BASE0_HI		0x60
   1.493 ++#define	TPM_NSC_BASE0_LO		0x61
   1.494 ++#define	TPM_NSC_BASE1_HI		0x62
   1.495 ++#define	TPM_NSC_BASE1_LO		0x63
   1.496 + 
   1.497 + #define	NSC_LDN_INDEX			0x07
   1.498 + #define	NSC_SID_INDEX			0x20
   1.499 +@@ -234,7 +238,6 @@ static struct tpm_vendor_specific tpm_ns
   1.500 + 	.cancel = tpm_nsc_cancel,
   1.501 + 	.req_complete_mask = NSC_STATUS_OBF,
   1.502 + 	.req_complete_val = NSC_STATUS_OBF,
   1.503 +-	.base = TPM_NSC_BASE,
   1.504 + 	.miscdev = { .fops = &nsc_ops, },
   1.505 + 	
   1.506 + };
   1.507 +@@ -243,15 +246,16 @@ static int __devinit tpm_nsc_init(struct
   1.508 + 				  const struct pci_device_id *pci_id)
   1.509 + {
   1.510 + 	int rc = 0;
   1.511 ++	int lo, hi;
   1.512 ++
   1.513 ++	hi = tpm_read_index(TPM_NSC_BASE0_HI);
   1.514 ++	lo = tpm_read_index(TPM_NSC_BASE0_LO);
   1.515 ++
   1.516 ++	tpm_nsc.base = (hi<<8) | lo;
   1.517 + 
   1.518 + 	if (pci_enable_device(pci_dev))
   1.519 + 		return -EIO;
   1.520 + 
   1.521 +-	if (tpm_lpc_bus_init(pci_dev, TPM_NSC_BASE)) {
   1.522 +-		rc = -ENODEV;
   1.523 +-		goto out_err;
   1.524 +-	}
   1.525 +-
   1.526 + 	/* verify that it is a National part (SID) */
   1.527 + 	if (tpm_read_index(NSC_SID_INDEX) != 0xEF) {
   1.528 + 		rc = -ENODEV;
   1.529 +diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
   1.530 +--- a/drivers/char/tty_ioctl.c
   1.531 ++++ b/drivers/char/tty_ioctl.c
   1.532 +@@ -476,11 +476,11 @@ int n_tty_ioctl(struct tty_struct * tty,
   1.533 + 			ld = tty_ldisc_ref(tty);
   1.534 + 			switch (arg) {
   1.535 + 			case TCIFLUSH:
   1.536 +-				if (ld->flush_buffer)
   1.537 ++				if (ld && ld->flush_buffer)
   1.538 + 					ld->flush_buffer(tty);
   1.539 + 				break;
   1.540 + 			case TCIOFLUSH:
   1.541 +-				if (ld->flush_buffer)
   1.542 ++				if (ld && ld->flush_buffer)
   1.543 + 					ld->flush_buffer(tty);
   1.544 + 				/* fall through */
   1.545 + 			case TCOFLUSH:
   1.546 +diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c
   1.547 +--- a/drivers/media/video/cx88/cx88-video.c
   1.548 ++++ b/drivers/media/video/cx88/cx88-video.c
   1.549 +@@ -261,7 +261,7 @@ static struct cx88_ctrl cx8800_ctls[] = 
   1.550 + 			.default_value = 0,
   1.551 + 			.type          = V4L2_CTRL_TYPE_INTEGER,
   1.552 + 		},
   1.553 +-		.off                   = 0,
   1.554 ++		.off                   = 128,
   1.555 + 		.reg                   = MO_HUE,
   1.556 + 		.mask                  = 0x00ff,
   1.557 + 		.shift                 = 0,
   1.558 +diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
   1.559 +--- a/drivers/net/e1000/e1000_main.c
   1.560 ++++ b/drivers/net/e1000/e1000_main.c
   1.561 +@@ -2307,6 +2307,7 @@ e1000_xmit_frame(struct sk_buff *skb, st
   1.562 + 	tso = e1000_tso(adapter, skb);
   1.563 + 	if (tso < 0) {
   1.564 + 		dev_kfree_skb_any(skb);
   1.565 ++		spin_unlock_irqrestore(&adapter->tx_lock, flags);
   1.566 + 		return NETDEV_TX_OK;
   1.567 + 	}
   1.568 + 
   1.569 +diff --git a/drivers/net/hamradio/Kconfig b/drivers/net/hamradio/Kconfig
   1.570 +--- a/drivers/net/hamradio/Kconfig
   1.571 ++++ b/drivers/net/hamradio/Kconfig
   1.572 +@@ -17,7 +17,7 @@ config MKISS
   1.573 + 
   1.574 + config 6PACK
   1.575 + 	tristate "Serial port 6PACK driver"
   1.576 +-	depends on AX25 && BROKEN_ON_SMP
   1.577 ++	depends on AX25
   1.578 + 	---help---
   1.579 + 	  6pack is a transmission protocol for the data exchange between your
   1.580 + 	  PC and your TNC (the Terminal Node Controller acts as a kind of
   1.581 +diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c
   1.582 +--- a/drivers/net/shaper.c
   1.583 ++++ b/drivers/net/shaper.c
   1.584 +@@ -135,10 +135,8 @@ static int shaper_start_xmit(struct sk_b
   1.585 + {
   1.586 + 	struct shaper *shaper = dev->priv;
   1.587 +  	struct sk_buff *ptr;
   1.588 +-   
   1.589 +-	if (down_trylock(&shaper->sem))
   1.590 +-		return -1;
   1.591 + 
   1.592 ++	spin_lock(&shaper->lock);
   1.593 +  	ptr=shaper->sendq.prev;
   1.594 +  	
   1.595 +  	/*
   1.596 +@@ -232,7 +230,7 @@ static int shaper_start_xmit(struct sk_b
   1.597 +                 shaper->stats.collisions++;
   1.598 +  	}
   1.599 + 	shaper_kick(shaper);
   1.600 +-	up(&shaper->sem);
   1.601 ++	spin_unlock(&shaper->lock);
   1.602 +  	return 0;
   1.603 + }
   1.604 + 
   1.605 +@@ -271,11 +269,9 @@ static void shaper_timer(unsigned long d
   1.606 + {
   1.607 + 	struct shaper *shaper = (struct shaper *)data;
   1.608 + 
   1.609 +-	if (!down_trylock(&shaper->sem)) {
   1.610 +-		shaper_kick(shaper);
   1.611 +-		up(&shaper->sem);
   1.612 +-	} else
   1.613 +-		mod_timer(&shaper->timer, jiffies);
   1.614 ++	spin_lock(&shaper->lock);
   1.615 ++	shaper_kick(shaper);
   1.616 ++	spin_unlock(&shaper->lock);
   1.617 + }
   1.618 + 
   1.619 + /*
   1.620 +@@ -332,21 +328,6 @@ static void shaper_kick(struct shaper *s
   1.621 + 
   1.622 + 
   1.623 + /*
   1.624 +- *	Flush the shaper queues on a closedown
   1.625 +- */
   1.626 +- 
   1.627 +-static void shaper_flush(struct shaper *shaper)
   1.628 +-{
   1.629 +-	struct sk_buff *skb;
   1.630 +-
   1.631 +-	down(&shaper->sem);
   1.632 +-	while((skb=skb_dequeue(&shaper->sendq))!=NULL)
   1.633 +-		dev_kfree_skb(skb);
   1.634 +-	shaper_kick(shaper);
   1.635 +-	up(&shaper->sem);
   1.636 +-}
   1.637 +-
   1.638 +-/*
   1.639 +  *	Bring the interface up. We just disallow this until a 
   1.640 +  *	bind.
   1.641 +  */
   1.642 +@@ -375,7 +356,15 @@ static int shaper_open(struct net_device
   1.643 + static int shaper_close(struct net_device *dev)
   1.644 + {
   1.645 + 	struct shaper *shaper=dev->priv;
   1.646 +-	shaper_flush(shaper);
   1.647 ++	struct sk_buff *skb;
   1.648 ++
   1.649 ++	while ((skb = skb_dequeue(&shaper->sendq)) != NULL)
   1.650 ++		dev_kfree_skb(skb);
   1.651 ++
   1.652 ++	spin_lock_bh(&shaper->lock);
   1.653 ++	shaper_kick(shaper);
   1.654 ++	spin_unlock_bh(&shaper->lock);
   1.655 ++
   1.656 + 	del_timer_sync(&shaper->timer);
   1.657 + 	return 0;
   1.658 + }
   1.659 +@@ -576,6 +565,7 @@ static void shaper_init_priv(struct net_
   1.660 + 	init_timer(&sh->timer);
   1.661 + 	sh->timer.function=shaper_timer;
   1.662 + 	sh->timer.data=(unsigned long)sh;
   1.663 ++	spin_lock_init(&sh->lock);
   1.664 + }
   1.665 + 
   1.666 + /*
   1.667 +diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
   1.668 +--- a/drivers/pci/pci-driver.c
   1.669 ++++ b/drivers/pci/pci-driver.c
   1.670 +@@ -396,7 +396,7 @@ int pci_register_driver(struct pci_drive
   1.671 + 	/* FIXME, once all of the existing PCI drivers have been fixed to set
   1.672 + 	 * the pci shutdown function, this test can go away. */
   1.673 + 	if (!drv->driver.shutdown)
   1.674 +-		drv->driver.shutdown = pci_device_shutdown,
   1.675 ++		drv->driver.shutdown = pci_device_shutdown;
   1.676 + 	drv->driver.owner = drv->owner;
   1.677 + 	drv->driver.kobj.ktype = &pci_driver_kobj_type;
   1.678 + 	pci_init_dynids(&drv->dynids);
   1.679 +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
   1.680 +--- a/drivers/scsi/qla2xxx/qla_os.c
   1.681 ++++ b/drivers/scsi/qla2xxx/qla_os.c
   1.682 +@@ -1150,7 +1150,7 @@ iospace_error_exit:
   1.683 +  */
   1.684 + int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
   1.685 + {
   1.686 +-	int	ret;
   1.687 ++	int	ret = -ENODEV;
   1.688 + 	device_reg_t __iomem *reg;
   1.689 + 	struct Scsi_Host *host;
   1.690 + 	scsi_qla_host_t *ha;
   1.691 +@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.692 + 	fc_port_t *fcport;
   1.693 + 
   1.694 + 	if (pci_enable_device(pdev))
   1.695 +-		return -1;
   1.696 ++		goto probe_out;
   1.697 + 
   1.698 + 	host = scsi_host_alloc(&qla2x00_driver_template,
   1.699 + 	    sizeof(scsi_qla_host_t));
   1.700 +@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.701 + 
   1.702 + 	/* Configure PCI I/O space */
   1.703 + 	ret = qla2x00_iospace_config(ha);
   1.704 +-	if (ret != 0) {
   1.705 +-		goto probe_alloc_failed;
   1.706 +-	}
   1.707 ++	if (ret)
   1.708 ++		goto probe_failed;
   1.709 + 
   1.710 + 	/* Sanitize the information from PCI BIOS. */
   1.711 + 	host->irq = pdev->irq;
   1.712 +@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.713 + 		qla_printk(KERN_WARNING, ha,
   1.714 + 		    "[ERROR] Failed to allocate memory for adapter\n");
   1.715 + 
   1.716 +-		goto probe_alloc_failed;
   1.717 ++		ret = -ENOMEM;
   1.718 ++		goto probe_failed;
   1.719 + 	}
   1.720 + 
   1.721 +-	pci_set_drvdata(pdev, ha);
   1.722 +-	host->this_id = 255;
   1.723 +-	host->cmd_per_lun = 3;
   1.724 +-	host->unique_id = ha->instance;
   1.725 +-	host->max_cmd_len = MAX_CMDSZ;
   1.726 +-	host->max_channel = ha->ports - 1;
   1.727 +-	host->max_id = ha->max_targets;
   1.728 +-	host->max_lun = ha->max_luns;
   1.729 +-	host->transportt = qla2xxx_transport_template;
   1.730 +-	if (scsi_add_host(host, &pdev->dev))
   1.731 +-		goto probe_alloc_failed;
   1.732 +-
   1.733 +-	qla2x00_alloc_sysfs_attr(ha);
   1.734 +-
   1.735 + 	if (qla2x00_initialize_adapter(ha) &&
   1.736 + 	    !(ha->device_flags & DFLG_NO_CABLE)) {
   1.737 + 
   1.738 +@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.739 + 		    "Adapter flags %x.\n",
   1.740 + 		    ha->host_no, ha->device_flags));
   1.741 + 
   1.742 ++		ret = -ENODEV;
   1.743 + 		goto probe_failed;
   1.744 + 	}
   1.745 + 
   1.746 +-	qla2x00_init_host_attr(ha);
   1.747 +-
   1.748 + 	/*
   1.749 + 	 * Startup the kernel thread for this host adapter
   1.750 + 	 */
   1.751 +@@ -1299,17 +1284,26 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.752 + 		qla_printk(KERN_WARNING, ha,
   1.753 + 		    "Unable to start DPC thread!\n");
   1.754 + 
   1.755 ++		ret = -ENODEV;
   1.756 + 		goto probe_failed;
   1.757 + 	}
   1.758 + 	wait_for_completion(&ha->dpc_inited);
   1.759 + 
   1.760 ++	host->this_id = 255;
   1.761 ++	host->cmd_per_lun = 3;
   1.762 ++	host->unique_id = ha->instance;
   1.763 ++	host->max_cmd_len = MAX_CMDSZ;
   1.764 ++	host->max_channel = ha->ports - 1;
   1.765 ++	host->max_lun = MAX_LUNS;
   1.766 ++	host->transportt = qla2xxx_transport_template;
   1.767 ++
   1.768 + 	if (IS_QLA2100(ha) || IS_QLA2200(ha))
   1.769 + 		ret = request_irq(host->irq, qla2100_intr_handler,
   1.770 + 		    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
   1.771 + 	else
   1.772 + 		ret = request_irq(host->irq, qla2300_intr_handler,
   1.773 + 		    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
   1.774 +-	if (ret != 0) {
   1.775 ++	if (ret) {
   1.776 + 		qla_printk(KERN_WARNING, ha,
   1.777 + 		    "Failed to reserve interrupt %d already in use.\n",
   1.778 + 		    host->irq);
   1.779 +@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.780 + 		msleep(10);
   1.781 + 	}
   1.782 + 
   1.783 ++	pci_set_drvdata(pdev, ha);
   1.784 + 	ha->flags.init_done = 1;
   1.785 + 	num_hosts++;
   1.786 + 
   1.787 ++	ret = scsi_add_host(host, &pdev->dev);
   1.788 ++	if (ret)
   1.789 ++		goto probe_failed;
   1.790 ++
   1.791 ++	qla2x00_alloc_sysfs_attr(ha);
   1.792 ++
   1.793 ++	qla2x00_init_host_attr(ha);
   1.794 ++
   1.795 + 	qla_printk(KERN_INFO, ha, "\n"
   1.796 + 	    " QLogic Fibre Channel HBA Driver: %s\n"
   1.797 + 	    "  QLogic %s - %s\n"
   1.798 +@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pd
   1.799 + probe_failed:
   1.800 + 	fc_remove_host(ha->host);
   1.801 + 
   1.802 +-	scsi_remove_host(host);
   1.803 +-
   1.804 +-probe_alloc_failed:
   1.805 + 	qla2x00_free_device(ha);
   1.806 + 
   1.807 + 	scsi_host_put(host);
   1.808 +@@ -1394,7 +1394,8 @@ probe_alloc_failed:
   1.809 + probe_disable_device:
   1.810 + 	pci_disable_device(pdev);
   1.811 + 
   1.812 +-	return -1;
   1.813 ++probe_out:
   1.814 ++	return ret;
   1.815 + }
   1.816 + EXPORT_SYMBOL_GPL(qla2x00_probe_one);
   1.817 + 
   1.818 +diff --git a/fs/char_dev.c b/fs/char_dev.c
   1.819 +--- a/fs/char_dev.c
   1.820 ++++ b/fs/char_dev.c
   1.821 +@@ -139,7 +139,7 @@ __unregister_chrdev_region(unsigned majo
   1.822 + 	struct char_device_struct *cd = NULL, **cp;
   1.823 + 	int i = major_to_index(major);
   1.824 + 
   1.825 +-	up(&chrdevs_lock);
   1.826 ++	down(&chrdevs_lock);
   1.827 + 	for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
   1.828 + 		if ((*cp)->major == major &&
   1.829 + 		    (*cp)->baseminor == baseminor &&
   1.830 +diff --git a/fs/exec.c b/fs/exec.c
   1.831 +--- a/fs/exec.c
   1.832 ++++ b/fs/exec.c
   1.833 +@@ -649,6 +649,7 @@ static inline int de_thread(struct task_
   1.834 + 	}
   1.835 + 	sig->group_exit_task = NULL;
   1.836 + 	sig->notify_count = 0;
   1.837 ++	sig->real_timer.data = (unsigned long)current;
   1.838 + 	spin_unlock_irq(lock);
   1.839 + 
   1.840 + 	/*
   1.841 +diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h
   1.842 +--- a/include/asm-i386/string.h
   1.843 ++++ b/include/asm-i386/string.h
   1.844 +@@ -116,7 +116,8 @@ __asm__ __volatile__(
   1.845 + 	"orb $1,%%al\n"
   1.846 + 	"3:"
   1.847 + 	:"=a" (__res), "=&S" (d0), "=&D" (d1)
   1.848 +-		     :"1" (cs),"2" (ct));
   1.849 ++	:"1" (cs),"2" (ct)
   1.850 ++	:"memory");
   1.851 + return __res;
   1.852 + }
   1.853 + 
   1.854 +@@ -138,8 +139,9 @@ __asm__ __volatile__(
   1.855 + 	"3:\tsbbl %%eax,%%eax\n\t"
   1.856 + 	"orb $1,%%al\n"
   1.857 + 	"4:"
   1.858 +-		     :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
   1.859 +-		     :"1" (cs),"2" (ct),"3" (count));
   1.860 ++	:"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
   1.861 ++	:"1" (cs),"2" (ct),"3" (count)
   1.862 ++	:"memory");
   1.863 + return __res;
   1.864 + }
   1.865 + 
   1.866 +@@ -158,7 +160,9 @@ __asm__ __volatile__(
   1.867 + 	"movl $1,%1\n"
   1.868 + 	"2:\tmovl %1,%0\n\t"
   1.869 + 	"decl %0"
   1.870 +-	:"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
   1.871 ++	:"=a" (__res), "=&S" (d0)
   1.872 ++	:"1" (s),"0" (c)
   1.873 ++	:"memory");
   1.874 + return __res;
   1.875 + }
   1.876 + 
   1.877 +@@ -175,7 +179,9 @@ __asm__ __volatile__(
   1.878 + 	"leal -1(%%esi),%0\n"
   1.879 + 	"2:\ttestb %%al,%%al\n\t"
   1.880 + 	"jne 1b"
   1.881 +-	:"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c));
   1.882 ++	:"=g" (__res), "=&S" (d0), "=&a" (d1)
   1.883 ++	:"0" (0),"1" (s),"2" (c)
   1.884 ++	:"memory");
   1.885 + return __res;
   1.886 + }
   1.887 + 
   1.888 +@@ -189,7 +195,9 @@ __asm__ __volatile__(
   1.889 + 	"scasb\n\t"
   1.890 + 	"notl %0\n\t"
   1.891 + 	"decl %0"
   1.892 +-	:"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu));
   1.893 ++	:"=c" (__res), "=&D" (d0)
   1.894 ++	:"1" (s),"a" (0), "0" (0xffffffffu)
   1.895 ++	:"memory");
   1.896 + return __res;
   1.897 + }
   1.898 + 
   1.899 +@@ -333,7 +341,9 @@ __asm__ __volatile__(
   1.900 + 	"je 1f\n\t"
   1.901 + 	"movl $1,%0\n"
   1.902 + 	"1:\tdecl %0"
   1.903 +-	:"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count));
   1.904 ++	:"=D" (__res), "=&c" (d0)
   1.905 ++	:"a" (c),"0" (cs),"1" (count)
   1.906 ++	:"memory");
   1.907 + return __res;
   1.908 + }
   1.909 + 
   1.910 +@@ -369,7 +379,7 @@ __asm__ __volatile__(
   1.911 + 	"je 2f\n\t"
   1.912 + 	"stosb\n"
   1.913 + 	"2:"
   1.914 +-	: "=&c" (d0), "=&D" (d1)
   1.915 ++	:"=&c" (d0), "=&D" (d1)
   1.916 + 	:"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
   1.917 + 	:"memory");
   1.918 + return (s);	
   1.919 +@@ -392,7 +402,8 @@ __asm__ __volatile__(
   1.920 + 	"jne 1b\n"
   1.921 + 	"3:\tsubl %2,%0"
   1.922 + 	:"=a" (__res), "=&d" (d0)
   1.923 +-	:"c" (s),"1" (count));
   1.924 ++	:"c" (s),"1" (count)
   1.925 ++	:"memory");
   1.926 + return __res;
   1.927 + }
   1.928 + /* end of additional stuff */
   1.929 +@@ -473,7 +484,8 @@ static inline void * memscan(void * addr
   1.930 + 		"dec %%edi\n"
   1.931 + 		"1:"
   1.932 + 		: "=D" (addr), "=c" (size)
   1.933 +-		: "0" (addr), "1" (size), "a" (c));
   1.934 ++		: "0" (addr), "1" (size), "a" (c)
   1.935 ++		: "memory");
   1.936 + 	return addr;
   1.937 + }
   1.938 + 
   1.939 +diff --git a/include/linux/if_shaper.h b/include/linux/if_shaper.h
   1.940 +--- a/include/linux/if_shaper.h
   1.941 ++++ b/include/linux/if_shaper.h
   1.942 +@@ -23,7 +23,7 @@ struct shaper
   1.943 + 	__u32 shapeclock;
   1.944 + 	unsigned long recovery;	/* Time we can next clock a packet out on
   1.945 + 				   an empty queue */
   1.946 +-	struct semaphore sem;
   1.947 ++	spinlock_t lock;
   1.948 +         struct net_device_stats stats;
   1.949 + 	struct net_device *dev;
   1.950 + 	int  (*hard_start_xmit) (struct sk_buff *skb,
   1.951 +diff --git a/mm/memory.c b/mm/memory.c
   1.952 +--- a/mm/memory.c
   1.953 ++++ b/mm/memory.c
   1.954 +@@ -1164,7 +1164,7 @@ int remap_pfn_range(struct vm_area_struc
   1.955 + {
   1.956 + 	pgd_t *pgd;
   1.957 + 	unsigned long next;
   1.958 +-	unsigned long end = addr + size;
   1.959 ++	unsigned long end = addr + PAGE_ALIGN(size);
   1.960 + 	struct mm_struct *mm = vma->vm_mm;
   1.961 + 	int err;
   1.962 + 
   1.963 +diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
   1.964 +--- a/net/ipv4/ip_output.c
   1.965 ++++ b/net/ipv4/ip_output.c
   1.966 +@@ -111,7 +111,6 @@ static int ip_dev_loopback_xmit(struct s
   1.967 + #ifdef CONFIG_NETFILTER_DEBUG
   1.968 + 	nf_debug_ip_loopback_xmit(newskb);
   1.969 + #endif
   1.970 +-	nf_reset(newskb);
   1.971 + 	netif_rx(newskb);
   1.972 + 	return 0;
   1.973 + }
   1.974 +@@ -196,8 +195,6 @@ static inline int ip_finish_output2(stru
   1.975 + 	nf_debug_ip_finish_output2(skb);
   1.976 + #endif /*CONFIG_NETFILTER_DEBUG*/
   1.977 + 
   1.978 +-	nf_reset(skb);
   1.979 +-
   1.980 + 	if (hh) {
   1.981 + 		int hh_alen;
   1.982 + 
   1.983 +diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c
   1.984 +--- a/net/ipv4/netfilter/ip_conntrack_standalone.c
   1.985 ++++ b/net/ipv4/netfilter/ip_conntrack_standalone.c
   1.986 +@@ -432,6 +432,13 @@ static unsigned int ip_conntrack_defrag(
   1.987 + 				        const struct net_device *out,
   1.988 + 				        int (*okfn)(struct sk_buff *))
   1.989 + {
   1.990 ++#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE)
   1.991 ++	/* Previously seen (loopback)?  Ignore.  Do this before
   1.992 ++           fragment check. */
   1.993 ++	if ((*pskb)->nfct)
   1.994 ++		return NF_ACCEPT;
   1.995 ++#endif
   1.996 ++
   1.997 + 	/* Gather fragments. */
   1.998 + 	if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
   1.999 + 		*pskb = ip_ct_gather_frags(*pskb,
  1.1000 +diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
  1.1001 +--- a/net/netlink/af_netlink.c
  1.1002 ++++ b/net/netlink/af_netlink.c
  1.1003 +@@ -315,8 +315,8 @@ err:
  1.1004 + static void netlink_remove(struct sock *sk)
  1.1005 + {
  1.1006 + 	netlink_table_grab();
  1.1007 +-	nl_table[sk->sk_protocol].hash.entries--;
  1.1008 +-	sk_del_node_init(sk);
  1.1009 ++	if (sk_del_node_init(sk))
  1.1010 ++		nl_table[sk->sk_protocol].hash.entries--;
  1.1011 + 	if (nlk_sk(sk)->groups)
  1.1012 + 		__sk_del_bind_node(sk);
  1.1013 + 	netlink_table_ungrab();
  1.1014 +@@ -429,7 +429,12 @@ retry:
  1.1015 + 	err = netlink_insert(sk, pid);
  1.1016 + 	if (err == -EADDRINUSE)
  1.1017 + 		goto retry;
  1.1018 +-	return 0;
  1.1019 ++
  1.1020 ++	/* If 2 threads race to autobind, that is fine.  */
  1.1021 ++	if (err == -EBUSY)
  1.1022 ++		err = 0;
  1.1023 ++
  1.1024 ++	return err;
  1.1025 + }
  1.1026 + 
  1.1027 + static inline int netlink_capable(struct socket *sock, unsigned int flag) 
  1.1028 +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
  1.1029 +--- a/net/packet/af_packet.c
  1.1030 ++++ b/net/packet/af_packet.c
  1.1031 +@@ -274,6 +274,9 @@ static int packet_rcv_spkt(struct sk_buf
  1.1032 + 	dst_release(skb->dst);
  1.1033 + 	skb->dst = NULL;
  1.1034 + 
  1.1035 ++	/* drop conntrack reference */
  1.1036 ++	nf_reset(skb);
  1.1037 ++
  1.1038 + 	spkt = (struct sockaddr_pkt*)skb->cb;
  1.1039 + 
  1.1040 + 	skb_push(skb, skb->data-skb->mac.raw);
  1.1041 +@@ -517,6 +520,9 @@ static int packet_rcv(struct sk_buff *sk
  1.1042 + 	dst_release(skb->dst);
  1.1043 + 	skb->dst = NULL;
  1.1044 + 
  1.1045 ++	/* drop conntrack reference */
  1.1046 ++	nf_reset(skb);
  1.1047 ++
  1.1048 + 	spin_lock(&sk->sk_receive_queue.lock);
  1.1049 + 	po->stats.tp_packets++;
  1.1050 + 	__skb_queue_tail(&sk->sk_receive_queue, skb);