diff options
| -rw-r--r-- | arch/x86/include/asm/numa.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 23 | ||||
| -rw-r--r-- | arch/x86/mm/numa.c | 31 | ||||
| -rw-r--r-- | arch/x86/mm/numa_emulation.c | 20 | ||||
| -rw-r--r-- | drivers/char/agp/generic.c | 19 | ||||
| -rw-r--r-- | drivers/char/virtio_console.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 73 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 2 | ||||
| -rw-r--r-- | drivers/md/raid5.c | 2 | ||||
| -rw-r--r-- | drivers/pci/intel-iommu.c | 55 | ||||
| -rw-r--r-- | drivers/virtio/virtio_pci.c | 15 | ||||
| -rw-r--r-- | drivers/virtio/virtio_ring.c | 1 | ||||
| -rw-r--r-- | fs/xattr.c | 2 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_message.c | 4 | 
16 files changed, 139 insertions, 132 deletions
diff --git a/arch/x86/include/asm/numa.h b/arch/x86/include/asm/numa.h index 3d4dab43c99..a50fc9f493b 100644 --- a/arch/x86/include/asm/numa.h +++ b/arch/x86/include/asm/numa.h @@ -51,7 +51,7 @@ static inline void numa_remove_cpu(int cpu)		{ }  #endif	/* CONFIG_NUMA */  #ifdef CONFIG_DEBUG_PER_CPU_MAPS -struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable); +void debug_cpumask_set_cpu(int cpu, int node, bool enable);  #endif  #endif	/* _ASM_X86_NUMA_H */ diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 8ed8908cc9f..c2871d3c71b 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -312,26 +312,6 @@ void __cpuinit smp_store_cpu_info(int id)  		identify_secondary_cpu(c);  } -static void __cpuinit check_cpu_siblings_on_same_node(int cpu1, int cpu2) -{ -	int node1 = early_cpu_to_node(cpu1); -	int node2 = early_cpu_to_node(cpu2); - -	/* -	 * Our CPU scheduler assumes all logical cpus in the same physical cpu -	 * share the same node. But, buggy ACPI or NUMA emulation might assign -	 * them to different node. Fix it. -	 */ -	if (node1 != node2) { -		pr_warning("CPU %d in node %d and CPU %d in node %d are in the same physical CPU. forcing same node %d\n", -			   cpu1, node1, cpu2, node2, node2); - -		numa_remove_cpu(cpu1); -		numa_set_node(cpu1, node2); -		numa_add_cpu(cpu1); -	} -} -  static void __cpuinit link_thread_siblings(int cpu1, int cpu2)  {  	cpumask_set_cpu(cpu1, cpu_sibling_mask(cpu2)); @@ -340,7 +320,6 @@ static void __cpuinit link_thread_siblings(int cpu1, int cpu2)  	cpumask_set_cpu(cpu2, cpu_core_mask(cpu1));  	cpumask_set_cpu(cpu1, cpu_llc_shared_mask(cpu2));  	cpumask_set_cpu(cpu2, cpu_llc_shared_mask(cpu1)); -	check_cpu_siblings_on_same_node(cpu1, cpu2);  } @@ -382,12 +361,10 @@ void __cpuinit set_cpu_sibling_map(int cpu)  		    per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) {  			cpumask_set_cpu(i, cpu_llc_shared_mask(cpu));  			cpumask_set_cpu(cpu, cpu_llc_shared_mask(i)); -			check_cpu_siblings_on_same_node(cpu, i);  		}  		if (c->phys_proc_id == cpu_data(i).phys_proc_id) {  			cpumask_set_cpu(i, cpu_core_mask(cpu));  			cpumask_set_cpu(cpu, cpu_core_mask(i)); -			check_cpu_siblings_on_same_node(cpu, i);  			/*  			 *  Does this new cpu bringup a new core?  			 */ diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 9559d360fde..745258dfc4d 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c @@ -213,53 +213,48 @@ int early_cpu_to_node(int cpu)  	return per_cpu(x86_cpu_to_node_map, cpu);  } -struct cpumask __cpuinit *debug_cpumask_set_cpu(int cpu, int enable) +void debug_cpumask_set_cpu(int cpu, int node, bool enable)  { -	int node = early_cpu_to_node(cpu);  	struct cpumask *mask;  	char buf[64];  	if (node == NUMA_NO_NODE) {  		/* early_cpu_to_node() already emits a warning and trace */ -		return NULL; +		return;  	}  	mask = node_to_cpumask_map[node];  	if (!mask) {  		pr_err("node_to_cpumask_map[%i] NULL\n", node);  		dump_stack(); -		return NULL; +		return;  	} +	if (enable) +		cpumask_set_cpu(cpu, mask); +	else +		cpumask_clear_cpu(cpu, mask); +  	cpulist_scnprintf(buf, sizeof(buf), mask);  	printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",  		enable ? "numa_add_cpu" : "numa_remove_cpu",  		cpu, node, buf); -	return mask; +	return;  }  # ifndef CONFIG_NUMA_EMU -static void __cpuinit numa_set_cpumask(int cpu, int enable) +static void __cpuinit numa_set_cpumask(int cpu, bool enable)  { -	struct cpumask *mask; - -	mask = debug_cpumask_set_cpu(cpu, enable); -	if (!mask) -		return; - -	if (enable) -		cpumask_set_cpu(cpu, mask); -	else -		cpumask_clear_cpu(cpu, mask); +	debug_cpumask_set_cpu(cpu, early_cpu_to_node(cpu), enable);  }  void __cpuinit numa_add_cpu(int cpu)  { -	numa_set_cpumask(cpu, 1); +	numa_set_cpumask(cpu, true);  }  void __cpuinit numa_remove_cpu(int cpu)  { -	numa_set_cpumask(cpu, 0); +	numa_set_cpumask(cpu, false);  }  # endif	/* !CONFIG_NUMA_EMU */ diff --git a/arch/x86/mm/numa_emulation.c b/arch/x86/mm/numa_emulation.c index ad091e4cff1..de84cc14037 100644 --- a/arch/x86/mm/numa_emulation.c +++ b/arch/x86/mm/numa_emulation.c @@ -454,10 +454,9 @@ void __cpuinit numa_remove_cpu(int cpu)  		cpumask_clear_cpu(cpu, node_to_cpumask_map[i]);  }  #else	/* !CONFIG_DEBUG_PER_CPU_MAPS */ -static void __cpuinit numa_set_cpumask(int cpu, int enable) +static void __cpuinit numa_set_cpumask(int cpu, bool enable)  { -	struct cpumask *mask; -	int nid, physnid, i; +	int nid, physnid;  	nid = early_cpu_to_node(cpu);  	if (nid == NUMA_NO_NODE) { @@ -467,28 +466,21 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)  	physnid = emu_nid_to_phys[nid]; -	for_each_online_node(i) { +	for_each_online_node(nid) {  		if (emu_nid_to_phys[nid] != physnid)  			continue; -		mask = debug_cpumask_set_cpu(cpu, enable); -		if (!mask) -			return; - -		if (enable) -			cpumask_set_cpu(cpu, mask); -		else -			cpumask_clear_cpu(cpu, mask); +		debug_cpumask_set_cpu(cpu, nid, enable);  	}  }  void __cpuinit numa_add_cpu(int cpu)  { -	numa_set_cpumask(cpu, 1); +	numa_set_cpumask(cpu, true);  }  void __cpuinit numa_remove_cpu(int cpu)  { -	numa_set_cpumask(cpu, 0); +	numa_set_cpumask(cpu, false);  }  #endif	/* !CONFIG_DEBUG_PER_CPU_MAPS */ diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 012cba0d6d9..b072648dc3f 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c @@ -115,6 +115,9 @@ static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)  	struct agp_memory *new;  	unsigned long alloc_size = num_agp_pages*sizeof(struct page *); +	if (INT_MAX/sizeof(struct page *) < num_agp_pages) +		return NULL; +  	new = kzalloc(sizeof(struct agp_memory), GFP_KERNEL);  	if (new == NULL)  		return NULL; @@ -234,11 +237,14 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,  	int scratch_pages;  	struct agp_memory *new;  	size_t i; +	int cur_memory;  	if (!bridge)  		return NULL; -	if ((atomic_read(&bridge->current_memory_agp) + page_count) > bridge->max_memory_agp) +	cur_memory = atomic_read(&bridge->current_memory_agp); +	if ((cur_memory + page_count > bridge->max_memory_agp) || +	    (cur_memory + page_count < page_count))  		return NULL;  	if (type >= AGP_USER_TYPES) { @@ -1089,8 +1095,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)  		return -EINVAL;  	} -	/* AK: could wrap */ -	if ((pg_start + mem->page_count) > num_entries) +	if (((pg_start + mem->page_count) > num_entries) || +	    ((pg_start + mem->page_count) < pg_start))  		return -EINVAL;  	j = pg_start; @@ -1124,7 +1130,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)  {  	size_t i;  	struct agp_bridge_data *bridge; -	int mask_type; +	int mask_type, num_entries;  	bridge = mem->bridge;  	if (!bridge) @@ -1136,6 +1142,11 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)  	if (type != mem->type)  		return -EINVAL; +	num_entries = agp_num_entries(); +	if (((pg_start + mem->page_count) > num_entries) || +	    ((pg_start + mem->page_count) < pg_start)) +		return -EINVAL; +  	mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);  	if (mask_type != 0) {  		/* The generic routines know nothing of memory types */ diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 84b164d1eb2..838568a7dbf 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1280,18 +1280,7 @@ static void unplug_port(struct port *port)  		spin_lock_irq(&pdrvdata_lock);  		list_del(&port->cons.list);  		spin_unlock_irq(&pdrvdata_lock); -#if 0 -		/* -		 * hvc_remove() not called as removing one hvc port -		 * results in other hvc ports getting frozen. -		 * -		 * Once this is resolved in hvc, this functionality -		 * will be enabled.  Till that is done, the -EPIPE -		 * return from get_chars() above will help -		 * hvc_console.c to clean up on ports we remove here. -		 */  		hvc_remove(port->cons.hvc); -#endif  	}  	/* Remove unused data this port might have received. */ diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 432fc04c6bf..e522c702b04 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -3771,8 +3771,11 @@ static bool g4x_compute_wm0(struct drm_device *dev,  	int entries, tlb_miss;  	crtc = intel_get_crtc_for_plane(dev, plane); -	if (crtc->fb == NULL || !crtc->enabled) +	if (crtc->fb == NULL || !crtc->enabled) { +		*cursor_wm = cursor->guard_size; +		*plane_wm = display->guard_size;  		return false; +	}  	htotal = crtc->mode.htotal;  	hdisplay = crtc->mode.hdisplay; @@ -6215,36 +6218,6 @@ cleanup_work:  	return ret;  } -static void intel_crtc_reset(struct drm_crtc *crtc) -{ -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - -	/* Reset flags back to the 'unknown' status so that they -	 * will be correctly set on the initial modeset. -	 */ -	intel_crtc->dpms_mode = -1; -} - -static struct drm_crtc_helper_funcs intel_helper_funcs = { -	.dpms = intel_crtc_dpms, -	.mode_fixup = intel_crtc_mode_fixup, -	.mode_set = intel_crtc_mode_set, -	.mode_set_base = intel_pipe_set_base, -	.mode_set_base_atomic = intel_pipe_set_base_atomic, -	.load_lut = intel_crtc_load_lut, -	.disable = intel_crtc_disable, -}; - -static const struct drm_crtc_funcs intel_crtc_funcs = { -	.reset = intel_crtc_reset, -	.cursor_set = intel_crtc_cursor_set, -	.cursor_move = intel_crtc_cursor_move, -	.gamma_set = intel_crtc_gamma_set, -	.set_config = drm_crtc_helper_set_config, -	.destroy = intel_crtc_destroy, -	.page_flip = intel_crtc_page_flip, -}; -  static void intel_sanitize_modesetting(struct drm_device *dev,  				       int pipe, int plane)  { @@ -6281,6 +6254,42 @@ static void intel_sanitize_modesetting(struct drm_device *dev,  	intel_disable_pipe(dev_priv, pipe);  } +static void intel_crtc_reset(struct drm_crtc *crtc) +{ +	struct drm_device *dev = crtc->dev; +	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + +	/* Reset flags back to the 'unknown' status so that they +	 * will be correctly set on the initial modeset. +	 */ +	intel_crtc->dpms_mode = -1; + +	/* We need to fix up any BIOS configuration that conflicts with +	 * our expectations. +	 */ +	intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane); +} + +static struct drm_crtc_helper_funcs intel_helper_funcs = { +	.dpms = intel_crtc_dpms, +	.mode_fixup = intel_crtc_mode_fixup, +	.mode_set = intel_crtc_mode_set, +	.mode_set_base = intel_pipe_set_base, +	.mode_set_base_atomic = intel_pipe_set_base_atomic, +	.load_lut = intel_crtc_load_lut, +	.disable = intel_crtc_disable, +}; + +static const struct drm_crtc_funcs intel_crtc_funcs = { +	.reset = intel_crtc_reset, +	.cursor_set = intel_crtc_cursor_set, +	.cursor_move = intel_crtc_cursor_move, +	.gamma_set = intel_crtc_gamma_set, +	.set_config = drm_crtc_helper_set_config, +	.destroy = intel_crtc_destroy, +	.page_flip = intel_crtc_page_flip, +}; +  static void intel_crtc_init(struct drm_device *dev, int pipe)  {  	drm_i915_private_t *dev_priv = dev->dev_private; @@ -6330,8 +6339,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)  	setup_timer(&intel_crtc->idle_timer, intel_crtc_idle_timer,  		    (unsigned long)intel_crtc); - -	intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);  }  int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index 4256b8ef394..6b22c1dcc01 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c @@ -1151,10 +1151,10 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,  			    (video_levels->blank << TV_BLANK_LEVEL_SHIFT)));  	{  		int pipeconf_reg = PIPECONF(pipe); -		int dspcntr_reg = DSPCNTR(pipe); +		int dspcntr_reg = DSPCNTR(intel_crtc->plane);  		int pipeconf = I915_READ(pipeconf_reg);  		int dspcntr = I915_READ(dspcntr_reg); -		int dspbase_reg = DSPADDR(pipe); +		int dspbase_reg = DSPADDR(intel_crtc->plane);  		int xpos = 0x0, ypos = 0x0;  		unsigned int xsize, ysize;  		/* Pipe must be off here */ @@ -1378,7 +1378,9 @@ intel_tv_detect(struct drm_connector *connector, bool force)  	if (type < 0)  		return connector_status_disconnected; +	intel_tv->type = type;  	intel_tv_find_better_format(connector); +  	return connector_status_connected;  } @@ -1670,8 +1672,7 @@ intel_tv_init(struct drm_device *dev)  	 *  	 * More recent chipsets favour HDMI rather than integrated S-Video.  	 */ -	connector->polled = -		DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; +	connector->polled = DRM_CONNECTOR_POLL_CONNECT;  	drm_connector_init(dev, connector, &intel_tv_connector_funcs,  			   DRM_MODE_CONNECTOR_SVIDEO); diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 43fd0167448..e9bc135d918 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -2580,7 +2580,7 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)  	u32 wptr, tmp;  	if (rdev->wb.enabled) -		wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]; +		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);  	else  		wptr = RREG32(IH_RB_WPTR); diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 15d58292677..6f27593901c 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -3231,7 +3231,7 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev)  	u32 wptr, tmp;  	if (rdev->wb.enabled) -		wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]; +		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);  	else  		wptr = RREG32(IH_RB_WPTR); diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index fd500112f13..49bf5f89143 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -5678,7 +5678,7 @@ static void raid5_quiesce(mddev_t *mddev, int state)  static void *raid45_takeover_raid0(mddev_t *mddev, int level)  {  	struct raid0_private_data *raid0_priv = mddev->private; -	unsigned long long sectors; +	sector_t sectors;  	/* for raid0 takeover only one zone is supported */  	if (raid0_priv->nr_strip_zones > 1) { diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 505c1c7075f..d552d2c7784 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -1299,7 +1299,7 @@ static void iommu_detach_domain(struct dmar_domain *domain,  static struct iova_domain reserved_iova_list;  static struct lock_class_key reserved_rbtree_key; -static void dmar_init_reserved_ranges(void) +static int dmar_init_reserved_ranges(void)  {  	struct pci_dev *pdev = NULL;  	struct iova *iova; @@ -1313,8 +1313,10 @@ static void dmar_init_reserved_ranges(void)  	/* IOAPIC ranges shouldn't be accessed by DMA */  	iova = reserve_iova(&reserved_iova_list, IOVA_PFN(IOAPIC_RANGE_START),  		IOVA_PFN(IOAPIC_RANGE_END)); -	if (!iova) +	if (!iova) {  		printk(KERN_ERR "Reserve IOAPIC range failed\n"); +		return -ENODEV; +	}  	/* Reserve all PCI MMIO to avoid peer-to-peer access */  	for_each_pci_dev(pdev) { @@ -1327,11 +1329,13 @@ static void dmar_init_reserved_ranges(void)  			iova = reserve_iova(&reserved_iova_list,  					    IOVA_PFN(r->start),  					    IOVA_PFN(r->end)); -			if (!iova) +			if (!iova) {  				printk(KERN_ERR "Reserve iova failed\n"); +				return -ENODEV; +			}  		}  	} - +	return 0;  }  static void domain_reserve_special_ranges(struct dmar_domain *domain) @@ -1835,7 +1839,7 @@ static struct dmar_domain *get_domain_for_dev(struct pci_dev *pdev, int gaw)  	ret = iommu_attach_domain(domain, iommu);  	if (ret) { -		domain_exit(domain); +		free_domain_mem(domain);  		goto error;  	} @@ -2213,7 +2217,7 @@ static int __init iommu_prepare_static_identity_mapping(int hw)  	return 0;  } -int __init init_dmars(void) +static int __init init_dmars(int force_on)  {  	struct dmar_drhd_unit *drhd;  	struct dmar_rmrr_unit *rmrr; @@ -2393,8 +2397,15 @@ int __init init_dmars(void)  	 *   enable translation  	 */  	for_each_drhd_unit(drhd) { -		if (drhd->ignored) +		if (drhd->ignored) { +			/* +			 * we always have to disable PMRs or DMA may fail on +			 * this device +			 */ +			if (force_on) +				iommu_disable_protect_mem_regions(drhd->iommu);  			continue; +		}  		iommu = drhd->iommu;  		iommu_flush_write_buffer(iommu); @@ -3240,9 +3251,15 @@ static int device_notifier(struct notifier_block *nb,  	if (!domain)  		return 0; -	if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) +	if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) {  		domain_remove_one_dev_info(domain, pdev); +		if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) && +		    !(domain->flags & DOMAIN_FLAG_STATIC_IDENTITY) && +		    list_empty(&domain->devices)) +			domain_exit(domain); +	} +  	return 0;  } @@ -3277,12 +3294,21 @@ int __init intel_iommu_init(void)  	if (no_iommu || dmar_disabled)  		return -ENODEV; -	iommu_init_mempool(); -	dmar_init_reserved_ranges(); +	if (iommu_init_mempool()) { +		if (force_on) +			panic("tboot: Failed to initialize iommu memory\n"); +		return 	-ENODEV; +	} + +	if (dmar_init_reserved_ranges()) { +		if (force_on) +			panic("tboot: Failed to reserve iommu ranges\n"); +		return 	-ENODEV; +	}  	init_no_remapping_devices(); -	ret = init_dmars(); +	ret = init_dmars(force_on);  	if (ret) {  		if (force_on)  			panic("tboot: Failed to initialize DMARs\n"); @@ -3391,6 +3417,11 @@ static void domain_remove_one_dev_info(struct dmar_domain *domain,  		domain->iommu_count--;  		domain_update_iommu_cap(domain);  		spin_unlock_irqrestore(&domain->iommu_lock, tmp_flags); + +		spin_lock_irqsave(&iommu->lock, tmp_flags); +		clear_bit(domain->id, iommu->domain_ids); +		iommu->domains[domain->id] = NULL; +		spin_unlock_irqrestore(&iommu->lock, tmp_flags);  	}  	spin_unlock_irqrestore(&device_domain_lock, flags); @@ -3607,9 +3638,9 @@ static int intel_iommu_attach_device(struct iommu_domain *domain,  		pte = dmar_domain->pgd;  		if (dma_pte_present(pte)) { -			free_pgtable_page(dmar_domain->pgd);  			dmar_domain->pgd = (struct dma_pte *)  				phys_to_virt(dma_pte_addr(pte)); +			free_pgtable_page(pte);  		}  		dmar_domain->agaw--;  	} diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 4fb5b2bf234..4bcc8b82640 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -590,15 +590,10 @@ static struct virtio_config_ops virtio_pci_config_ops = {  static void virtio_pci_release_dev(struct device *_d)  { -	struct virtio_device *dev = container_of(_d, struct virtio_device, dev); +	struct virtio_device *dev = container_of(_d, struct virtio_device, +						 dev);  	struct virtio_pci_device *vp_dev = to_vp_device(dev); -	struct pci_dev *pci_dev = vp_dev->pci_dev; -	vp_del_vqs(dev); -	pci_set_drvdata(pci_dev, NULL); -	pci_iounmap(pci_dev, vp_dev->ioaddr); -	pci_release_regions(pci_dev); -	pci_disable_device(pci_dev);  	kfree(vp_dev);  } @@ -681,6 +676,12 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev)  	struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);  	unregister_virtio_device(&vp_dev->vdev); + +	vp_del_vqs(&vp_dev->vdev); +	pci_set_drvdata(pci_dev, NULL); +	pci_iounmap(pci_dev, vp_dev->ioaddr); +	pci_release_regions(pci_dev); +	pci_disable_device(pci_dev);  }  #ifdef CONFIG_PM diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index cc2f73e0347..b0043fb26a4 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -371,6 +371,7 @@ void *virtqueue_detach_unused_buf(struct virtqueue *_vq)  		/* detach_buf clears data, so grab it now. */  		buf = vq->data[i];  		detach_buf(vq, i); +		vq->vring.avail->idx--;  		END_USE(vq);  		return buf;  	} diff --git a/fs/xattr.c b/fs/xattr.c index a19acdb81cd..f1ef94974de 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -666,7 +666,7 @@ generic_setxattr(struct dentry *dentry, const char *name, const void *value, siz  	handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name);  	if (!handler)  		return -EOPNOTSUPP; -	return handler->set(dentry, name, value, size, 0, handler->flags); +	return handler->set(dentry, name, value, size, flags, handler->flags);  }  /* diff --git a/fs/xfs/linux-2.6/xfs_message.c b/fs/xfs/linux-2.6/xfs_message.c index 3ca79560911..9f76cceb678 100644 --- a/fs/xfs/linux-2.6/xfs_message.c +++ b/fs/xfs/linux-2.6/xfs_message.c @@ -34,8 +34,10 @@ __xfs_printk(  	const struct xfs_mount	*mp,  	struct va_format	*vaf)  { -	if (mp && mp->m_fsname) +	if (mp && mp->m_fsname) {  		printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf); +		return; +	}  	printk("%sXFS: %pV\n", level, vaf);  }  |