Re: [PATCH] x86_32: trim memory by updating e820 v3

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Ingo Molnar
Date: Tuesday, April 29, 2008 - 3:37 am

* Jesse Barnes <jesse.barnes@intel.com> wrote:


yes, the patch below is queued up for an eventual v2.6.26 merge. If it 
looks fine to you, could you please ack it so that we can send it to 
Linus? I'd like to do this after some pending PAT fixes are upstream.

	Ingo

---------------->
Subject: x86, PAT: export resource_wc in pci sysfs
From: venkatesh.pallipadi@intel.com
Date: Tue, 18 Mar 2008 17:00:22 -0700

For the ranges with IORESOURCE_PREFETCH, export a new resource_wc interface in
pci /sysfs along with resource (which is uncached).

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 Documentation/filesystems/sysfs-pci.txt |    1 
 drivers/pci/pci-sysfs.c                 |   82 +++++++++++++++++++++++---------
 include/linux/pci.h                     |    1 
 3 files changed, 63 insertions(+), 21 deletions(-)

Index: linux-x86.q/Documentation/filesystems/sysfs-pci.txt
===================================================================
--- linux-x86.q.orig/Documentation/filesystems/sysfs-pci.txt
+++ linux-x86.q/Documentation/filesystems/sysfs-pci.txt
@@ -36,6 +36,7 @@ files, each with their own function.
        local_cpus	   nearby CPU mask (cpumask, ro)
        resource		   PCI resource host addresses (ascii, ro)
        resource0..N	   PCI resource N, if present (binary, mmap)
+       resource0_wc..N_wc  PCI WC map resource N, if prefetchable (binary, mmap)
        rom		   PCI ROM resource, if present (binary, ro)
        subsystem_device	   PCI subsystem device (ascii, ro)
        subsystem_vendor	   PCI subsystem vendor (ascii, ro)
Index: linux-x86.q/drivers/pci/pci-sysfs.c
===================================================================
--- linux-x86.q.orig/drivers/pci/pci-sysfs.c
+++ linux-x86.q/drivers/pci/pci-sysfs.c
@@ -489,13 +489,14 @@ pci_mmap_legacy_mem(struct kobject *kobj
  * @kobj: kobject for mapping
  * @attr: struct bin_attribute for the file being mapped
  * @vma: struct vm_area_struct passed into the mmap
+ * @write_combine: 1 for write_combine mapping
  *
  * Use the regular PCI mapping routines to map a PCI resource into userspace.
  * FIXME: write combining?  maybe automatic for prefetchable regions?
  */
 static int
 pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
-		  struct vm_area_struct *vma)
+		  struct vm_area_struct *vma, int write_combine)
 {
 	struct pci_dev *pdev = to_pci_dev(container_of(kobj,
 						       struct device, kobj));
@@ -518,7 +519,21 @@ pci_mmap_resource(struct kobject *kobj, 
 	vma->vm_pgoff += start >> PAGE_SHIFT;
 	mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
 
-	return pci_mmap_page_range(pdev, vma, mmap_type, 0);
+	return pci_mmap_page_range(pdev, vma, mmap_type, write_combine);
+}
+
+static int
+pci_mmap_resource_uc(struct kobject *kobj, struct bin_attribute *attr,
+		     struct vm_area_struct *vma)
+{
+	return pci_mmap_resource(kobj, attr, vma, 0);
+}
+
+static int
+pci_mmap_resource_wc(struct kobject *kobj, struct bin_attribute *attr,
+		     struct vm_area_struct *vma)
+{
+	return pci_mmap_resource(kobj, attr, vma, 1);
 }
 
 /**
@@ -541,9 +556,46 @@ pci_remove_resource_files(struct pci_dev
 			sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
 			kfree(res_attr);
 		}
+
+		res_attr = pdev->res_attr_wc[i];
+		if (res_attr) {
+			sysfs_remove_bin_file(&pdev->dev.kobj, res_attr);
+			kfree(res_attr);
+		}
 	}
 }
 
+static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
+{
+	/* allocate attribute structure, piggyback attribute name */
+	int name_len = write_combine ? 13 : 10;
+	struct bin_attribute *res_attr;
+	int retval;
+
+	res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC);
+	if (res_attr) {
+		char *res_attr_name = (char *)(res_attr + 1);
+
+		if (write_combine) {
+			pdev->res_attr_wc[num] = res_attr;
+			sprintf(res_attr_name, "resource%d_wc", num);
+			res_attr->mmap = pci_mmap_resource_wc;
+		} else {
+			pdev->res_attr[num] = res_attr;
+			sprintf(res_attr_name, "resource%d", num);
+			res_attr->mmap = pci_mmap_resource_uc;
+		}
+		res_attr->attr.name = res_attr_name;
+		res_attr->attr.mode = S_IRUSR | S_IWUSR;
+		res_attr->size = pci_resource_len(pdev, num);
+		res_attr->private = &pdev->resource[num];
+		retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
+	} else
+		retval = -ENOMEM;
+
+	return retval;
+}
+
 /**
  * pci_create_resource_files - create resource files in sysfs for @dev
  * @dev: dev in question
@@ -557,31 +609,19 @@ static int pci_create_resource_files(str
 
 	/* Expose the PCI resources from this device as files */
 	for (i = 0; i < PCI_ROM_RESOURCE; i++) {
-		struct bin_attribute *res_attr;
 
 		/* skip empty resources */
 		if (!pci_resource_len(pdev, i))
 			continue;
 
-		/* allocate attribute structure, piggyback attribute name */
-		res_attr = kzalloc(sizeof(*res_attr) + 10, GFP_ATOMIC);
-		if (res_attr) {
-			char *res_attr_name = (char *)(res_attr + 1);
+		retval = pci_create_attr(pdev, i, 0);
+		/* for prefetchable resources, create a WC mappable file */
+		if (!retval && pdev->resource[i].flags & IORESOURCE_PREFETCH)
+			retval = pci_create_attr(pdev, i, 1);
 
-			pdev->res_attr[i] = res_attr;
-			sprintf(res_attr_name, "resource%d", i);
-			res_attr->attr.name = res_attr_name;
-			res_attr->attr.mode = S_IRUSR | S_IWUSR;
-			res_attr->size = pci_resource_len(pdev, i);
-			res_attr->mmap = pci_mmap_resource;
-			res_attr->private = &pdev->resource[i];
-			retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr);
-			if (retval) {
-				pci_remove_resource_files(pdev);
-				return retval;
-			}
-		} else {
-			return -ENOMEM;
+		if (retval) {
+			pci_remove_resource_files(pdev);
+			return retval;
 		}
 	}
 	return 0;
