> +/* > + * gmap_protect_pmd - remove access rights to memory and set pmd notification bits > + * @pmdp: pointer to the pmd to be protected > + * @prot: indicates access rights: PROT_NONE, PROT_READ or PROT_WRITE > + * @bits: notification bits to set > + * > + * Returns: > + * 0 if successfully protected > + * -ENOMEM if out of memory and This cannot happen. > + * -EAGAIN if a fixup is needed > + * -EINVAL if unsupported notifier bits have been specified > + * > + * Expected to be called with sg->mm->mmap_sem in read and > + * guest_table_lock held. > + */ > +static int gmap_protect_pmd(struct gmap *gmap, unsigned long gaddr, > + pmd_t *pmdp, int prot, unsigned long bits) > +{ > + int pmd_i = pmd_val(*pmdp) & _SEGMENT_ENTRY_INVALID; > + int pmd_p = pmd_val(*pmdp) & _SEGMENT_ENTRY_PROTECT; > + > + /* Fixup needed */ > + if ((pmd_i && (prot != PROT_NONE)) || (pmd_p && (prot == PROT_WRITE))) > + return -EAGAIN; You should also return -EINVAL in case !PROT_WRITE is defined, as we only support PROT_WRITE (we don't perform any protection!) > + if (bits & GMAP_NOTIFY_MPROT) > + pmd_val(*pmdp) |= _SEGMENT_ENTRY_GMAP_IN; > + > + /* Shadow GMAP protection needs split PMDs */ > + if (bits & GMAP_NOTIFY_SHADOW) > + return -EINVAL; > + > + return 0; > +} > + -- Thanks, David / dhildenb