#define VMCLOCK_MIN_SIZE offsetof(struct vmclock_abi, pad)
#define VMCLOCK_FIELD_PRESENT(_c, _f) \
- le32_to_cpu((_c)->size) >= (offsetof(struct vmclock_abi, _f) + \
- sizeof((_c)->_f))
+ (le32_to_cpu((_c)->size) >= (offsetof(struct vmclock_abi, _f) + \
+ sizeof((_c)->_f)))
/*
* Multiply a 64-bit count by a 64-bit tick 'period' in units of seconds >> 64
if (!tai_adjust(st->clk, &tspec->tv_sec))
return -EINVAL;
+ /*
+ * This pairs with a write barrier in the hypervisor
+ * which populates this structure.
+ */
virt_rmb();
if (seq == le32_to_cpu(st->clk->seq_count))
break;
struct timespec64 *tspec)
{
struct pvclock_vcpu_time_info *pvti = this_cpu_pvti();
- unsigned pvti_ver;
+ unsigned int pvti_ver;
int ret;
preempt_disable_notrace();
*/
if (ret == -ENODEV) {
struct system_time_snapshot systime_snapshot;
+
ktime_get_snapshot(&systime_snapshot);
if (systime_snapshot.cs_id == CSID_X86_TSC ||
return NULL;
}
- st->sys_cs_id = st->cs_id = cs_id;
+ st->sys_cs_id = cs_id;
+ st->cs_id = cs_id;
st->ptp_clock_info = ptp_vmclock_info;
strscpy(st->ptp_clock_info.name, st->name, sizeof(st->ptp_clock_info.name));
return -EROFS;
if (vma->vm_end - vma->vm_start != PAGE_SIZE || vma->vm_pgoff)
- return -EINVAL;
+ return -EINVAL;
- if (io_remap_pfn_range(vma, vma->vm_start,
+ if (io_remap_pfn_range(vma, vma->vm_start,
st->res.start >> PAGE_SHIFT, PAGE_SIZE,
- vma->vm_page_prot))
- return -EAGAIN;
+ vma->vm_page_prot))
+ return -EAGAIN;
- return 0;
+ return 0;
}
static ssize_t vmclock_miscdev_read(struct file *fp, char __user *buf,
while (1) {
seq = le32_to_cpu(st->clk->seq_count) & ~1U;
+ /* Pairs with hypervisor wmb */
virt_rmb();
if (copy_to_user(buf, ((char *)st->clk) + *ppos, count))
return -EFAULT;
+ /* Pairs with hypervisor wmb */
virt_rmb();
if (seq == le32_to_cpu(st->clk->seq_count))
break;
}
static const struct file_operations vmclock_miscdev_fops = {
- .mmap = vmclock_miscdev_mmap,
- .read = vmclock_miscdev_read,
+ .mmap = vmclock_miscdev_mmap,
+ .read = vmclock_miscdev_read,
};
/* module operations */
{
struct vmclock_state *st = data;
struct resource_win win;
- struct resource *res = &(win.res);
+ struct resource *res = &win.res;
if (ares->type == ACPI_RESOURCE_TYPE_END_TAG)
return AE_OK;
if (resource_type(&st->res) == IORESOURCE_MEM)
return AE_ERROR;
- if (acpi_dev_resource_memory(ares, res) ||
+ if (acpi_dev_resource_memory(ares, res) ||
acpi_dev_resource_address_space(ares, &win)) {
if (resource_type(res) != IORESOURCE_MEM ||
struct vmclock_state *st;
int ret;
- st = devm_kzalloc(dev, sizeof (*st), GFP_KERNEL);
+ st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
if (!st)
return -ENOMEM;
MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
MODULE_DESCRIPTION("PTP clock using VMCLOCK");
-MODULE_LICENSE("GPL v2");
+MODULE_LICENSE("GPL");