提交 45424376 编写于 作者: P Paul Mackerras

Merge in v2.6.14 by hand

此差异已折叠。
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);
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include <kern_constants.h> #include <kern_constants.h>
#define TASK_DEBUGREGS(task) ((unsigned long *) &(((char *) (task))[HOST_TASK_DEBUGREGS])) #define TASK_DEBUGREGS(task) ((unsigned long *) &(((char *) (task))[HOST_TASK_DEBUGREGS]))
#ifdef CONFIG_MODE_TT #ifdef UML_CONFIG_MODE_TT
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID])) #define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
#endif #endif
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <kern_constants.h> #include <kern_constants.h>
#ifdef CONFIG_MODE_TT #ifdef UML_CONFIG_MODE_TT
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID])) #define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
#endif #endif
......
...@@ -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;
} }
......
...@@ -396,20 +396,21 @@ static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr, struct pt_regs ...@@ -396,20 +396,21 @@ static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr, struct pt_regs
writel(dev->eq_table.clr_mask, dev->eq_table.clr_int); writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
ecr = readl(dev->eq_regs.tavor.ecr_base + 4); ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
if (ecr) { if (!ecr)
writel(ecr, dev->eq_regs.tavor.ecr_base + return IRQ_NONE;
MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
for (i = 0; i < MTHCA_NUM_EQ; ++i) writel(ecr, dev->eq_regs.tavor.ecr_base +
if (ecr & dev->eq_table.eq[i].eqn_mask && MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
mthca_eq_int(dev, &dev->eq_table.eq[i])) {
for (i = 0; i < MTHCA_NUM_EQ; ++i)
if (ecr & dev->eq_table.eq[i].eqn_mask) {
if (mthca_eq_int(dev, &dev->eq_table.eq[i]))
tavor_set_eq_ci(dev, &dev->eq_table.eq[i], tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
dev->eq_table.eq[i].cons_index); dev->eq_table.eq[i].cons_index);
tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn); tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
} }
}
return IRQ_RETVAL(ecr); return IRQ_HANDLED;
} }
static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr, static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr,
......
...@@ -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.
*/ */
......
...@@ -262,7 +262,6 @@ config VIDEO_SAA7134_DVB ...@@ -262,7 +262,6 @@ config VIDEO_SAA7134_DVB
depends on VIDEO_SAA7134 && DVB_CORE depends on VIDEO_SAA7134 && DVB_CORE
select VIDEO_BUF_DVB select VIDEO_BUF_DVB
select DVB_MT352 select DVB_MT352
select DVB_CX22702
select DVB_TDA1004X select DVB_TDA1004X
---help--- ---help---
This adds support for DVB cards based on the This adds support for DVB cards based on the
......
...@@ -241,7 +241,8 @@ static void __devinit quirk_s3_64M(struct pci_dev *dev) ...@@ -241,7 +241,8 @@ static void __devinit quirk_s3_64M(struct pci_dev *dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M );
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M );
static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsigned size, int nr) static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region,
unsigned size, int nr, const char *name)
{ {
region &= ~(size-1); region &= ~(size-1);
if (region) { if (region) {
...@@ -259,6 +260,7 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsi ...@@ -259,6 +260,7 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsi
pcibios_bus_to_resource(dev, res, &bus_region); pcibios_bus_to_resource(dev, res, &bus_region);
pci_claim_resource(dev, nr); pci_claim_resource(dev, nr);
printk("PCI quirk: region %04x-%04x claimed by %s\n", region, region + size - 1, name);
} }
} }
...@@ -291,25 +293,98 @@ static void __devinit quirk_ali7101_acpi(struct pci_dev *dev) ...@@ -291,25 +293,98 @@ static void __devinit quirk_ali7101_acpi(struct pci_dev *dev)
u16 region; u16 region;
pci_read_config_word(dev, 0xE0, &region); pci_read_config_word(dev, 0xE0, &region);
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI");
pci_read_config_word(dev, 0xE2, &region); pci_read_config_word(dev, 0xE2, &region);
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB");
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi );
static void piix4_io_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
{
u32 devres;
u32 mask, size, base;
pci_read_config_dword(dev, port, &devres);
if ((devres & enable) != enable)
return;
mask = (devres >> 16) & 15;
base = devres & 0xffff;
size = 16;
for (;;) {
unsigned bit = size >> 1;
if ((bit & mask) == bit)
break;
size = bit;
}
/*
* For now we only print it out. Eventually we'll want to
* reserve it (at least if it's in the 0x1000+ range), but
* let's get enough confirmation reports first.
*/
base &= -size;
printk("%s PIO at %04x-%04x\n", name, base, base + size - 1);
}
static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
{
u32 devres;
u32 mask, size, base;
pci_read_config_dword(dev, port, &devres);
if ((devres & enable) != enable)
return;
base = devres & 0xffff0000;
mask = (devres & 0x3f) << 16;
size = 128 << 16;
for (;;) {
unsigned bit = size >> 1;
if ((bit & mask) == bit)
break;
size = bit;
}
/*
* For now we only print it out. Eventually we'll want to
* reserve it, but let's get enough confirmation reports first.
*/
base &= -size;
printk("%s MMIO at %04x-%04x\n", name, base, base + size - 1);
}
/* /*
* PIIX4 ACPI: Two IO regions pointed to by longwords at * PIIX4 ACPI: Two IO regions pointed to by longwords at
* 0x40 (64 bytes of ACPI registers) * 0x40 (64 bytes of ACPI registers)
* 0x90 (32 bytes of SMB registers) * 0x90 (32 bytes of SMB registers)
* and a few strange programmable PIIX4 device resources.
*/ */
static void __devinit quirk_piix4_acpi(struct pci_dev *dev) static void __devinit quirk_piix4_acpi(struct pci_dev *dev)
{ {
u32 region; u32 region, res_a;
pci_read_config_dword(dev, 0x40, &region); pci_read_config_dword(dev, 0x40, &region);
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI");
pci_read_config_dword(dev, 0x90, &region); pci_read_config_dword(dev, 0x90, &region);
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB");
/* Device resource A has enables for some of the other ones */
pci_read_config_dword(dev, 0x5c, &res_a);
piix4_io_quirk(dev, "PIIX4 devres B", 0x60, 3 << 21);
piix4_io_quirk(dev, "PIIX4 devres C", 0x64, 3 << 21);
/* Device resource D is just bitfields for static resources */
/* Device 12 enabled? */
if (res_a & (1 << 29)) {
piix4_io_quirk(dev, "PIIX4 devres E", 0x68, 1 << 20);
piix4_mem_quirk(dev, "PIIX4 devres F", 0x6c, 1 << 7);
}
/* Device 13 enabled? */
if (res_a & (1 << 30)) {
piix4_io_quirk(dev, "PIIX4 devres G", 0x70, 1 << 20);
piix4_mem_quirk(dev, "PIIX4 devres H", 0x74, 1 << 7);
}
piix4_io_quirk(dev, "PIIX4 devres I", 0x78, 1 << 20);
piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20);
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi );
...@@ -323,10 +398,10 @@ static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev) ...@@ -323,10 +398,10 @@ static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev)
u32 region; u32 region;
pci_read_config_dword(dev, 0x40, &region); pci_read_config_dword(dev, 0x40, &region);
quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES); quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, "ICH4 ACPI/GPIO/TCO");
pci_read_config_dword(dev, 0x58, &region); pci_read_config_dword(dev, 0x58, &region);
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1); quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH4 GPIO");
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi );
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi );
...@@ -352,7 +427,7 @@ static void __devinit quirk_vt82c586_acpi(struct pci_dev *dev) ...@@ -352,7 +427,7 @@ static void __devinit quirk_vt82c586_acpi(struct pci_dev *dev)
if (rev & 0x10) { if (rev & 0x10) {
pci_read_config_dword(dev, 0x48, &region); pci_read_config_dword(dev, 0x48, &region);
region &= PCI_BASE_ADDRESS_IO_MASK; region &= PCI_BASE_ADDRESS_IO_MASK;
quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES); quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES, "vt82c586 ACPI");
} }
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi );
...@@ -372,11 +447,11 @@ static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev) ...@@ -372,11 +447,11 @@ static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev)
pci_read_config_word(dev, 0x70, &hm); pci_read_config_word(dev, 0x70, &hm);
hm &= PCI_BASE_ADDRESS_IO_MASK; hm &= PCI_BASE_ADDRESS_IO_MASK;
quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1); quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c868 HW-mon");
pci_read_config_dword(dev, 0x90, &smb); pci_read_config_dword(dev, 0x90, &smb);
smb &= PCI_BASE_ADDRESS_IO_MASK; smb &= PCI_BASE_ADDRESS_IO_MASK;
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2); quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c868 SMB");
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi ); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi );
...@@ -391,11 +466,11 @@ static void __devinit quirk_vt8235_acpi(struct pci_dev *dev) ...@@ -391,11 +466,11 @@ static void __devinit quirk_vt8235_acpi(struct pci_dev *dev)
pci_read_config_word(dev, 0x88, &pm); pci_read_config_word(dev, 0x88, &pm);
pm &= PCI_BASE_ADDRESS_IO_MASK; pm &= PCI_BASE_ADDRESS_IO_MASK;
quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES); quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM");
pci_read_config_word(dev, 0xd0, &smb); pci_read_config_word(dev, 0xd0, &smb);
smb &= PCI_BASE_ADDRESS_IO_MASK; smb &= PCI_BASE_ADDRESS_IO_MASK;
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1); quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1, "vt8235 SMB");
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
* FIXME: IO should be max 256 bytes. However, since we may * FIXME: IO should be max 256 bytes. However, since we may
* have a P2P bridge below a cardbus bridge, we need 4K. * have a P2P bridge below a cardbus bridge, we need 4K.
*/ */
#define CARDBUS_IO_SIZE (4*1024) #define CARDBUS_IO_SIZE (256)
#define CARDBUS_MEM_SIZE (32*1024*1024) #define CARDBUS_MEM_SIZE (32*1024*1024)
static void __devinit static void __devinit
......
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
#ifndef NDEBUG #ifndef NDEBUG
#define NDEBUG 0 #define NDEBUG 0
#endif #endif
#ifndef NDEBUG #ifndef NDEBUG_ABORT
#define NDEBUG_ABORT 0 #define NDEBUG_ABORT 0
#endif #endif
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#define AAC_MAX_LUN (8) #define AAC_MAX_LUN (8)
#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff) #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)512) #define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)256)
/* /*
* These macros convert from physical channels to virtual channels * These macros convert from physical channels to virtual channels
......
...@@ -1325,6 +1325,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1325,6 +1325,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
ha->brd_info = brd_info; ha->brd_info = brd_info;
sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no); sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no);
ha->dpc_pid = -1;
/* Configure PCI I/O space */ /* Configure PCI I/O space */
ret = qla2x00_iospace_config(ha); ret = qla2x00_iospace_config(ha);
if (ret) if (ret)
...@@ -1448,7 +1450,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1448,7 +1450,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
*/ */
spin_lock_init(&ha->mbx_reg_lock); spin_lock_init(&ha->mbx_reg_lock);
ha->dpc_pid = -1;
init_completion(&ha->dpc_inited); init_completion(&ha->dpc_inited);
init_completion(&ha->dpc_exited); init_completion(&ha->dpc_exited);
......
...@@ -185,6 +185,7 @@ static struct { ...@@ -185,6 +185,7 @@ static struct {
{"PIONEER", "CD-ROM DRM-600", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, {"PIONEER", "CD-ROM DRM-600", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
{"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN},
{"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN},
{"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */ {"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */
......
...@@ -97,7 +97,6 @@ int scsi_insert_special_req(struct scsi_request *sreq, int at_head) ...@@ -97,7 +97,6 @@ int scsi_insert_special_req(struct scsi_request *sreq, int at_head)
} }
static void scsi_run_queue(struct request_queue *q); static void scsi_run_queue(struct request_queue *q);
static void scsi_release_buffers(struct scsi_cmnd *cmd);
/* /*
* Function: scsi_unprep_request() * Function: scsi_unprep_request()
...@@ -1040,8 +1039,10 @@ static int scsi_init_io(struct scsi_cmnd *cmd) ...@@ -1040,8 +1039,10 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
* if sg table allocation fails, requeue request later. * if sg table allocation fails, requeue request later.
*/ */
sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC); sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
if (unlikely(!sgpnt)) if (unlikely(!sgpnt)) {
scsi_unprep_request(req);
return BLKPREP_DEFER; return BLKPREP_DEFER;
}
cmd->request_buffer = (char *) sgpnt; cmd->request_buffer = (char *) sgpnt;
cmd->request_bufflen = req->nr_sectors << 9; cmd->request_bufflen = req->nr_sectors << 9;
...@@ -1245,8 +1246,8 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) ...@@ -1245,8 +1246,8 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
*/ */
ret = scsi_init_io(cmd); ret = scsi_init_io(cmd);
switch(ret) { switch(ret) {
/* For BLKPREP_KILL/DEFER the cmd was released */
case BLKPREP_KILL: case BLKPREP_KILL:
/* BLKPREP_KILL return also releases the command */
goto kill; goto kill;
case BLKPREP_DEFER: case BLKPREP_DEFER:
goto defer; goto defer;
......
...@@ -819,12 +819,15 @@ show_fc_private_host_tgtid_bind_type(struct class_device *cdev, char *buf) ...@@ -819,12 +819,15 @@ show_fc_private_host_tgtid_bind_type(struct class_device *cdev, char *buf)
return snprintf(buf, FC_BINDTYPE_MAX_NAMELEN, "%s\n", name); return snprintf(buf, FC_BINDTYPE_MAX_NAMELEN, "%s\n", name);
} }
#define get_list_head_entry(pos, head, member) \
pos = list_entry((head)->next, typeof(*pos), member)
static ssize_t static ssize_t
store_fc_private_host_tgtid_bind_type(struct class_device *cdev, store_fc_private_host_tgtid_bind_type(struct class_device *cdev,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct Scsi_Host *shost = transport_class_to_shost(cdev); struct Scsi_Host *shost = transport_class_to_shost(cdev);
struct fc_rport *rport, *next_rport; struct fc_rport *rport;
enum fc_tgtid_binding_type val; enum fc_tgtid_binding_type val;
unsigned long flags; unsigned long flags;
...@@ -834,9 +837,13 @@ store_fc_private_host_tgtid_bind_type(struct class_device *cdev, ...@@ -834,9 +837,13 @@ store_fc_private_host_tgtid_bind_type(struct class_device *cdev,
/* if changing bind type, purge all unused consistent bindings */ /* if changing bind type, purge all unused consistent bindings */
if (val != fc_host_tgtid_bind_type(shost)) { if (val != fc_host_tgtid_bind_type(shost)) {
spin_lock_irqsave(shost->host_lock, flags); spin_lock_irqsave(shost->host_lock, flags);
list_for_each_entry_safe(rport, next_rport, while (!list_empty(&fc_host_rport_bindings(shost))) {
&fc_host_rport_bindings(shost), peers) get_list_head_entry(rport,
&fc_host_rport_bindings(shost), peers);
spin_unlock_irqrestore(shost->host_lock, flags);
fc_rport_terminate(rport); fc_rport_terminate(rport);
spin_lock_irqsave(shost->host_lock, flags);
}
spin_unlock_irqrestore(shost->host_lock, flags); spin_unlock_irqrestore(shost->host_lock, flags);
} }
......
...@@ -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)
......
...@@ -242,6 +242,13 @@ static ssize_t show_virtual(struct class_device *class_device, char *buf) ...@@ -242,6 +242,13 @@ static ssize_t show_virtual(struct class_device *class_device, char *buf)
fb_info->var.yres_virtual); fb_info->var.yres_virtual);
} }
static ssize_t show_stride(struct class_device *class_device, char *buf)
{
struct fb_info *fb_info =
(struct fb_info *)class_get_devdata(class_device);
return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->fix.line_length);
}
/* Format for cmap is "%02x%c%4x%4x%4x\n" */ /* Format for cmap is "%02x%c%4x%4x%4x\n" */
/* %02x entry %c transp %4x red %4x blue %4x green \n */ /* %02x entry %c transp %4x red %4x blue %4x green \n */
/* 256 rows at 16 chars equals 4096, the normal page size */ /* 256 rows at 16 chars equals 4096, the normal page size */
...@@ -432,6 +439,7 @@ static struct class_device_attribute class_device_attrs[] = { ...@@ -432,6 +439,7 @@ static struct class_device_attribute class_device_attrs[] = {
__ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan), __ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan),
__ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual), __ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual),
__ATTR(name, S_IRUGO, show_name, NULL), __ATTR(name, S_IRUGO, show_name, NULL),
__ATTR(stride, S_IRUGO, show_stride, NULL),
}; };
int fb_init_class_device(struct fb_info *fb_info) int fb_init_class_device(struct fb_info *fb_info)
......
...@@ -1397,6 +1397,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb) ...@@ -1397,6 +1397,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf, if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
kiocb->ki_left))) kiocb->ki_left)))
break; break;
ret = security_file_permission(file, MAY_READ);
if (unlikely(ret))
break;
ret = -EINVAL; ret = -EINVAL;
if (file->f_op->aio_read) if (file->f_op->aio_read)
kiocb->ki_retry = aio_pread; kiocb->ki_retry = aio_pread;
...@@ -1409,6 +1412,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb) ...@@ -1409,6 +1412,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf, if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
kiocb->ki_left))) kiocb->ki_left)))
break; break;
ret = security_file_permission(file, MAY_WRITE);
if (unlikely(ret))
break;
ret = -EINVAL; ret = -EINVAL;
if (file->f_op->aio_write) if (file->f_op->aio_write)
kiocb->ki_retry = aio_pwrite; kiocb->ki_retry = aio_pwrite;
......
...@@ -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:
......
...@@ -176,6 +176,7 @@ static inline void put_inotify_dev(struct inotify_device *dev) ...@@ -176,6 +176,7 @@ static inline void put_inotify_dev(struct inotify_device *dev)
if (atomic_dec_and_test(&dev->count)) { if (atomic_dec_and_test(&dev->count)) {
atomic_dec(&dev->user->inotify_devs); atomic_dec(&dev->user->inotify_devs);
free_uid(dev->user); free_uid(dev->user);
idr_destroy(&dev->idr);
kfree(dev); kfree(dev);
} }
} }
......
#ifndef _ALPHA_ATOMIC_H #ifndef _ALPHA_ATOMIC_H
#define _ALPHA_ATOMIC_H #define _ALPHA_ATOMIC_H
#include <asm/barrier.h>
/* /*
* Atomic operations that C can't guarantee us. Useful for * Atomic operations that C can't guarantee us. Useful for
* resource counting etc... * resource counting etc...
...@@ -100,18 +102,19 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v) ...@@ -100,18 +102,19 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
static __inline__ long atomic_add_return(int i, atomic_t * v) static __inline__ long atomic_add_return(int i, atomic_t * v)
{ {
long temp, result; long temp, result;
smp_mb();
__asm__ __volatile__( __asm__ __volatile__(
"1: ldl_l %0,%1\n" "1: ldl_l %0,%1\n"
" addl %0,%3,%2\n" " addl %0,%3,%2\n"
" addl %0,%3,%0\n" " addl %0,%3,%0\n"
" stl_c %0,%1\n" " stl_c %0,%1\n"
" beq %0,2f\n" " beq %0,2f\n"
" mb\n"
".subsection 2\n" ".subsection 2\n"
"2: br 1b\n" "2: br 1b\n"
".previous" ".previous"
:"=&r" (temp), "=m" (v->counter), "=&r" (result) :"=&r" (temp), "=m" (v->counter), "=&r" (result)
:"Ir" (i), "m" (v->counter) : "memory"); :"Ir" (i), "m" (v->counter) : "memory");
smp_mb();
return result; return result;
} }
...@@ -120,54 +123,57 @@ static __inline__ long atomic_add_return(int i, atomic_t * v) ...@@ -120,54 +123,57 @@ static __inline__ long atomic_add_return(int i, atomic_t * v)
static __inline__ long atomic64_add_return(long i, atomic64_t * v) static __inline__ long atomic64_add_return(long i, atomic64_t * v)
{ {
long temp, result; long temp, result;
smp_mb();
__asm__ __volatile__( __asm__ __volatile__(
"1: ldq_l %0,%1\n" "1: ldq_l %0,%1\n"
" addq %0,%3,%2\n" " addq %0,%3,%2\n"
" addq %0,%3,%0\n" " addq %0,%3,%0\n"
" stq_c %0,%1\n" " stq_c %0,%1\n"
" beq %0,2f\n" " beq %0,2f\n"
" mb\n"
".subsection 2\n" ".subsection 2\n"
"2: br 1b\n" "2: br 1b\n"
".previous" ".previous"
:"=&r" (temp), "=m" (v->counter), "=&r" (result) :"=&r" (temp), "=m" (v->counter), "=&r" (result)
:"Ir" (i), "m" (v->counter) : "memory"); :"Ir" (i), "m" (v->counter) : "memory");
smp_mb();
return result; return result;
} }
static __inline__ long atomic_sub_return(int i, atomic_t * v) static __inline__ long atomic_sub_return(int i, atomic_t * v)
{ {
long temp, result; long temp, result;
smp_mb();
__asm__ __volatile__( __asm__ __volatile__(
"1: ldl_l %0,%1\n" "1: ldl_l %0,%1\n"
" subl %0,%3,%2\n" " subl %0,%3,%2\n"
" subl %0,%3,%0\n" " subl %0,%3,%0\n"
" stl_c %0,%1\n" " stl_c %0,%1\n"
" beq %0,2f\n" " beq %0,2f\n"
" mb\n"
".subsection 2\n" ".subsection 2\n"
"2: br 1b\n" "2: br 1b\n"
".previous" ".previous"
:"=&r" (temp), "=m" (v->counter), "=&r" (result) :"=&r" (temp), "=m" (v->counter), "=&r" (result)
:"Ir" (i), "m" (v->counter) : "memory"); :"Ir" (i), "m" (v->counter) : "memory");
smp_mb();
return result; return result;
} }
static __inline__ long atomic64_sub_return(long i, atomic64_t * v) static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
{ {
long temp, result; long temp, result;
smp_mb();
__asm__ __volatile__( __asm__ __volatile__(
"1: ldq_l %0,%1\n" "1: ldq_l %0,%1\n"
" subq %0,%3,%2\n" " subq %0,%3,%2\n"
" subq %0,%3,%0\n" " subq %0,%3,%0\n"
" stq_c %0,%1\n" " stq_c %0,%1\n"
" beq %0,2f\n" " beq %0,2f\n"
" mb\n"
".subsection 2\n" ".subsection 2\n"
"2: br 1b\n" "2: br 1b\n"
".previous" ".previous"
:"=&r" (temp), "=m" (v->counter), "=&r" (result) :"=&r" (temp), "=m" (v->counter), "=&r" (result)
:"Ir" (i), "m" (v->counter) : "memory"); :"Ir" (i), "m" (v->counter) : "memory");
smp_mb();
return result; return result;
} }
......
#ifndef __BARRIER_H
#define __BARRIER_H
#define mb() \
__asm__ __volatile__("mb": : :"memory")
#define rmb() \
__asm__ __volatile__("mb": : :"memory")
#define wmb() \
__asm__ __volatile__("wmb": : :"memory")
#define read_barrier_depends() \
__asm__ __volatile__("mb": : :"memory")
#ifdef CONFIG_SMP
#define smp_mb() mb()
#define smp_rmb() rmb()
#define smp_wmb() wmb()
#define smp_read_barrier_depends() read_barrier_depends()
#else
#define smp_mb() barrier()
#define smp_rmb() barrier()
#define smp_wmb() barrier()
#define smp_read_barrier_depends() barrier()
#endif
#define set_mb(var, value) \
do { var = value; mb(); } while (0)
#define set_wmb(var, value) \
do { var = value; wmb(); } while (0)
#endif /* __BARRIER_H */
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <asm/pal.h> #include <asm/pal.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/barrier.h>
/* /*
* System defines.. Note that this is included both from .c and .S * System defines.. Note that this is included both from .c and .S
...@@ -139,36 +140,6 @@ extern void halt(void) __attribute__((noreturn)); ...@@ -139,36 +140,6 @@ extern void halt(void) __attribute__((noreturn));
struct task_struct; struct task_struct;
extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*); extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
#define mb() \
__asm__ __volatile__("mb": : :"memory")
#define rmb() \
__asm__ __volatile__("mb": : :"memory")
#define wmb() \
__asm__ __volatile__("wmb": : :"memory")
#define read_barrier_depends() \
__asm__ __volatile__("mb": : :"memory")
#ifdef CONFIG_SMP
#define smp_mb() mb()
#define smp_rmb() rmb()
#define smp_wmb() wmb()
#define smp_read_barrier_depends() read_barrier_depends()
#else
#define smp_mb() barrier()
#define smp_rmb() barrier()
#define smp_wmb() barrier()
#define smp_read_barrier_depends() barrier()
#endif
#define set_mb(var, value) \
do { var = value; mb(); } while (0)
#define set_wmb(var, value) \
do { var = value; wmb(); } while (0)
#define imb() \ #define imb() \
__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
......
...@@ -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
......
...@@ -75,4 +75,5 @@ int idr_pre_get(struct idr *idp, unsigned gfp_mask); ...@@ -75,4 +75,5 @@ int idr_pre_get(struct idr *idp, unsigned gfp_mask);
int idr_get_new(struct idr *idp, void *ptr, int *id); int idr_get_new(struct idr *idp, void *ptr, int *id);
int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id); int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
void idr_remove(struct idr *idp, int id); void idr_remove(struct idr *idp, int id);
void idr_destroy(struct idr *idp);
void idr_init(struct idr *idp); void idr_init(struct idr *idp);
...@@ -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
......
...@@ -171,7 +171,7 @@ typedef struct { ...@@ -171,7 +171,7 @@ typedef struct {
ax25_address calls[AX25_MAX_DIGIS]; ax25_address calls[AX25_MAX_DIGIS];
unsigned char repeated[AX25_MAX_DIGIS]; unsigned char repeated[AX25_MAX_DIGIS];
unsigned char ndigi; unsigned char ndigi;
char lastrepeat; signed char lastrepeat;
} ax25_digi; } ax25_digi;
typedef struct ax25_route { typedef struct ax25_route {
......
...@@ -254,8 +254,10 @@ static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa) ...@@ -254,8 +254,10 @@ static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa)
{ {
if (skb->protocol == ntohs(ETH_P_802_2)) if (skb->protocol == ntohs(ETH_P_802_2))
memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN); memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN);
else if (skb->protocol == ntohs(ETH_P_TR_802_2)) else if (skb->protocol == ntohs(ETH_P_TR_802_2)) {
memcpy(sa, tr_hdr(skb)->saddr, ETH_ALEN); memcpy(sa, tr_hdr(skb)->saddr, ETH_ALEN);
*sa &= 0x7F;
}
} }
/** /**
......
...@@ -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);
...@@ -380,14 +380,9 @@ int posix_cpu_timer_create(struct k_itimer *new_timer) ...@@ -380,14 +380,9 @@ int posix_cpu_timer_create(struct k_itimer *new_timer)
int posix_cpu_timer_del(struct k_itimer *timer) int posix_cpu_timer_del(struct k_itimer *timer)
{ {
struct task_struct *p = timer->it.cpu.task; struct task_struct *p = timer->it.cpu.task;
int ret = 0;
if (timer->it.cpu.firing) if (likely(p != NULL)) {
return TIMER_RETRY;
if (unlikely(p == NULL))
return 0;
if (!list_empty(&timer->it.cpu.entry)) {
read_lock(&tasklist_lock); read_lock(&tasklist_lock);
if (unlikely(p->signal == NULL)) { if (unlikely(p->signal == NULL)) {
/* /*
...@@ -396,18 +391,20 @@ int posix_cpu_timer_del(struct k_itimer *timer) ...@@ -396,18 +391,20 @@ int posix_cpu_timer_del(struct k_itimer *timer)
*/ */
BUG_ON(!list_empty(&timer->it.cpu.entry)); BUG_ON(!list_empty(&timer->it.cpu.entry));
} else { } else {
/*
* Take us off the task's timer list.
*/
spin_lock(&p->sighand->siglock); spin_lock(&p->sighand->siglock);
list_del(&timer->it.cpu.entry); if (timer->it.cpu.firing)
ret = TIMER_RETRY;
else
list_del(&timer->it.cpu.entry);
spin_unlock(&p->sighand->siglock); spin_unlock(&p->sighand->siglock);
} }
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
if (!ret)
put_task_struct(p);
} }
put_task_struct(p);
return 0; return ret;
} }
/* /*
...@@ -424,8 +421,6 @@ static void cleanup_timers(struct list_head *head, ...@@ -424,8 +421,6 @@ static void cleanup_timers(struct list_head *head,
cputime_t ptime = cputime_add(utime, stime); cputime_t ptime = cputime_add(utime, stime);
list_for_each_entry_safe(timer, next, head, entry) { list_for_each_entry_safe(timer, next, head, entry) {
put_task_struct(timer->task);
timer->task = NULL;
list_del_init(&timer->entry); list_del_init(&timer->entry);
if (cputime_lt(timer->expires.cpu, ptime)) { if (cputime_lt(timer->expires.cpu, ptime)) {
timer->expires.cpu = cputime_zero; timer->expires.cpu = cputime_zero;
...@@ -437,8 +432,6 @@ static void cleanup_timers(struct list_head *head, ...@@ -437,8 +432,6 @@ static void cleanup_timers(struct list_head *head,
++head; ++head;
list_for_each_entry_safe(timer, next, head, entry) { list_for_each_entry_safe(timer, next, head, entry) {
put_task_struct(timer->task);
timer->task = NULL;
list_del_init(&timer->entry); list_del_init(&timer->entry);
if (cputime_lt(timer->expires.cpu, utime)) { if (cputime_lt(timer->expires.cpu, utime)) {
timer->expires.cpu = cputime_zero; timer->expires.cpu = cputime_zero;
...@@ -450,8 +443,6 @@ static void cleanup_timers(struct list_head *head, ...@@ -450,8 +443,6 @@ static void cleanup_timers(struct list_head *head,
++head; ++head;
list_for_each_entry_safe(timer, next, head, entry) { list_for_each_entry_safe(timer, next, head, entry) {
put_task_struct(timer->task);
timer->task = NULL;
list_del_init(&timer->entry); list_del_init(&timer->entry);
if (timer->expires.sched < sched_time) { if (timer->expires.sched < sched_time) {
timer->expires.sched = 0; timer->expires.sched = 0;
...@@ -495,6 +486,9 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -495,6 +486,9 @@ static void process_timer_rebalance(struct task_struct *p,
struct task_struct *t = p; struct task_struct *t = p;
unsigned int nthreads = atomic_read(&p->signal->live); unsigned int nthreads = atomic_read(&p->signal->live);
if (!nthreads)
return;
switch (clock_idx) { switch (clock_idx) {
default: default:
BUG(); BUG();
...@@ -503,7 +497,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -503,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) ||
...@@ -518,7 +512,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -518,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) ||
...@@ -533,7 +527,7 @@ static void process_timer_rebalance(struct task_struct *p, ...@@ -533,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) {
...@@ -572,6 +566,9 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now) ...@@ -572,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);
...@@ -582,17 +579,15 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now) ...@@ -582,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);
...@@ -736,9 +731,15 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags, ...@@ -736,9 +731,15 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
* Disarm any old timer after extracting its expiry time. * Disarm any old timer after extracting its expiry time.
*/ */
BUG_ON(!irqs_disabled()); BUG_ON(!irqs_disabled());
ret = 0;
spin_lock(&p->sighand->siglock); spin_lock(&p->sighand->siglock);
old_expires = timer->it.cpu.expires; old_expires = timer->it.cpu.expires;
list_del_init(&timer->it.cpu.entry); if (unlikely(timer->it.cpu.firing)) {
timer->it.cpu.firing = -1;
ret = TIMER_RETRY;
} else
list_del_init(&timer->it.cpu.entry);
spin_unlock(&p->sighand->siglock); spin_unlock(&p->sighand->siglock);
/* /*
...@@ -786,7 +787,7 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags, ...@@ -786,7 +787,7 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
} }
} }
if (unlikely(timer->it.cpu.firing)) { if (unlikely(ret)) {
/* /*
* We are colliding with the timer actually firing. * We are colliding with the timer actually firing.
* Punt after filling in the timer's old value, and * Punt after filling in the timer's old value, and
...@@ -794,8 +795,6 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags, ...@@ -794,8 +795,6 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
* it as an overrun (thanks to bump_cpu_timer above). * it as an overrun (thanks to bump_cpu_timer above).
*/ */
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
timer->it.cpu.firing = -1;
ret = TIMER_RETRY;
goto out; goto out;
} }
...@@ -961,14 +960,16 @@ void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp) ...@@ -961,14 +960,16 @@ void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
static void check_thread_timers(struct task_struct *tsk, static void check_thread_timers(struct task_struct *tsk,
struct list_head *firing) struct list_head *firing)
{ {
int maxfire;
struct list_head *timers = tsk->cpu_timers; struct list_head *timers = tsk->cpu_timers;
maxfire = 20;
tsk->it_prof_expires = cputime_zero; tsk->it_prof_expires = cputime_zero;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (cputime_lt(prof_ticks(tsk), t->expires.cpu)) { if (!--maxfire || cputime_lt(prof_ticks(tsk), t->expires.cpu)) {
tsk->it_prof_expires = t->expires.cpu; tsk->it_prof_expires = t->expires.cpu;
break; break;
} }
...@@ -977,12 +978,13 @@ static void check_thread_timers(struct task_struct *tsk, ...@@ -977,12 +978,13 @@ static void check_thread_timers(struct task_struct *tsk,
} }
++timers; ++timers;
maxfire = 20;
tsk->it_virt_expires = cputime_zero; tsk->it_virt_expires = cputime_zero;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (cputime_lt(virt_ticks(tsk), t->expires.cpu)) { if (!--maxfire || cputime_lt(virt_ticks(tsk), t->expires.cpu)) {
tsk->it_virt_expires = t->expires.cpu; tsk->it_virt_expires = t->expires.cpu;
break; break;
} }
...@@ -991,12 +993,13 @@ static void check_thread_timers(struct task_struct *tsk, ...@@ -991,12 +993,13 @@ static void check_thread_timers(struct task_struct *tsk,
} }
++timers; ++timers;
maxfire = 20;
tsk->it_sched_expires = 0; tsk->it_sched_expires = 0;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (tsk->sched_time < t->expires.sched) { if (!--maxfire || tsk->sched_time < t->expires.sched) {
tsk->it_sched_expires = t->expires.sched; tsk->it_sched_expires = t->expires.sched;
break; break;
} }
...@@ -1013,6 +1016,7 @@ static void check_thread_timers(struct task_struct *tsk, ...@@ -1013,6 +1016,7 @@ static void check_thread_timers(struct task_struct *tsk,
static void check_process_timers(struct task_struct *tsk, static void check_process_timers(struct task_struct *tsk,
struct list_head *firing) struct list_head *firing)
{ {
int maxfire;
struct signal_struct *const sig = tsk->signal; struct signal_struct *const sig = tsk->signal;
cputime_t utime, stime, ptime, virt_expires, prof_expires; cputime_t utime, stime, ptime, virt_expires, prof_expires;
unsigned long long sched_time, sched_expires; unsigned long long sched_time, sched_expires;
...@@ -1045,12 +1049,13 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1045,12 +1049,13 @@ static void check_process_timers(struct task_struct *tsk,
} while (t != tsk); } while (t != tsk);
ptime = cputime_add(utime, stime); ptime = cputime_add(utime, stime);
maxfire = 20;
prof_expires = cputime_zero; prof_expires = cputime_zero;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (cputime_lt(ptime, t->expires.cpu)) { if (!--maxfire || cputime_lt(ptime, t->expires.cpu)) {
prof_expires = t->expires.cpu; prof_expires = t->expires.cpu;
break; break;
} }
...@@ -1059,12 +1064,13 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1059,12 +1064,13 @@ static void check_process_timers(struct task_struct *tsk,
} }
++timers; ++timers;
maxfire = 20;
virt_expires = cputime_zero; virt_expires = cputime_zero;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (cputime_lt(utime, t->expires.cpu)) { if (!--maxfire || cputime_lt(utime, t->expires.cpu)) {
virt_expires = t->expires.cpu; virt_expires = t->expires.cpu;
break; break;
} }
...@@ -1073,12 +1079,13 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1073,12 +1079,13 @@ static void check_process_timers(struct task_struct *tsk,
} }
++timers; ++timers;
maxfire = 20;
sched_expires = 0; sched_expires = 0;
while (!list_empty(timers)) { while (!list_empty(timers)) {
struct cpu_timer_list *t = list_entry(timers->next, struct cpu_timer_list *t = list_entry(timers->next,
struct cpu_timer_list, struct cpu_timer_list,
entry); entry);
if (sched_time < t->expires.sched) { if (!--maxfire || sched_time < t->expires.sched) {
sched_expires = t->expires.sched; sched_expires = t->expires.sched;
break; break;
} }
...@@ -1161,6 +1168,9 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1161,6 +1168,9 @@ static void check_process_timers(struct task_struct *tsk,
unsigned long long sched_left, sched; unsigned long long sched_left, sched;
const unsigned int nthreads = atomic_read(&sig->live); const unsigned int nthreads = atomic_read(&sig->live);
if (!nthreads)
return;
prof_left = cputime_sub(prof_expires, utime); prof_left = cputime_sub(prof_expires, utime);
prof_left = cputime_sub(prof_left, stime); prof_left = cputime_sub(prof_left, stime);
prof_left = cputime_div(prof_left, nthreads); prof_left = cputime_div(prof_left, nthreads);
...@@ -1197,7 +1207,7 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1197,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);
} }
} }
......
...@@ -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
......
...@@ -345,6 +345,19 @@ void idr_remove(struct idr *idp, int id) ...@@ -345,6 +345,19 @@ void idr_remove(struct idr *idp, int id)
} }
EXPORT_SYMBOL(idr_remove); EXPORT_SYMBOL(idr_remove);
/**
* idr_destroy - release all cached layers within an idr tree
* idp: idr handle
*/
void idr_destroy(struct idr *idp)
{
while (idp->id_free_cnt) {
struct idr_layer *p = alloc_layer(idp);
kmem_cache_free(idr_layer_cache, p);
}
}
EXPORT_SYMBOL(idr_destroy);
/** /**
* idr_find - return pointer for given id * idr_find - return pointer for given id
* @idp: idr handle * @idp: idr handle
......
...@@ -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;
......
...@@ -340,9 +340,10 @@ static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev) ...@@ -340,9 +340,10 @@ static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
unsigned int hash, rii_p = 0; unsigned int hash, rii_p = 0;
unsigned long flags; unsigned long flags;
struct rif_cache *entry; struct rif_cache *entry;
unsigned char saddr0;
spin_lock_irqsave(&rif_lock, flags); spin_lock_irqsave(&rif_lock, flags);
saddr0 = trh->saddr[0];
/* /*
* Firstly see if the entry exists * Firstly see if the entry exists
...@@ -395,7 +396,6 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n", ...@@ -395,7 +396,6 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK); entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short)); memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
entry->local_ring = 0; entry->local_ring = 0;
trh->saddr[0]|=TR_RII; /* put the routing indicator back for tcpdump */
} }
else else
{ {
...@@ -422,6 +422,7 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n", ...@@ -422,6 +422,7 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
} }
entry->last_used=jiffies; entry->last_used=jiffies;
} }
trh->saddr[0]=saddr0; /* put the routing indicator back for tcpdump */
spin_unlock_irqrestore(&rif_lock, flags); spin_unlock_irqrestore(&rif_lock, flags);
} }
......
...@@ -175,39 +175,10 @@ static void pneigh_queue_purge(struct sk_buff_head *list) ...@@ -175,39 +175,10 @@ static void pneigh_queue_purge(struct sk_buff_head *list)
} }
} }
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev) static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
{ {
int i; int i;
write_lock_bh(&tbl->lock);
for (i=0; i <= tbl->hash_mask; i++) {
struct neighbour *n, **np;
np = &tbl->hash_buckets[i];
while ((n = *np) != NULL) {
if (dev && n->dev != dev) {
np = &n->next;
continue;
}
*np = n->next;
write_lock_bh(&n->lock);
n->dead = 1;
neigh_del_timer(n);
write_unlock_bh(&n->lock);
neigh_release(n);
}
}
write_unlock_bh(&tbl->lock);
}
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
{
int i;
write_lock_bh(&tbl->lock);
for (i = 0; i <= tbl->hash_mask; i++) { for (i = 0; i <= tbl->hash_mask; i++) {
struct neighbour *n, **np = &tbl->hash_buckets[i]; struct neighbour *n, **np = &tbl->hash_buckets[i];
...@@ -243,7 +214,19 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev) ...@@ -243,7 +214,19 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
neigh_release(n); neigh_release(n);
} }
} }
}
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
{
write_lock_bh(&tbl->lock);
neigh_flush_dev(tbl, dev);
write_unlock_bh(&tbl->lock);
}
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
{
write_lock_bh(&tbl->lock);
neigh_flush_dev(tbl, dev);
pneigh_ifdown(tbl, dev); pneigh_ifdown(tbl, dev);
write_unlock_bh(&tbl->lock); write_unlock_bh(&tbl->lock);
...@@ -732,6 +715,7 @@ static inline void neigh_add_timer(struct neighbour *n, unsigned long when) ...@@ -732,6 +715,7 @@ static inline void neigh_add_timer(struct neighbour *n, unsigned long when)
if (unlikely(mod_timer(&n->timer, when))) { if (unlikely(mod_timer(&n->timer, when))) {
printk("NEIGH: BUG, double timer add, state is %x\n", printk("NEIGH: BUG, double timer add, state is %x\n",
n->nud_state); n->nud_state);
dump_stack();
} }
} }
...@@ -815,10 +799,10 @@ static void neigh_timer_handler(unsigned long arg) ...@@ -815,10 +799,10 @@ static void neigh_timer_handler(unsigned long arg)
} }
if (neigh->nud_state & NUD_IN_TIMER) { if (neigh->nud_state & NUD_IN_TIMER) {
neigh_hold(neigh);
if (time_before(next, jiffies + HZ/2)) if (time_before(next, jiffies + HZ/2))
next = jiffies + HZ/2; next = jiffies + HZ/2;
neigh_add_timer(neigh, next); if (!mod_timer(&neigh->timer, next))
neigh_hold(neigh);
} }
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
struct sk_buff *skb = skb_peek(&neigh->arp_queue); struct sk_buff *skb = skb_peek(&neigh->arp_queue);
......
...@@ -410,6 +410,9 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) ...@@ -410,6 +410,9 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
C(nfct); C(nfct);
nf_conntrack_get(skb->nfct); nf_conntrack_get(skb->nfct);
C(nfctinfo); C(nfctinfo);
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
C(ipvs_property);
#endif
#ifdef CONFIG_BRIDGE_NETFILTER #ifdef CONFIG_BRIDGE_NETFILTER
C(nf_bridge); C(nf_bridge);
nf_bridge_get(skb->nf_bridge); nf_bridge_get(skb->nf_bridge);
...@@ -467,6 +470,9 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) ...@@ -467,6 +470,9 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
new->nfct = old->nfct; new->nfct = old->nfct;
nf_conntrack_get(old->nfct); nf_conntrack_get(old->nfct);
new->nfctinfo = old->nfctinfo; new->nfctinfo = old->nfctinfo;
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
new->ipvs_property = old->ipvs_property;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER #ifdef CONFIG_BRIDGE_NETFILTER
new->nf_bridge = old->nf_bridge; new->nf_bridge = old->nf_bridge;
nf_bridge_get(old->nf_bridge); nf_bridge_get(old->nf_bridge);
......
...@@ -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;
} }
......
...@@ -391,6 +391,9 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) ...@@ -391,6 +391,9 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
to->nfct = from->nfct; to->nfct = from->nfct;
nf_conntrack_get(to->nfct); nf_conntrack_get(to->nfct);
to->nfctinfo = from->nfctinfo; to->nfctinfo = from->nfctinfo;
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
to->ipvs_property = from->ipvs_property;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER #ifdef CONFIG_BRIDGE_NETFILTER
nf_bridge_put(to->nf_bridge); nf_bridge_put(to->nf_bridge);
to->nf_bridge = from->nf_bridge; to->nf_bridge = from->nf_bridge;
......
...@@ -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) {
......
...@@ -483,7 +483,7 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen) ...@@ -483,7 +483,7 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)
goto done; goto done;
} }
fl1 = sfl->fl; fl1 = sfl->fl;
atomic_inc(&fl->users); atomic_inc(&fl1->users);
break; break;
} }
} }
......
...@@ -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 */
......
...@@ -879,7 +879,7 @@ static ssize_t sel_commit_bools_write(struct file *filep, ...@@ -879,7 +879,7 @@ static ssize_t sel_commit_bools_write(struct file *filep,
if (sscanf(page, "%d", &new_value) != 1) if (sscanf(page, "%d", &new_value) != 1)
goto out; goto out;
if (new_value) { if (new_value && bool_pending_values) {
security_set_bools(bool_num, bool_pending_values); security_set_bools(bool_num, bool_pending_values);
} }
...@@ -952,6 +952,7 @@ static int sel_make_bools(void) ...@@ -952,6 +952,7 @@ static int sel_make_bools(void)
/* remove any existing files */ /* remove any existing files */
kfree(bool_pending_values); kfree(bool_pending_values);
bool_pending_values = NULL;
sel_remove_bools(dir); sel_remove_bools(dir);
...@@ -1002,6 +1003,7 @@ static int sel_make_bools(void) ...@@ -1002,6 +1003,7 @@ static int sel_make_bools(void)
} }
return ret; return ret;
err: err:
kfree(values);
d_genocide(dir); d_genocide(dir);
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
......
...@@ -650,8 +650,10 @@ void policydb_destroy(struct policydb *p) ...@@ -650,8 +650,10 @@ void policydb_destroy(struct policydb *p)
} }
if (lrt) kfree(lrt); if (lrt) kfree(lrt);
for (i = 0; i < p->p_types.nprim; i++) if (p->type_attr_map) {
ebitmap_destroy(&p->type_attr_map[i]); for (i = 0; i < p->p_types.nprim; i++)
ebitmap_destroy(&p->type_attr_map[i]);
}
kfree(p->type_attr_map); kfree(p->type_attr_map);
return; return;
......
...@@ -828,7 +828,8 @@ static int snd_generic_suspend(struct device *dev, pm_message_t state, u32 level ...@@ -828,7 +828,8 @@ static int snd_generic_suspend(struct device *dev, pm_message_t state, u32 level
card = get_snd_generic_card(dev); card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D3hot) if (card->power_state == SNDRV_CTL_POWER_D3hot)
return 0; return 0;
card->pm_suspend(card, PMSG_SUSPEND); if (card->pm_suspend)
card->pm_suspend(card, PMSG_SUSPEND);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
return 0; return 0;
} }
...@@ -843,7 +844,8 @@ static int snd_generic_resume(struct device *dev, u32 level) ...@@ -843,7 +844,8 @@ static int snd_generic_resume(struct device *dev, u32 level)
card = get_snd_generic_card(dev); card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D0) if (card->power_state == SNDRV_CTL_POWER_D0)
return 0; return 0;
card->pm_resume(card); if (card->pm_suspend)
card->pm_resume(card);
snd_power_change_state(card, SNDRV_CTL_POWER_D0); snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册