Commit b2ab040d authored by Jeff Garzik's avatar Jeff Garzik

Merge branch 'master'

parents 1f57389a 741b2252
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 14 SUBLEVEL = 14
EXTRAVERSION =-rc5 EXTRAVERSION =
NAME=Affluent Albatross NAME=Affluent Albatross
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -488,6 +488,7 @@ static int is_pxafb_device(struct device * dev, void * data) ...@@ -488,6 +488,7 @@ static int is_pxafb_device(struct device * dev, void * data)
unsigned long spitz_get_hsync_len(void) unsigned long spitz_get_hsync_len(void)
{ {
#ifdef CONFIG_FB_PXA
if (!spitz_pxafb_dev) { if (!spitz_pxafb_dev) {
spitz_pxafb_dev = bus_find_device(&platform_bus_type, NULL, NULL, is_pxafb_device); spitz_pxafb_dev = bus_find_device(&platform_bus_type, NULL, NULL, is_pxafb_device);
if (!spitz_pxafb_dev) if (!spitz_pxafb_dev)
...@@ -496,6 +497,7 @@ unsigned long spitz_get_hsync_len(void) ...@@ -496,6 +497,7 @@ unsigned long spitz_get_hsync_len(void)
if (!get_hsync_time) if (!get_hsync_time)
get_hsync_time = symbol_get(pxafb_get_hsync_time); get_hsync_time = symbol_get(pxafb_get_hsync_time);
if (!get_hsync_time) if (!get_hsync_time)
#endif
return 0; return 0;
return pxafb_get_hsync_time(spitz_pxafb_dev); return pxafb_get_hsync_time(spitz_pxafb_dev);
......
...@@ -506,8 +506,8 @@ struct mpic * __init mpic_alloc(unsigned long phys_addr, ...@@ -506,8 +506,8 @@ struct mpic * __init mpic_alloc(unsigned long phys_addr,
mpic->senses_count = senses_count; mpic->senses_count = senses_count;
/* Map the global registers */ /* Map the global registers */
mpic->gregs = ioremap(phys_addr + MPIC_GREG_BASE, 0x1000); mpic->gregs = ioremap(phys_addr + MPIC_GREG_BASE, 0x2000);
mpic->tmregs = mpic->gregs + (MPIC_TIMER_BASE >> 2); mpic->tmregs = mpic->gregs + ((MPIC_TIMER_BASE - MPIC_GREG_BASE) >> 2);
BUG_ON(mpic->gregs == NULL); BUG_ON(mpic->gregs == NULL);
/* Reset */ /* Reset */
......
...@@ -1133,10 +1133,10 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev, ...@@ -1133,10 +1133,10 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
ring_start = (dev_priv->cp_ring->offset ring_start = (dev_priv->cp_ring->offset
- dev->agp->base - dev->agp->base
+ dev_priv->gart_vm_start); + dev_priv->gart_vm_start);
} else } else
#endif #endif
ring_start = (dev_priv->cp_ring->offset ring_start = (dev_priv->cp_ring->offset
- dev->sg->handle - (unsigned long)dev->sg->virtual
+ dev_priv->gart_vm_start); + dev_priv->gart_vm_start);
RADEON_WRITE( RADEON_CP_RB_BASE, ring_start ); RADEON_WRITE( RADEON_CP_RB_BASE, ring_start );
...@@ -1164,7 +1164,8 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev, ...@@ -1164,7 +1164,8 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
drm_sg_mem_t *entry = dev->sg; drm_sg_mem_t *entry = dev->sg;
unsigned long tmp_ofs, page_ofs; unsigned long tmp_ofs, page_ofs;
tmp_ofs = dev_priv->ring_rptr->offset - dev->sg->handle; tmp_ofs = dev_priv->ring_rptr->offset -
(unsigned long)dev->sg->virtual;
page_ofs = tmp_ofs >> PAGE_SHIFT; page_ofs = tmp_ofs >> PAGE_SHIFT;
RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR, RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR,
...@@ -1491,8 +1492,8 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1491,8 +1492,8 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
else else
#endif #endif
dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
- dev->sg->handle - (unsigned long)dev->sg->virtual
+ dev_priv->gart_vm_start); + dev_priv->gart_vm_start);
DRM_DEBUG( "dev_priv->gart_size %d\n", DRM_DEBUG( "dev_priv->gart_size %d\n",
dev_priv->gart_size ); dev_priv->gart_size );
......
...@@ -315,9 +315,9 @@ static void dbs_check_cpu(int cpu) ...@@ -315,9 +315,9 @@ static void dbs_check_cpu(int cpu)
policy = this_dbs_info->cur_policy; policy = this_dbs_info->cur_policy;
if ( init_flag == 0 ) { if ( init_flag == 0 ) {
for ( /* NULL */; init_flag < NR_CPUS; init_flag++ ) { for_each_online_cpu(j) {
dbs_info = &per_cpu(cpu_dbs_info, init_flag); dbs_info = &per_cpu(cpu_dbs_info, j);
requested_freq[cpu] = dbs_info->cur_policy->cur; requested_freq[j] = dbs_info->cur_policy->cur;
} }
init_flag = 1; init_flag = 1;
} }
......
...@@ -3568,7 +3568,8 @@ static void md_do_sync(mddev_t *mddev) ...@@ -3568,7 +3568,8 @@ static void md_do_sync(mddev_t *mddev)
mddev->curr_resync = 2; mddev->curr_resync = 2;
try_again: try_again:
if (signal_pending(current)) { if (signal_pending(current) ||
kthread_should_stop()) {
flush_signals(current); flush_signals(current);
set_bit(MD_RECOVERY_INTR, &mddev->recovery); set_bit(MD_RECOVERY_INTR, &mddev->recovery);
goto skip; goto skip;
...@@ -3590,8 +3591,9 @@ static void md_do_sync(mddev_t *mddev) ...@@ -3590,8 +3591,9 @@ static void md_do_sync(mddev_t *mddev)
*/ */
continue; continue;
prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE); prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
if (!signal_pending(current) if (!signal_pending(current) &&
&& mddev2->curr_resync >= mddev->curr_resync) { !kthread_should_stop() &&
mddev2->curr_resync >= mddev->curr_resync) {
printk(KERN_INFO "md: delaying resync of %s" printk(KERN_INFO "md: delaying resync of %s"
" until %s has finished resync (they" " until %s has finished resync (they"
" share one or more physical units)\n", " share one or more physical units)\n",
...@@ -3697,7 +3699,7 @@ static void md_do_sync(mddev_t *mddev) ...@@ -3697,7 +3699,7 @@ static void md_do_sync(mddev_t *mddev)
} }
if (signal_pending(current)) { if (signal_pending(current) || kthread_should_stop()) {
/* /*
* got a signal, exit. * got a signal, exit.
*/ */
......
...@@ -152,6 +152,7 @@ static int __devinit pci_hp_diva_init(struct pci_dev *dev) ...@@ -152,6 +152,7 @@ static int __devinit pci_hp_diva_init(struct pci_dev *dev)
rc = 4; rc = 4;
break; break;
case PCI_DEVICE_ID_HP_DIVA_POWERBAR: case PCI_DEVICE_ID_HP_DIVA_POWERBAR:
case PCI_DEVICE_ID_HP_DIVA_HURRICANE:
rc = 1; rc = 1;
break; break;
} }
...@@ -226,8 +227,10 @@ static int __devinit pci_plx9050_init(struct pci_dev *dev) ...@@ -226,8 +227,10 @@ static int __devinit pci_plx9050_init(struct pci_dev *dev)
} }
irq_config = 0x41; irq_config = 0x41;
if (dev->vendor == PCI_VENDOR_ID_PANACOM) if (dev->vendor == PCI_VENDOR_ID_PANACOM ||
dev->subsystem_vendor == PCI_SUBVENDOR_ID_EXSYS) {
irq_config = 0x43; irq_config = 0x43;
}
if ((dev->vendor == PCI_VENDOR_ID_PLX) && if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
(dev->device == PCI_DEVICE_ID_PLX_ROMULUS)) { (dev->device == PCI_DEVICE_ID_PLX_ROMULUS)) {
/* /*
...@@ -661,6 +664,15 @@ static struct pci_serial_quirk pci_serial_quirks[] = { ...@@ -661,6 +664,15 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
/* /*
* PLX * PLX
*/ */
{
.vendor = PCI_VENDOR_ID_PLX,
.device = PCI_DEVICE_ID_PLX_9050,
.subvendor = PCI_SUBVENDOR_ID_EXSYS,
.subdevice = PCI_SUBDEVICE_ID_EXSYS_4055,
.init = pci_plx9050_init,
.setup = pci_default_setup,
.exit = __devexit_p(pci_plx9050_exit),
},
{ {
.vendor = PCI_VENDOR_ID_PLX, .vendor = PCI_VENDOR_ID_PLX,
.device = PCI_DEVICE_ID_PLX_9050, .device = PCI_DEVICE_ID_PLX_9050,
...@@ -927,6 +939,7 @@ enum pci_board_num_t { ...@@ -927,6 +939,7 @@ enum pci_board_num_t {
pbn_panacom, pbn_panacom,
pbn_panacom2, pbn_panacom2,
pbn_panacom4, pbn_panacom4,
pbn_exsys_4055,
pbn_plx_romulus, pbn_plx_romulus,
pbn_oxsemi, pbn_oxsemi,
pbn_intel_i960, pbn_intel_i960,
...@@ -1292,6 +1305,13 @@ static struct pciserial_board pci_boards[] __devinitdata = { ...@@ -1292,6 +1305,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
.reg_shift = 7, .reg_shift = 7,
}, },
[pbn_exsys_4055] = {
.flags = FL_BASE2,
.num_ports = 4,
.base_baud = 115200,
.uart_offset = 8,
},
/* I think this entry is broken - the first_offset looks wrong --rmk */ /* I think this entry is broken - the first_offset looks wrong --rmk */
[pbn_plx_romulus] = { [pbn_plx_romulus] = {
.flags = FL_BASE2, .flags = FL_BASE2,
...@@ -1853,6 +1873,10 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -1853,6 +1873,10 @@ static struct pci_device_id serial_pci_tbl[] = {
PCI_SUBVENDOR_ID_CHASE_PCIRAS, PCI_SUBVENDOR_ID_CHASE_PCIRAS,
PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0, PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0,
pbn_b2_8_460800 }, pbn_b2_8_460800 },
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
PCI_SUBVENDOR_ID_EXSYS,
PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
pbn_exsys_4055 },
/* /*
* Megawolf Romulus PCI Serial Card, from Mike Hudson * Megawolf Romulus PCI Serial Card, from Mike Hudson
* (Exoray@isys.ca) * (Exoray@isys.ca)
......
...@@ -50,6 +50,7 @@ static void hfsplus_read_inode(struct inode *inode) ...@@ -50,6 +50,7 @@ static void hfsplus_read_inode(struct inode *inode)
init_MUTEX(&HFSPLUS_I(inode).extents_lock); init_MUTEX(&HFSPLUS_I(inode).extents_lock);
HFSPLUS_I(inode).flags = 0; HFSPLUS_I(inode).flags = 0;
HFSPLUS_I(inode).rsrc_inode = NULL; HFSPLUS_I(inode).rsrc_inode = NULL;
atomic_set(&HFSPLUS_I(inode).opencnt, 0);
if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID) { if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID) {
read_inode: read_inode:
......
...@@ -347,7 +347,6 @@ static inline unsigned long __ffs(unsigned long word) ...@@ -347,7 +347,6 @@ static inline unsigned long __ffs(unsigned long word)
* the clz instruction for much better code efficiency. * the clz instruction for much better code efficiency.
*/ */
static __inline__ int generic_fls(int x);
#define fls(x) \ #define fls(x) \
( __builtin_constant_p(x) ? generic_fls(x) : \ ( __builtin_constant_p(x) ? generic_fls(x) : \
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
......
...@@ -50,10 +50,10 @@ extern int iommu_setup(char *opt); ...@@ -50,10 +50,10 @@ extern int iommu_setup(char *opt);
* address space. The networking and block device layers use * address space. The networking and block device layers use
* this boolean for bounce buffer decisions * this boolean for bounce buffer decisions
* *
* On x86-64 it mostly equals, but we set it to zero to tell some subsystems * On AMD64 it mostly equals, but we set it to zero to tell some subsystems
* that an hard or soft IOMMU is available. * that an IOMMU is available.
*/ */
#define PCI_DMA_BUS_IS_PHYS 0 #define PCI_DMA_BUS_IS_PHYS (no_iommu ? 1 : 0)
/* /*
* x86-64 always supports DAC, but sometimes it is useful to force * x86-64 always supports DAC, but sometimes it is useful to force
......
...@@ -723,6 +723,7 @@ ...@@ -723,6 +723,7 @@
#define PCI_DEVICE_ID_HP_DIVA_EVEREST 0x1282 #define PCI_DEVICE_ID_HP_DIVA_EVEREST 0x1282
#define PCI_DEVICE_ID_HP_DIVA_AUX 0x1290 #define PCI_DEVICE_ID_HP_DIVA_AUX 0x1290
#define PCI_DEVICE_ID_HP_DIVA_RMP3 0x1301 #define PCI_DEVICE_ID_HP_DIVA_RMP3 0x1301
#define PCI_DEVICE_ID_HP_DIVA_HURRICANE 0x132a
#define PCI_DEVICE_ID_HP_CISS 0x3210 #define PCI_DEVICE_ID_HP_CISS 0x3210
#define PCI_DEVICE_ID_HP_CISSA 0x3220 #define PCI_DEVICE_ID_HP_CISSA 0x3220
#define PCI_DEVICE_ID_HP_CISSB 0x3222 #define PCI_DEVICE_ID_HP_CISSB 0x3222
...@@ -2696,6 +2697,7 @@ ...@@ -2696,6 +2697,7 @@
#define PCI_SUBVENDOR_ID_EXSYS 0xd84d #define PCI_SUBVENDOR_ID_EXSYS 0xd84d
#define PCI_SUBDEVICE_ID_EXSYS_4014 0x4014 #define PCI_SUBDEVICE_ID_EXSYS_4014 0x4014
#define PCI_SUBDEVICE_ID_EXSYS_4055 0x4055
#define PCI_VENDOR_ID_TIGERJET 0xe159 #define PCI_VENDOR_ID_TIGERJET 0xe159
#define PCI_DEVICE_ID_TIGERJET_300 0x0001 #define PCI_DEVICE_ID_TIGERJET_300 0x0001
......
...@@ -825,6 +825,14 @@ fastcall NORET_TYPE void do_exit(long code) ...@@ -825,6 +825,14 @@ fastcall NORET_TYPE void do_exit(long code)
tsk->flags |= PF_EXITING; tsk->flags |= PF_EXITING;
/*
* Make sure we don't try to process any timer firings
* while we are already exiting.
*/
tsk->it_virt_expires = cputime_zero;
tsk->it_prof_expires = cputime_zero;
tsk->it_sched_expires = 0;
if (unlikely(in_atomic())) if (unlikely(in_atomic()))
printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n", printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n",
current->comm, current->pid, current->comm, current->pid,
......
...@@ -91,7 +91,7 @@ static inline union cpu_time_count cpu_time_sub(clockid_t which_clock, ...@@ -91,7 +91,7 @@ static inline union cpu_time_count cpu_time_sub(clockid_t which_clock,
* Update expiry time from increment, and increase overrun count, * Update expiry time from increment, and increase overrun count,
* given the current clock sample. * given the current clock sample.
*/ */
static inline void bump_cpu_timer(struct k_itimer *timer, static void bump_cpu_timer(struct k_itimer *timer,
union cpu_time_count now) union cpu_time_count now)
{ {
int i; int i;
...@@ -110,7 +110,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer, ...@@ -110,7 +110,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
for (i = 0; incr < delta - incr; i++) for (i = 0; incr < delta - incr; i++)
incr = incr << 1; incr = incr << 1;
for (; i >= 0; incr >>= 1, i--) { for (; i >= 0; incr >>= 1, i--) {
if (delta <= incr) if (delta < incr)
continue; continue;
timer->it.cpu.expires.sched += incr; timer->it.cpu.expires.sched += incr;
timer->it_overrun += 1 << i; timer->it_overrun += 1 << i;
...@@ -128,7 +128,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer, ...@@ -128,7 +128,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++) for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
incr = cputime_add(incr, incr); incr = cputime_add(incr, incr);
for (; i >= 0; incr = cputime_halve(incr), i--) { for (; i >= 0; incr = cputime_halve(incr), i--) {
if (cputime_le(delta, incr)) if (cputime_lt(delta, incr))
continue; continue;
timer->it.cpu.expires.cpu = timer->it.cpu.expires.cpu =
cputime_add(timer->it.cpu.expires.cpu, incr); cputime_add(timer->it.cpu.expires.cpu, incr);
...@@ -497,7 +497,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -497,7 +497,7 @@ static void process_timer_rebalance(struct task_struct *p,
left = cputime_div(cputime_sub(expires.cpu, val.cpu), left = cputime_div(cputime_sub(expires.cpu, val.cpu),
nthreads); nthreads);
do { do {
if (!unlikely(t->exit_state)) { if (!unlikely(t->flags & PF_EXITING)) {
ticks = cputime_add(prof_ticks(t), left); ticks = cputime_add(prof_ticks(t), left);
if (cputime_eq(t->it_prof_expires, if (cputime_eq(t->it_prof_expires,
cputime_zero) || cputime_zero) ||
...@@ -512,7 +512,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -512,7 +512,7 @@ static void process_timer_rebalance(struct task_struct *p,
left = cputime_div(cputime_sub(expires.cpu, val.cpu), left = cputime_div(cputime_sub(expires.cpu, val.cpu),
nthreads); nthreads);
do { do {
if (!unlikely(t->exit_state)) { if (!unlikely(t->flags & PF_EXITING)) {
ticks = cputime_add(virt_ticks(t), left); ticks = cputime_add(virt_ticks(t), left);
if (cputime_eq(t->it_virt_expires, if (cputime_eq(t->it_virt_expires,
cputime_zero) || cputime_zero) ||
...@@ -527,7 +527,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -527,7 +527,7 @@ static void process_timer_rebalance(struct task_struct *p,
nsleft = expires.sched - val.sched; nsleft = expires.sched - val.sched;
do_div(nsleft, nthreads); do_div(nsleft, nthreads);
do { do {
if (!unlikely(t->exit_state)) { if (!unlikely(t->flags & PF_EXITING)) {
ns = t->sched_time + nsleft; ns = t->sched_time + nsleft;
if (t->it_sched_expires == 0 || if (t->it_sched_expires == 0 ||
t->it_sched_expires > ns) { t->it_sched_expires > ns) {
...@@ -566,6 +566,9 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now) ...@@ -566,6 +566,9 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now)
struct cpu_timer_list *next; struct cpu_timer_list *next;
unsigned long i; unsigned long i;
if (CPUCLOCK_PERTHREAD(timer->it_clock) && (p->flags & PF_EXITING))
return;
head = (CPUCLOCK_PERTHREAD(timer->it_clock) ? head = (CPUCLOCK_PERTHREAD(timer->it_clock) ?
p->cpu_timers : p->signal->cpu_timers); p->cpu_timers : p->signal->cpu_timers);
head += CPUCLOCK_WHICH(timer->it_clock); head += CPUCLOCK_WHICH(timer->it_clock);
...@@ -576,17 +579,15 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now) ...@@ -576,17 +579,15 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now)
listpos = head; listpos = head;
if (CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) { if (CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) {
list_for_each_entry(next, head, entry) { list_for_each_entry(next, head, entry) {
if (next->expires.sched > nt->expires.sched) { if (next->expires.sched > nt->expires.sched)
listpos = &next->entry;
break; break;
} listpos = &next->entry;
} }
} else { } else {
list_for_each_entry(next, head, entry) { list_for_each_entry(next, head, entry) {
if (cputime_gt(next->expires.cpu, nt->expires.cpu)) { if (cputime_gt(next->expires.cpu, nt->expires.cpu))
listpos = &next->entry;
break; break;
} listpos = &next->entry;
} }
} }
list_add(&nt->entry, listpos); list_add(&nt->entry, listpos);
...@@ -1206,7 +1207,7 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1206,7 +1207,7 @@ static void check_process_timers(struct task_struct *tsk,
do { do {
t = next_thread(t); t = next_thread(t);
} while (unlikely(t->exit_state)); } while (unlikely(t->flags & PF_EXITING));
} while (t != tsk); } while (t != tsk);
} }
} }
...@@ -1295,30 +1296,30 @@ void run_posix_cpu_timers(struct task_struct *tsk) ...@@ -1295,30 +1296,30 @@ void run_posix_cpu_timers(struct task_struct *tsk)
#undef UNEXPIRED #undef UNEXPIRED
BUG_ON(tsk->exit_state);
/* /*
* Double-check with locks held. * Double-check with locks held.
*/ */
read_lock(&tasklist_lock); read_lock(&tasklist_lock);
if (likely(tsk->signal != NULL)) { spin_lock(&tsk->sighand->siglock);
spin_lock(&tsk->sighand->siglock);
/* /*
* Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N] * Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N]
* all the timers that are firing, and put them on the firing list. * all the timers that are firing, and put them on the firing list.
*/ */
check_thread_timers(tsk, &firing); check_thread_timers(tsk, &firing);
check_process_timers(tsk, &firing); check_process_timers(tsk, &firing);
/* /*
* We must release these locks before taking any timer's lock. * We must release these locks before taking any timer's lock.
* There is a potential race with timer deletion here, as the * There is a potential race with timer deletion here, as the
* siglock now protects our private firing list. We have set * siglock now protects our private firing list. We have set
* the firing flag in each timer, so that a deletion attempt * the firing flag in each timer, so that a deletion attempt
* that gets the timer lock before we do will give it up and * that gets the timer lock before we do will give it up and
* spin until we've taken care of that timer below. * spin until we've taken care of that timer below.
*/ */
spin_unlock(&tsk->sighand->siglock); spin_unlock(&tsk->sighand->siglock);
}
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
/* /*
......
...@@ -3879,6 +3879,7 @@ EXPORT_SYMBOL(cpu_present_map); ...@@ -3879,6 +3879,7 @@ EXPORT_SYMBOL(cpu_present_map);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
cpumask_t cpu_online_map = CPU_MASK_ALL; cpumask_t cpu_online_map = CPU_MASK_ALL;
EXPORT_SYMBOL_GPL(cpu_online_map);
cpumask_t cpu_possible_map = CPU_MASK_ALL; cpumask_t cpu_possible_map = CPU_MASK_ALL;
#endif #endif
......
...@@ -1750,6 +1750,8 @@ inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch) ...@@ -1750,6 +1750,8 @@ inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
{ {
struct per_cpu_pages *pcp; struct per_cpu_pages *pcp;
memset(p, 0, sizeof(*p));
pcp = &p->pcp[0]; /* hot */ pcp = &p->pcp[0]; /* hot */
pcp->count = 0; pcp->count = 0;
pcp->low = 2 * batch; pcp->low = 2 * batch;
......
...@@ -455,10 +455,15 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev) ...@@ -455,10 +455,15 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
/* Old location, field to be removed in next WE */ /* Old location, field to be removed in next WE */
if(dev->get_wireless_stats) { if(dev->get_wireless_stats) {
printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n", static int printed_message;
dev->name);
if (!printed_message++)
printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n",
dev->name);
return dev->get_wireless_stats(dev); return dev->get_wireless_stats(dev);
} }
/* Not found */ /* Not found */
return (struct iw_statistics *) NULL; return (struct iw_statistics *) NULL;
} }
......
...@@ -2239,6 +2239,7 @@ static int tcp_ack_update_window(struct sock *sk, struct tcp_sock *tp, ...@@ -2239,6 +2239,7 @@ static int tcp_ack_update_window(struct sock *sk, struct tcp_sock *tp,
/* Note, it is the only place, where /* Note, it is the only place, where
* fast path is recovered for sending TCP. * fast path is recovered for sending TCP.
*/ */
tp->pred_flags = 0;
tcp_fast_path_check(sk, tp); tcp_fast_path_check(sk, tp);
if (nwin > tp->max_window) { if (nwin > tp->max_window) {
......
...@@ -587,7 +587,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) ...@@ -587,7 +587,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
struct timeval tv; struct timeval tv;
tv.tv_sec = xtime.tv_sec; tv.tv_sec = xtime.tv_sec;
tv.tv_usec = xtime.tv_nsec * 1000; tv.tv_usec = xtime.tv_nsec / NSEC_PER_USEC;
skb_set_timestamp(skb, &tv); skb_set_timestamp(skb, &tv);
/* Don't enable netstamp, sunrpc doesn't /* Don't enable netstamp, sunrpc doesn't
need that much accuracy */ need that much accuracy */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment