From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [luto:x86/fixes 14/21] arch/x86/mm/tlb.c:537:34: error: 'struct mm_struct' has no member named 'membarrier_state'
Date: Mon, 11 Jan 2021 06:38:19 +0800 [thread overview]
Message-ID: <202101110613.AGgOTRGz-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 10171 bytes --]
Hi Andy,
FYI, the error/warning still remains.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/luto/linux.git x86/fixes
head: f3086de0babcab36f69949b5780bde851f719bc8
commit: ff7d4d734d212919749ff79b8c08e1615f7de83b [14/21] x86/mm: Handle unlazying membarrier core sync in the arch code
config: i386-tinyconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# https://git.kernel.org/pub/scm/linux/kernel/git/luto/linux.git/commit/?id=ff7d4d734d212919749ff79b8c08e1615f7de83b
git remote add luto https://git.kernel.org/pub/scm/linux/kernel/git/luto/linux.git
git fetch --no-tags luto x86/fixes
git checkout ff7d4d734d212919749ff79b8c08e1615f7de83b
# save the attached .config to linux build tree
make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from include/linux/init.h:5,
from arch/x86/mm/tlb.c:2:
arch/x86/mm/tlb.c: In function 'switch_mm_irqs_off':
>> arch/x86/mm/tlb.c:537:34: error: 'struct mm_struct' has no member named 'membarrier_state'
537 | if (unlikely(atomic_read(&next->membarrier_state) &
| ^~
include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
>> arch/x86/mm/tlb.c:538:10: error: 'MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE' undeclared (first use in this function)
538 | MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
arch/x86/mm/tlb.c:538:10: note: each undeclared identifier is reported only once for each function it appears in
538 | MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
vim +537 arch/x86/mm/tlb.c
422
423 void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
424 struct task_struct *tsk)
425 {
426 struct mm_struct *real_prev = this_cpu_read(cpu_tlbstate.loaded_mm);
427 u16 prev_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
428 bool was_lazy = this_cpu_read(cpu_tlbstate.is_lazy);
429 unsigned cpu = smp_processor_id();
430 u64 next_tlb_gen;
431 bool need_flush;
432 u16 new_asid;
433
434 /*
435 * NB: The scheduler will call us with prev == next when switching
436 * from lazy TLB mode to normal mode if active_mm isn't changing.
437 * When this happens, we don't assume that CR3 (and hence
438 * cpu_tlbstate.loaded_mm) matches next.
439 *
440 * NB: leave_mm() calls us with prev == NULL and tsk == NULL.
441 */
442
443 /* We don't want flush_tlb_func_* to run concurrently with us. */
444 if (IS_ENABLED(CONFIG_PROVE_LOCKING))
445 WARN_ON_ONCE(!irqs_disabled());
446
447 /*
448 * Verify that CR3 is what we think it is. This will catch
449 * hypothetical buggy code that directly switches to swapper_pg_dir
450 * without going through leave_mm() / switch_mm_irqs_off() or that
451 * does something like write_cr3(read_cr3_pa()).
452 *
453 * Only do this check if CONFIG_DEBUG_VM=y because __read_cr3()
454 * isn't free.
455 */
456 #ifdef CONFIG_DEBUG_VM
457 if (WARN_ON_ONCE(__read_cr3() != build_cr3(real_prev->pgd, prev_asid))) {
458 /*
459 * If we were to BUG here, we'd be very likely to kill
460 * the system so hard that we don't see the call trace.
461 * Try to recover instead by ignoring the error and doing
462 * a global flush to minimize the chance of corruption.
463 *
464 * (This is far from being a fully correct recovery.
465 * Architecturally, the CPU could prefetch something
466 * back into an incorrect ASID slot and leave it there
467 * to cause trouble down the road. It's better than
468 * nothing, though.)
469 */
470 __flush_tlb_all();
471 }
472 #endif
473 this_cpu_write(cpu_tlbstate.is_lazy, false);
474
475 /*
476 * membarrier() support requires that, when we change rq->curr->mm:
477 *
478 * - If next->mm has membarrier registered, a full memory barrier
479 * after writing rq->curr (or rq->curr->mm if we switched the mm
480 * without switching tasks) and before returning to user mode.
481 *
482 * - If next->mm has SYNC_CORE registered, then we sync core before
483 * returning to user mode.
484 *
485 * In the case where prev->mm == next->mm, membarrier() uses an IPI
486 * instead, and no particular barriers are needed while context
487 * switching.
488 *
489 * x86 gets all of this as a side-effect of writing to CR3 except
490 * in the case where we unlazy without flushing.
491 *
492 * All other architectures are civilized and do all of this implicitly
493 * when transitioning from kernel to user mode.
494 */
495 if (real_prev == next) {
496 VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) !=
497 next->context.ctx_id);
498
499 /*
500 * Even in lazy TLB mode, the CPU should stay set in the
501 * mm_cpumask. The TLB shootdown code can figure out from
502 * from cpu_tlbstate.is_lazy whether or not to send an IPI.
503 */
504 if (WARN_ON_ONCE(real_prev != &init_mm &&
505 !cpumask_test_cpu(cpu, mm_cpumask(next))))
506 cpumask_set_cpu(cpu, mm_cpumask(next));
507
508 /*
509 * If the CPU is not in lazy TLB mode, we are just switching
510 * from one thread in a process to another thread in the same
511 * process. No TLB flush or membarrier() synchronization
512 * is required.
513 */
514 if (!was_lazy)
515 return;
516
517 /*
518 * Read the tlb_gen to check whether a flush is needed.
519 * If the TLB is up to date, just use it.
520 * The barrier synchronizes with the tlb_gen increment in
521 * the TLB shootdown code.
522 *
523 * As a future optimization opportunity, it's plausible
524 * that the x86 memory model is strong enough that this
525 * smp_mb() isn't needed.
526 */
527 smp_mb();
528 next_tlb_gen = atomic64_read(&next->context.tlb_gen);
529 if (this_cpu_read(cpu_tlbstate.ctxs[prev_asid].tlb_gen) ==
530 next_tlb_gen) {
531 /*
532 * We switched logical mm but we're not going to
533 * write to CR3. We already did smp_mb() above,
534 * but membarrier() might require a sync_core()
535 * as well.
536 */
> 537 if (unlikely(atomic_read(&next->membarrier_state) &
> 538 MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE))
539 sync_core_before_usermode();
540
541 return;
542 }
543
544 /*
545 * TLB contents went out of date while we were in lazy
546 * mode. Fall through to the TLB switching code below.
547 * No need for an explicit membarrier invocation -- the CR3
548 * write will serialize.
549 */
550 new_asid = prev_asid;
551 need_flush = true;
552 } else {
553 /*
554 * Avoid user/user BTB poisoning by flushing the branch
555 * predictor when switching between processes. This stops
556 * one process from doing Spectre-v2 attacks on another.
557 */
558 cond_ibpb(tsk);
559
560 /*
561 * Stop remote flushes for the previous mm.
562 * Skip kernel threads; we never send init_mm TLB flushing IPIs,
563 * but the bitmap manipulation can cause cache line contention.
564 */
565 if (real_prev != &init_mm) {
566 VM_WARN_ON_ONCE(!cpumask_test_cpu(cpu,
567 mm_cpumask(real_prev)));
568 cpumask_clear_cpu(cpu, mm_cpumask(real_prev));
569 }
570
571 /*
572 * Start remote flushes and then read tlb_gen.
573 */
574 if (next != &init_mm)
575 cpumask_set_cpu(cpu, mm_cpumask(next));
576 next_tlb_gen = atomic64_read(&next->context.tlb_gen);
577
578 choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush);
579
580 /* Let nmi_uaccess_okay() know that we're changing CR3. */
581 this_cpu_write(cpu_tlbstate.loaded_mm, LOADED_MM_SWITCHING);
582 barrier();
583 }
584
585 if (need_flush) {
586 this_cpu_write(cpu_tlbstate.ctxs[new_asid].ctx_id, next->context.ctx_id);
587 this_cpu_write(cpu_tlbstate.ctxs[new_asid].tlb_gen, next_tlb_gen);
588 load_new_mm_cr3(next->pgd, new_asid, true);
589
590 trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL);
591 } else {
592 /* The new ASID is already up to date. */
593 load_new_mm_cr3(next->pgd, new_asid, false);
594
595 trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, 0);
596 }
597
598 /* Make sure we write CR3 before loaded_mm. */
599 barrier();
600
601 this_cpu_write(cpu_tlbstate.loaded_mm, next);
602 this_cpu_write(cpu_tlbstate.loaded_mm_asid, new_asid);
603
604 if (next != real_prev) {
605 cr4_update_pce_mm(next);
606 switch_ldt(real_prev, next);
607 }
608 }
609
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 7262 bytes --]
reply other threads:[~2021-01-10 22:38 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202101110613.AGgOTRGz-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.