<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <br>
    <br>
    <div class="moz-cite-prefix">Am 02.06.21 um 15:29 schrieb philip
      yang:<br>
    </div>
    <blockquote type="cite"
      cite="mid:96d3eab3-ec3e-534b-28ae-17710b92fb80@amd.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p><br>
      </p>
      <div class="moz-cite-prefix">On 2021-06-02 2:53 a.m., Christian
        König wrote:<br>
      </div>
      <blockquote type="cite"
        cite="mid:1b688ac5-e4cd-5c8b-7972-1f120186b502@gmail.com">Mostly
        a question for Felix and Philip: <br>
        <br>
        I've been thinking for a bit about how that case happens in the
        first place? <br>
        <br>
        I mean if we have a PDE which points to PTEs and then switch
        that into a 2MiB PTE then why wasn't that range invalidated
        before? <br>
        <br>
        In other words when the PDE points to the PTEs we should have
        had an unmap operation on that range before which should have
        invalidated the TLB. <br>
      </blockquote>
      <p>Because one cache line has 8 PDE0</p>
    </blockquote>
    <br>
    Ah, of course! Yeah that makes totally sense now.<br>
    <br>
    Christian.<br>
    <br>
    <blockquote type="cite"
      cite="mid:96d3eab3-ec3e-534b-28ae-17710b92fb80@amd.com">
      <p>, after unmap flush tlb, access address on same PDE0 cache line
        will load PDE0 back into tlb. For example:</p>
      <p>1. map and access 0x7ffff6210000, unmap it, tlb flush<br>
      </p>
      <p>2. map and access 0x7ffff6400000, PDE0 for 0x7ffff6200000 into
        tlb, which is P=0, V=1</p>
      <p>3. map 0x7ffff6200000 update page table, access has vm fault
        because tlb has PDE0 P=0,V=1, to recover this fault, map need
        update page table and flush tlb.<br>
      </p>
      <p>Regards,</p>
      <p>Philip<br>
      </p>
      <div>
        <div style="box-sizing: border-box; font-family: "Segoe
          UI", system-ui, "Apple Color Emoji",
          "Segoe UI Emoji", sans-serif; font-size: 14px;
          font-style: normal; font-variant-ligatures: normal;
          font-variant-caps: normal; font-weight: 400; letter-spacing:
          normal; orphans: 2; text-align: start; text-indent: 0px;
          text-transform: none; white-space: normal; widows: 2;
          word-spacing: 0px;">
          <div data-tid="messageBodyContainer"> </div>
        </div>
      </div>
      <blockquote type="cite"
        cite="mid:1b688ac5-e4cd-5c8b-7972-1f120186b502@gmail.com"> <br>
        Regards, <br>
        Christian. <br>
        <br>
        Am 02.06.21 um 00:59 schrieb Eric Huang: <br>
        <blockquote type="cite">It is to provide more tlb flush types
          opotion for different <br>
          case scenario. <br>
          <br>
          Signed-off-by: Eric Huang <a class="moz-txt-link-rfc2396E"
            href="mailto:jinhuieric.huang@amd.com"
            moz-do-not-send="true"><jinhuieric.huang@amd.com></a>
          <br>
          --- <br>
            drivers/gpu/drm/amd/amdkfd/kfd_chardev.c              | 2 +-
          <br>
            drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 6
          +++--- <br>
            drivers/gpu/drm/amd/amdkfd/kfd_priv.h                 | 2 +-
          <br>
            drivers/gpu/drm/amd/amdkfd/kfd_process.c              | 4
          ++-- <br>
            4 files changed, 7 insertions(+), 7 deletions(-) <br>
          <br>
          diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
          b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
          index 960913a35ee4..4da8aff3df27 100644 <br>
          --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
          +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
          @@ -1666,7 +1666,7 @@ static int
          kfd_ioctl_map_memory_to_gpu(struct file *filep, <br>
                    if (WARN_ON_ONCE(!peer_pdd)) <br>
                        continue; <br>
                    if (!amdgpu_read_lock(peer->ddev, true)) { <br>
          -            kfd_flush_tlb(peer_pdd); <br>
          +            kfd_flush_tlb(peer_pdd, TLB_FLUSH_LEGACY); <br>
                        amdgpu_read_unlock(peer->ddev); <br>
                    } <br>
                } <br>
          diff --git
          a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
          b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
          index 2bd621eee4e0..904b8178c1d7 100644 <br>
          --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
          +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
          @@ -278,7 +278,7 @@ static int allocate_vmid(struct
          device_queue_manager *dqm, <br>
                        qpd->vmid, <br>
                        qpd->page_table_base); <br>
                /* invalidate the VM context after pasid and vmid
          mapping is set up */ <br>
          -    kfd_flush_tlb(qpd_to_pdd(qpd)); <br>
          +    kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY); <br>
                  if
          (dqm->dev->kfd2kgd->set_scratch_backing_va) <br>
                   
          dqm->dev->kfd2kgd->set_scratch_backing_va(dqm->dev->kgd,
          <br>
          @@ -314,7 +314,7 @@ static void deallocate_vmid(struct
          device_queue_manager *dqm, <br>
                    if (flush_texture_cache_nocpsch(q->device, qpd))
          <br>
                        pr_err("Failed to flush TC\n"); <br>
            -    kfd_flush_tlb(qpd_to_pdd(qpd)); <br>
          +    kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY); <br>
                  /* Release the vmid mapping */ <br>
                set_pasid_vmid_mapping(dqm, 0, qpd->vmid); <br>
          @@ -885,7 +885,7 @@ static int
          restore_process_queues_nocpsch(struct device_queue_manager
          *dqm, <br>
                            dqm->dev->kgd, <br>
                            qpd->vmid, <br>
                            qpd->page_table_base); <br>
          -        kfd_flush_tlb(pdd); <br>
          +        kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY); <br>
                } <br>
                  /* Take a safe reference to the mm_struct, which may
          otherwise <br>
          diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
          b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
          index ecdd5e782b81..edce3ecf207d 100644 <br>
          --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
          +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
          @@ -1338,7 +1338,7 @@ void kfd_signal_reset_event(struct
          kfd_dev *dev); <br>
              void kfd_signal_poison_consumed_event(struct kfd_dev *dev,
          u32 pasid); <br>
            -void kfd_flush_tlb(struct kfd_process_device *pdd); <br>
          +void kfd_flush_tlb(struct kfd_process_device *pdd, enum
          TLB_FLUSH_TYPE type); <br>
              int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev,
          struct kfd_process *p); <br>
            diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
          b/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
          index 3995002c582b..72741f6579d3 100644 <br>
          --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
          +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
          @@ -2159,7 +2159,7 @@ int kfd_reserved_mem_mmap(struct kfd_dev
          *dev, struct kfd_process *process, <br>
                               KFD_CWSR_TBA_TMA_SIZE,
          vma->vm_page_prot); <br>
            } <br>
            -void kfd_flush_tlb(struct kfd_process_device *pdd) <br>
          +void kfd_flush_tlb(struct kfd_process_device *pdd, enum
          TLB_FLUSH_TYPE type) <br>
            { <br>
                struct kfd_dev *dev = pdd->dev; <br>
            @@ -2172,7 +2172,7 @@ void kfd_flush_tlb(struct
          kfd_process_device *pdd) <br>
                                        pdd->qpd.vmid); <br>
                } else { <br>
                    amdgpu_amdkfd_flush_gpu_tlb_pasid(dev->kgd, <br>
          -                    pdd->process->pasid,
          TLB_FLUSH_LEGACY); <br>
          +                    pdd->process->pasid, type); <br>
                } <br>
            } <br>
            </blockquote>
        <br>
      </blockquote>
    </blockquote>
    <br>
  </body>
</html>