Index: linux-x86.q/include/linux/pci.h
===================================================================
--- linux-x86.q.orig/include/linux/pci.h
+++ linux-x86.q/include/linux/pci.h
@@ -205,6 +205,7 @@ struct pci_dev {
 	struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
 	int rom_attr_enabled;		/* has display of the rom attribute been enabled? */
 	struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
+	struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
 #ifdef CONFIG_PCI_MSI
 	struct list_head msi_list;
 #endif
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Sun Jan 20, 11:56 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Jesse Barnes, (Mon Jan 21, 9:30 am)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 21, 12:14 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Mon Jan 21, 1:09 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 21, 2:37 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Ingo Molnar, (Tue Jan 22, 9:51 am)
[PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Jan 22, 5:23 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Tue Jan 22, 8:50 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Fri Jan 25, 5:01 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Yinghai Lu, (Fri Jan 25, 5:16 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Fri Jan 25, 5:37 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Ingo Molnar, (Mon Jan 28, 8:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v2, Justin Piszcz, (Mon Jan 28, 11:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Andrew Morton, (Sat Apr 26, 3:56 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Sat Apr 26, 5:56 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 5:57 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 6:05 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sat Apr 26, 6:22 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Sun Apr 27, 1:21 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Sun Apr 27, 1:29 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sun Apr 27, 11:44 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Sun Apr 27, 11:50 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 1:38 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 2:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:18 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 2:34 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 2:44 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:54 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:58 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 3:03 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 3:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Mon Apr 28, 6:53 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 7:11 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 7:15 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 7:24 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Mon Apr 28, 9:09 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Mika Fischer, (Mon Apr 28, 9:31 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Mon Apr 28, 9:55 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Mon Apr 28, 11:07 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:03 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:06 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 12:08 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 12:38 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 12:46 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 1:45 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 2:19 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 3:03 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 3:56 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 4:16 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 4:23 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Gabriel C, (Mon Apr 28, 6:05 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Mon Apr 28, 7:41 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:31 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:34 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Ingo Molnar, (Tue Apr 29, 3:37 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 3:42 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Andrew Morton, (Tue Apr 29, 5:40 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Jesse Barnes, (Tue Apr 29, 8:52 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 10:29 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 11:40 am)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 12:19 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Yinghai Lu, (Tue Apr 29, 12:44 pm)
Re: [PATCH] x86_32: trim memory by updating e820 v3, Eric W. Biederman, (Tue Apr 29, 1:02 pm)
[patch] PCI: export resource_wc in pci sysfs, Ingo Molnar, (Tue Apr 29, 3:03 pm)
Re: [patch] PCI: export resource_wc in pci sysfs, Andrew Morton, (Tue Apr 29, 3:24 pm)