Skip to the content.

qht 移植

等阅读了 perf book 之后,从一个更高的角度来分析吧 不看懂这个,perf book 完全看不懂的啊

问题

static bool tb_cmp(const void *ap, const void *bp)
{
    const TranslationBlock *a = ap;
    const TranslationBlock *b = bp;

    return a->pc == b->pc &&
        a->cs_base == b->cs_base &&
        a->flags == b->flags &&
        (tb_cflags(a) & CF_HASH_MASK) == (tb_cflags(b) & CF_HASH_MASK) &&
        a->trace_vcpu_dstate == b->trace_vcpu_dstate &&
        a->page_addr[0] == b->page_addr[0] &&
        a->page_addr[1] == b->page_addr[1];
}

static bool tb_lookup_cmp(const void *p, const void *d)
{
    const TranslationBlock *tb = p;
    const struct tb_desc *desc = d;

    if (tb->pc == desc->pc &&
        tb->page_addr[0] == desc->phys_page1 &&
        tb->cs_base == desc->cs_base &&
        tb->flags == desc->flags &&
        tb->trace_vcpu_dstate == desc->trace_vcpu_dstate &&
        (tb_cflags(tb) & (CF_HASH_MASK | CF_INVALID)) == desc->cf_mask) {
        /* check next page if needed */
        if (tb->page_addr[1] == -1) {
            return true;
        } else {
            tb_page_addr_t phys_page2;
            target_ulong virt_page2;

            virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
            phys_page2 = get_page_addr_code(desc->env, virt_page2);
            if (tb->page_addr[1] == phys_page2) {
                return true;
            }
        }
    }
    return false;
}

到底在比较什么内容

  1. TranslationBlock::pc : 所有就是 guest virtual address

why : 什么时候出现,两个 tb 物理地址相同,但是 pc 不同的时候

[ ] qht_lookup_custom 的几个参数的含义是什么

void *qht_lookup(const struct qht *ht, const void *userp, uint32_t hash)
{
    return qht_lookup_custom(ht, userp, hash, ht->cmp);
}

使用 qht_cmp_func_t 来实现 TranslationBlock 的排序

恐怕并不是,只是比较而已

而使用 qht_lookup_func_t 来实现比较的,那么只能采用 几乎所有的都是使用 qht_lookup 的,除了 tb 的查询 qht_lookup_custom 的

的确是因为比较的两个内容不同造成的

看看这个就知道该如何使用了吧

tests/unit/test-qht.c

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。