The sysfs nodes created under /opal/exports/ do not currently support mmap. Skiboot trace buffers are exported here with in the series https://patchwork.ozlabs.org/cover/1073501/. Adding mmap support makes it possible to use the functions for reading traces in external/trace. This improves on the current read/lseek method as it handles cases like the buffer wrapping and overflowing.
Signed-off-by: Jordan Niethe <jniet...@gmail.com> --- v2: ensure only whole pages can be mapped --- arch/powerpc/platforms/powernv/opal.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 2b0eca104f86..3611b5b9c5d2 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -714,6 +714,15 @@ static ssize_t export_attr_read(struct file *fp, struct kobject *kobj, bin_attr->size); } +static int export_attr_mmap(struct file *fp, struct kobject *kobj, + struct bin_attribute *attr, + struct vm_area_struct *vma) +{ + return remap_pfn_range(vma, vma->vm_start, + __pa(attr->private) >> PAGE_SHIFT, + attr->size, PAGE_READONLY); +} + /* * opal_export_attrs: creates a sysfs node for each property listed in * the device-tree under /ibm,opal/firmware/exports/ @@ -759,6 +768,9 @@ static void opal_export_attrs(void) attr->attr.name = kstrdup(prop->name, GFP_KERNEL); attr->attr.mode = 0400; attr->read = export_attr_read; + /* Ensure only whole pages are mapped */ + if (vals[0] % PAGE_SIZE == 0 && vals[1] % PAGE_SIZE == 0) + attr->mmap = export_attr_mmap; attr->private = __va(vals[0]); attr->size = vals[1]; -- 2.20.1