TCG patch queue:

Workaround macos assembler lossage.
 Eliminate tb_lock.
 Fix TB code generation overflow.
 -----BEGIN PGP SIGNATURE-----
 
 iQEcBAABAgAGBQJbJBZIAAoJEGTfOOivfiFfy0gH/1brodMhJbTS6/k9+FyXWEy5
 zYjCGKKlMZk//Y+4wcF5tXY/qDRNWk80j6KyxumNp3gCBehx6u59EEsrJRQaxBHm
 nYbDoE3Fy0J4KgRzdGmkYtl89XDK1++Ea9uL9N/stg2MSodzqoV6uudLYr/f+nRj
 4MkS+7BI+aJ4/XIKLU+/+cRo+5FdD0hNEabjlUxTOSrfJbr/YxbnVINX01A4yD6q
 LSzwLAEqpJehFBQjeSLu93ztrapj/1vEaguPOf04F6pXgOLpvSPlPahqwwk4qRwS
 OFgWwSPby3jrNLYZcufx2cY5pG3i4wDGK3z/B35hnDEGwYp1fNt6xdq+EzmHhaM=
 =ibt/
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20180615' into staging

TCG patch queue:

Workaround macos assembler lossage.
Eliminate tb_lock.
Fix TB code generation overflow.

# gpg: Signature made Fri 15 Jun 2018 20:40:56 BST
# gpg:                using RSA key 64DF38E8AF7E215F
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>"
# Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A  05C0 64DF 38E8 AF7E 215F

* remotes/rth/tags/pull-tcg-20180615:
  tcg: Reduce max TB opcode count
  tcg: remove tb_lock
  translate-all: remove tb_lock mention from cpu_restore_state_from_tb
  cputlb: remove tb_lock from tlb_flush functions
  translate-all: protect TB jumps with a per-destination-TB lock
  translate-all: discard TB when tb_link_page returns an existing matching TB
  translate-all: introduce assert_no_pages_locked
  translate-all: add page_locked assertions
  translate-all: use per-page locking in !user-mode
  translate-all: move tb_invalidate_phys_page_range up in the file
  translate-all: work page-by-page in tb_invalidate_phys_range_1
  translate-all: remove hole in PageDesc
  translate-all: make l1_map lockless
  translate-all: iterate over TBs in a page with PAGE_FOR_EACH_TB
  tcg: move tb_ctx.tb_phys_invalidate_count to tcg_ctx
  tcg: track TBs with per-region BST's
  qht: return existing entry when qht_insert fails
  qht: require a default comparison function
  tcg/i386: Use byte form of xgetbv instruction

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2018-06-21 17:54:26 +01:00
commit 33836a7315
25 changed files with 1157 additions and 490 deletions

View file

@ -93,10 +93,10 @@ static void usage_complete(int argc, char *argv[])
exit(-1);
}
static bool is_equal(const void *obj, const void *userp)
static bool is_equal(const void *ap, const void *bp)
{
const long *a = obj;
const long *b = userp;
const long *a = ap;
const long *b = bp;
return *a == *b;
}
@ -150,7 +150,7 @@ static void do_rw(struct thread_info *info)
p = &keys[info->r & (lookup_range - 1)];
hash = h(*p);
read = qht_lookup(&ht, is_equal, p, hash);
read = qht_lookup(&ht, p, hash);
if (read) {
stats->rd++;
} else {
@ -162,8 +162,8 @@ static void do_rw(struct thread_info *info)
if (info->write_op) {
bool written = false;
if (qht_lookup(&ht, is_equal, p, hash) == NULL) {
written = qht_insert(&ht, p, hash);
if (qht_lookup(&ht, p, hash) == NULL) {
written = qht_insert(&ht, p, hash, NULL);
}
if (written) {
stats->in++;
@ -173,7 +173,7 @@ static void do_rw(struct thread_info *info)
} else {
bool removed = false;
if (qht_lookup(&ht, is_equal, p, hash)) {
if (qht_lookup(&ht, p, hash)) {
removed = qht_remove(&ht, p, hash);
}
if (removed) {
@ -308,7 +308,7 @@ static void htable_init(void)
}
/* initialize the hash table */
qht_init(&ht, qht_n_elems, qht_mode);
qht_init(&ht, is_equal, qht_n_elems, qht_mode);
assert(init_size <= init_range);
pr_params();
@ -322,7 +322,7 @@ static void htable_init(void)
r = xorshift64star(r);
p = &keys[r & (init_range - 1)];
hash = h(*p);
if (qht_insert(&ht, p, hash)) {
if (qht_insert(&ht, p, hash, NULL)) {
break;
}
retries++;

View file

@ -13,10 +13,10 @@
static struct qht ht;
static int32_t arr[N * 2];
static bool is_equal(const void *obj, const void *userp)
static bool is_equal(const void *ap, const void *bp)
{
const int32_t *a = obj;
const int32_t *b = userp;
const int32_t *a = ap;
const int32_t *b = bp;
return *a == *b;
}
@ -27,11 +27,17 @@ static void insert(int a, int b)
for (i = a; i < b; i++) {
uint32_t hash;
void *existing;
bool inserted;
arr[i] = i;
hash = i;
qht_insert(&ht, &arr[i], hash);
inserted = qht_insert(&ht, &arr[i], hash, NULL);
g_assert_true(inserted);
inserted = qht_insert(&ht, &arr[i], hash, &existing);
g_assert_false(inserted);
g_assert_true(existing == &arr[i]);
}
}
@ -60,7 +66,12 @@ static void check(int a, int b, bool expected)
val = i;
hash = i;
p = qht_lookup(&ht, is_equal, &val, hash);
/* test both lookup variants; results should be the same */
if (i % 2) {
p = qht_lookup(&ht, &val, hash);
} else {
p = qht_lookup_custom(&ht, &val, hash, is_equal);
}
g_assert_true(!!p == expected);
}
rcu_read_unlock();
@ -102,7 +113,7 @@ static void qht_do_test(unsigned int mode, size_t init_entries)
/* under KVM we might fetch stats from an uninitialized qht */
check_n(0);
qht_init(&ht, 0, mode);
qht_init(&ht, is_equal, 0, mode);
check_n(0);
insert(0, N);