> +/** > + * gmap_pmdp_idte_global - invalidate and clear a guest pmd entry > + * @mm: pointer to the process mm_struct > + * @vmaddr: virtual address in the process address space > + */ > +void gmap_pmdp_idte_global(struct mm_struct *mm, unsigned long vmaddr) > +{ > + unsigned long *entry, gaddr; > + struct gmap *gmap; > + pmd_t *pmdp; > + > + rcu_read_lock(); > + list_for_each_entry_rcu(gmap, &mm->context.gmap_list, list) { > + spin_lock(&gmap->guest_table_lock); > + entry = radix_tree_delete(&gmap->host_to_guest, > + vmaddr >> PMD_SHIFT); > + if (entry) { > + pmdp = (pmd_t *)entry; > + gaddr = __gmap_segment_gaddr(entry); > + pmdp_notify_gmap(gmap, pmdp, gaddr); > + WARN_ON(*entry & ~(_SEGMENT_ENTRY_HARDWARE_BITS_LARGE | > + _SEGMENT_ENTRY_GMAP_UC)); > + if (MACHINE_HAS_TLB_GUEST) > + __pmdp_idte(gaddr, pmdp, IDTE_GUEST_ASCE, > + gmap->asce, IDTE_GLOBAL); > + else if (MACHINE_HAS_IDTE) > + __pmdp_idte(gaddr, pmdp, 0, 0, IDTE_GLOBAL); > + else > + __pmdp_csp(pmdp); > + *entry = _SEGMENT_ENTRY_EMPTY; > + } > + spin_unlock(&gmap->guest_table_lock); > + } > + rcu_read_unlock(); > +} > +EXPORT_SYMBOL_GPL(gmap_pmdp_idte_global); So you didn't like my suggestion of factoring out the common code of gmap_pmdp_idte_local and gmap_pmdp_idte_global? They are almost identical except of the IDTE flag. -- Thanks, David / dhildenb