|
@@ -221,12 +221,37 @@ static ssize_t enabled_show(struct device *dev, struct device_attribute *attr,
|
|
static DEVICE_ATTR_RW(enabled);
|
|
static DEVICE_ATTR_RW(enabled);
|
|
|
|
|
|
#ifdef CONFIG_NUMA
|
|
#ifdef CONFIG_NUMA
|
|
|
|
+static ssize_t numa_node_store(struct device *dev,
|
|
|
|
+ struct device_attribute *attr, const char *buf,
|
|
|
|
+ size_t count)
|
|
|
|
+{
|
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
|
+ int node, ret;
|
|
|
|
+
|
|
|
|
+ if (!capable(CAP_SYS_ADMIN))
|
|
|
|
+ return -EPERM;
|
|
|
|
+
|
|
|
|
+ ret = kstrtoint(buf, 0, &node);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if (!node_online(node))
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
|
|
|
+ dev_alert(&pdev->dev, FW_BUG "Overriding NUMA node to %d. Contact your vendor for updates.",
|
|
|
|
+ node);
|
|
|
|
+
|
|
|
|
+ dev->numa_node = node;
|
|
|
|
+ return count;
|
|
|
|
+}
|
|
|
|
+
|
|
static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr,
|
|
static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr,
|
|
char *buf)
|
|
char *buf)
|
|
{
|
|
{
|
|
return sprintf(buf, "%d\n", dev->numa_node);
|
|
return sprintf(buf, "%d\n", dev->numa_node);
|
|
}
|
|
}
|
|
-static DEVICE_ATTR_RO(numa_node);
|
|
|
|
|
|
+static DEVICE_ATTR_RW(numa_node);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static ssize_t dma_mask_bits_show(struct device *dev,
|
|
static ssize_t dma_mask_bits_show(struct device *dev,
|