Lines Matching defs:stt

72 	struct kvmppc_spapr_tce_table *stt;
77 list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
83 list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
99 struct kvmppc_spapr_tce_table *stt = NULL;
112 list_for_each_entry_rcu(stt, &kvm->arch.spapr_tce_tables, list) {
113 if (stt == f.file->private_data) {
135 if ((tbltmp->it_page_shift <= stt->page_shift) &&
137 stt->offset << stt->page_shift) &&
139 stt->size << stt->page_shift)) {
152 list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
180 list_add_rcu(&stit->next, &stt->iommu_tables);
187 struct kvmppc_spapr_tce_table *stt = container_of(head,
189 unsigned long i, npages = kvmppc_tce_pages(stt->size);
192 if (stt->pages[i])
193 __free_page(stt->pages[i]);
195 kfree(stt);
198 static struct page *kvm_spapr_get_tce_page(struct kvmppc_spapr_tce_table *stt,
201 struct page *page = stt->pages[sttpage];
206 mutex_lock(&stt->alloc_lock);
207 page = stt->pages[sttpage];
212 stt->pages[sttpage] = page;
214 mutex_unlock(&stt->alloc_lock);
221 struct kvmppc_spapr_tce_table *stt = vmf->vma->vm_file->private_data;
224 if (vmf->pgoff >= kvmppc_tce_pages(stt->size))
227 page = kvm_spapr_get_tce_page(stt, vmf->pgoff);
248 struct kvmppc_spapr_tce_table *stt = filp->private_data;
250 struct kvm *kvm = stt->kvm;
253 list_del_rcu(&stt->list);
256 list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
265 kvmppc_stt_pages(kvmppc_tce_pages(stt->size)), false);
267 kvm_put_kvm(stt->kvm);
269 call_rcu(&stt->rcu, release_spapr_tce_table);
282 struct kvmppc_spapr_tce_table *stt = NULL;
298 stt = kzalloc(sizeof(*stt) + npages * sizeof(struct page *),
300 if (!stt)
303 stt->liobn = args->liobn;
304 stt->page_shift = args->page_shift;
305 stt->offset = args->offset;
306 stt->size = size;
307 stt->kvm = kvm;
308 mutex_init(&stt->alloc_lock);
309 INIT_LIST_HEAD_RCU(&stt->iommu_tables);
325 stt, O_RDWR | O_CLOEXEC);
328 list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
337 kfree(stt);
359 static long kvmppc_tce_validate(struct kvmppc_spapr_tce_table *stt,
371 if (iommu_tce_check_gpa(stt->page_shift, gpa))
374 if (kvmppc_tce_to_ua(stt->kvm, tce, &ua))
378 list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
383 mem = mm_iommu_lookup(stt->kvm->mm, ua, 1ULL << shift);
399 static void kvmppc_tce_put(struct kvmppc_spapr_tce_table *stt,
406 idx -= stt->offset;
408 page = stt->pages[sttpage];
415 page = kvm_spapr_get_tce_page(stt, sttpage);
424 static void kvmppc_clear_tce(struct mm_struct *mm, struct kvmppc_spapr_tce_table *stt,
428 unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
429 unsigned long io_entry = entry << (stt->page_shift - tbl->it_page_shift);
482 struct kvmppc_spapr_tce_table *stt, struct iommu_table *tbl,
486 unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
539 struct kvmppc_spapr_tce_table *stt, struct iommu_table *tbl,
544 unsigned long subpages = 1ULL << (stt->page_shift - tbl->it_page_shift);
564 struct kvmppc_spapr_tce_table *stt;
573 stt = kvmppc_find_table(vcpu->kvm, liobn);
574 if (!stt)
577 ret = kvmppc_ioba_validate(stt, ioba, 1);
583 ret = kvmppc_tce_validate(stt, tce);
594 entry = ioba >> stt->page_shift;
596 list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
598 ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stt,
601 ret = kvmppc_tce_iommu_map(vcpu->kvm, stt, stit->tbl,
606 kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl, entry);
611 kvmppc_tce_put(stt, entry, tce);
624 struct kvmppc_spapr_tce_table *stt;
631 stt = kvmppc_find_table(vcpu->kvm, liobn);
632 if (!stt)
635 entry = ioba >> stt->page_shift;
646 ret = kvmppc_ioba_validate(stt, ioba, npages);
664 ret = kvmppc_tce_validate(stt, tce);
691 list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
692 ret = kvmppc_tce_iommu_map(vcpu->kvm, stt,
697 kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl,
703 kvmppc_tce_put(stt, entry + i, tce);
717 struct kvmppc_spapr_tce_table *stt;
721 stt = kvmppc_find_table(vcpu->kvm, liobn);
722 if (!stt)
725 ret = kvmppc_ioba_validate(stt, ioba, npages);
733 list_for_each_entry_lockless(stit, &stt->iommu_tables, next) {
734 unsigned long entry = ioba >> stt->page_shift;
737 ret = kvmppc_tce_iommu_unmap(vcpu->kvm, stt,
747 kvmppc_clear_tce(vcpu->kvm->mm, stt, stit->tbl, entry + i);
751 for (i = 0; i < npages; ++i, ioba += (1ULL << stt->page_shift))
752 kvmppc_tce_put(stt, ioba >> stt->page_shift, tce_value);