[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Review needed for "commonisation" of common/grant_table.c
common/grant_table.c is currently not built for Xen/ia64 and has never been "common-ized". I'm working on identifying the x86-specific portions. I have a version compiled and minimally working on Xen/ia64 now but there's a lot of x86 code that should probably be moved to macros or to separate arch-specific files and I would like to get some review from a grant_table.c expert to ensure I haven't missed (or misunderstood) anything. Attached is a patch for grant_table.c. It is NOT intended to be applied, but to make the changes easier to review. Apply it to your local version of grant_table.c (rev 1.48, yesterday), then look at each __ia64__. Comments/feedback would be greatly appreciated. Thanks, Dan ===== common/grant_table.c 1.48 vs edited ===== --- 1.48/xen/common/grant_table.c Thu Jun 9 09:25:28 2005 +++ edited/common/grant_table.c Fri Jun 10 14:32:00 2005 @@ -30,6 +30,19 @@ #include <xen/sched.h> #include <xen/shadow.h> #include <xen/mm.h> +#ifdef __ia64__ +#define __addr_ok(a) 1 // FIXME-ia64: a variant of access_ok?? +// FIXME-ia64: need to implement real cmpxchg_user on ia64 +#define cmpxchg_user(_p,_o,_n) ((*_p == _o) ? ((*_p = _n), 0) : ((_o = *_p), 0)) +// FIXME-ia64: the following are meaningless on ia64? move to some header file +#define put_page(x) do { } while (0) +#define put_page_type(x) do { } while (0) +// FIXME-ia64: these belong in an asm/grant_table.h... PAGE_SIZE different +#undef ORDER_GRANT_FRAMES +//#undef NUM_GRANT_FRAMES +#define ORDER_GRANT_FRAMES 0 +//#define NUM_GRANT_FRAMES (1U << ORDER_GRANT_FRAMES) +#endif #define PIN_FAIL(_lbl, _rc, _f, _a...) \ do { \ @@ -162,6 +175,9 @@ frame = __gpfn_to_mfn_foreign(granting_d, sha->frame); +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? +#else if ( unlikely(!pfn_valid(frame)) || unlikely(!((dev_hst_ro_flags & GNTMAP_readonly) ? get_page(&frame_table[frame], granting_d) : @@ -173,6 +189,7 @@ PIN_FAIL(unlock_out, GNTST_general_error, "Could not pin the granted frame (%lx)!\n", frame); } +#endif if ( dev_hst_ro_flags & GNTMAP_device_map ) act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ? @@ -226,6 +243,9 @@ sflags = prev_sflags; } +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? +#else if ( unlikely(!get_page_type(&frame_table[frame], PGT_writable_page)) ) { @@ -233,6 +253,7 @@ PIN_FAIL(unlock_out, GNTST_general_error, "Attempt to write-pin a unwritable page.\n"); } +#endif } if ( dev_hst_ro_flags & GNTMAP_device_map ) @@ -253,6 +274,9 @@ spin_unlock(&granting_d->grant_table->lock); +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? +#else if ( (host_virt_addr != 0) && (dev_hst_ro_flags & GNTMAP_host_map) ) { /* Write update into the pagetable. */ @@ -298,6 +322,7 @@ } } +#endif *pframe = frame; return rc; @@ -444,10 +469,14 @@ if ( __gnttab_map_grant_ref(&uop[i], &va) == 0 ) flush++; +#ifdef __ia64__ +// FIXME-ia64: probably need to do something here to avoid stale mappings? +#else if ( flush == 1 ) flush_tlb_one_mask(current->domain->cpumask, va); else if ( flush != 0 ) flush_tlb_mask(current->domain->cpumask); +#endif return 0; } @@ -542,6 +571,9 @@ /* Frame is now unmapped for device access. */ } +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? +#else if ( (virt != 0) && (flags & GNTMAP_host_map) && ((act->pin & (GNTPIN_hstw_mask | GNTPIN_hstr_mask)) > 0)) @@ -596,6 +628,7 @@ rc = 0; *va = virt; } +#endif if ( (map->ref_and_flags & (GNTMAP_device_map|GNTMAP_host_map)) == 0) { @@ -603,10 +636,15 @@ put_maptrack_handle(ld->grant_table, handle); } +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? I think not and then +// this can probably be macro-ized into nothingness +#else /* If just unmapped a writable mapping, mark as dirtied */ if ( unlikely(shadow_mode_log_dirty(rd)) && !( flags & GNTMAP_readonly ) ) mark_dirty(rd, frame); +#endif /* If the last writable mapping has been removed, put_page_type */ if ( ( (act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask) ) == 0) && @@ -640,10 +678,14 @@ if ( __gnttab_unmap_grant_ref(&uop[i], &va) == 0 ) flush++; +#ifdef __ia64__ +// FIXME-ia64: probably need to do something here to avoid stale mappings? +#else if ( flush == 1 ) flush_tlb_one_mask(current->domain->cpumask, va); else if ( flush != 0 ) flush_tlb_mask(current->domain->cpumask); +#endif return 0; } @@ -1050,6 +1092,9 @@ spin_lock(&rd->grant_table->lock); +#ifdef __ia64__ +// FIXME-ia64: any error checking need to be done here? +#else pfn = sha->frame; if ( unlikely(pfn >= max_page ) ) @@ -1064,6 +1109,7 @@ if (shadow_mode_translate(ld)) __phys_to_machine_mapping[pfn] = frame; } +#endif sha->frame = __mfn_to_gpfn(rd, frame); sha->domid = rd->domain_id; wmb(); @@ -1109,6 +1155,9 @@ goto no_mem; memset(t->shared, 0, NR_GRANT_FRAMES * PAGE_SIZE); +#ifdef __ia64__ +// I don't think there's anything to do here on ia64?... +#else for ( i = 0; i < NR_GRANT_FRAMES; i++ ) { SHARE_PFN_WITH_DOMAIN( @@ -1116,6 +1165,7 @@ machine_to_phys_mapping[(virt_to_phys(t->shared) >> PAGE_SHIFT) + i] = INVALID_M2P_ENTRY; } +#endif /* Okay, install the structure. */ wmb(); /* avoid races with lock-free access to d->grant_table */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |