|
@@ -24,6 +24,54 @@ struct pci_p2pdma {
|
|
|
bool p2pmem_published;
|
|
|
};
|
|
|
|
|
|
+static ssize_t size_show(struct device *dev, struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
+ size_t size = 0;
|
|
|
+
|
|
|
+ if (pdev->p2pdma->pool)
|
|
|
+ size = gen_pool_size(pdev->p2pdma->pool);
|
|
|
+
|
|
|
+ return snprintf(buf, PAGE_SIZE, "%zd\n", size);
|
|
|
+}
|
|
|
+static DEVICE_ATTR_RO(size);
|
|
|
+
|
|
|
+static ssize_t available_show(struct device *dev, struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
+ size_t avail = 0;
|
|
|
+
|
|
|
+ if (pdev->p2pdma->pool)
|
|
|
+ avail = gen_pool_avail(pdev->p2pdma->pool);
|
|
|
+
|
|
|
+ return snprintf(buf, PAGE_SIZE, "%zd\n", avail);
|
|
|
+}
|
|
|
+static DEVICE_ATTR_RO(available);
|
|
|
+
|
|
|
+static ssize_t published_show(struct device *dev, struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
+
|
|
|
+ return snprintf(buf, PAGE_SIZE, "%d\n",
|
|
|
+ pdev->p2pdma->p2pmem_published);
|
|
|
+}
|
|
|
+static DEVICE_ATTR_RO(published);
|
|
|
+
|
|
|
+static struct attribute *p2pmem_attrs[] = {
|
|
|
+ &dev_attr_size.attr,
|
|
|
+ &dev_attr_available.attr,
|
|
|
+ &dev_attr_published.attr,
|
|
|
+ NULL,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct attribute_group p2pmem_group = {
|
|
|
+ .attrs = p2pmem_attrs,
|
|
|
+ .name = "p2pmem",
|
|
|
+};
|
|
|
+
|
|
|
static void pci_p2pdma_percpu_release(struct percpu_ref *ref)
|
|
|
{
|
|
|
struct pci_p2pdma *p2p =
|
|
@@ -59,6 +107,7 @@ static void pci_p2pdma_release(void *data)
|
|
|
percpu_ref_exit(&pdev->p2pdma->devmap_ref);
|
|
|
|
|
|
gen_pool_destroy(pdev->p2pdma->pool);
|
|
|
+ sysfs_remove_group(&pdev->dev.kobj, &p2pmem_group);
|
|
|
pdev->p2pdma = NULL;
|
|
|
}
|
|
|
|
|
@@ -87,9 +136,14 @@ static int pci_p2pdma_setup(struct pci_dev *pdev)
|
|
|
|
|
|
pdev->p2pdma = p2p;
|
|
|
|
|
|
+ error = sysfs_create_group(&pdev->dev.kobj, &p2pmem_group);
|
|
|
+ if (error)
|
|
|
+ goto out_pool_destroy;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
out_pool_destroy:
|
|
|
+ pdev->p2pdma = NULL;
|
|
|
gen_pool_destroy(p2p->pool);
|
|
|
out:
|
|
|
devm_kfree(&pdev->dev, p2p);
|