struct kvm_guest_debug_arch vcpu_debug_state;
        struct kvm_guest_debug_arch external_debug_state;
 
-       struct task_struct *parent_task;
-
        /* VGIC state */
        struct vgic_cpu vgic_cpu;
        struct arch_timer_cpu timer_cpu;
 void kvm_arch_vcpu_ctxflush_fp(struct kvm_vcpu *vcpu);
 void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu);
 void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu);
-void kvm_vcpu_unshare_task_fp(struct kvm_vcpu *vcpu);
 
 static inline bool kvm_pmu_counter_deferred(struct perf_event_attr *attr)
 {
 
 #include <asm/kvm_mmu.h>
 #include <asm/sysreg.h>
 
-void kvm_vcpu_unshare_task_fp(struct kvm_vcpu *vcpu)
-{
-       struct task_struct *p = vcpu->arch.parent_task;
-       struct user_fpsimd_state *fpsimd;
-
-       if (!is_protected_kvm_enabled() || !p)
-               return;
-
-       fpsimd = &p->thread.uw.fpsimd_state;
-       kvm_unshare_hyp(fpsimd, fpsimd + 1);
-       put_task_struct(p);
-}
-
 /*
  * Called on entry to KVM_RUN unless this vcpu previously ran at least
  * once and the most recent prior KVM_RUN for this vcpu was called from
  */
 int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)
 {
-       int ret;
-
        struct user_fpsimd_state *fpsimd = ¤t->thread.uw.fpsimd_state;
+       int ret;
 
-       kvm_vcpu_unshare_task_fp(vcpu);
+       /* pKVM has its own tracking of the host fpsimd state. */
+       if (is_protected_kvm_enabled())
+               return 0;
 
        /* Make sure the host task fpsimd state is visible to hyp: */
        ret = kvm_share_hyp(fpsimd, fpsimd + 1);
        if (ret)
                return ret;
 
-       /*
-        * We need to keep current's task_struct pinned until its data has been
-        * unshared with the hypervisor to make sure it is not re-used by the
-        * kernel and donated to someone else while already shared -- see
-        * kvm_vcpu_unshare_task_fp() for the matching put_task_struct().
-        */
-       if (is_protected_kvm_enabled()) {
-               get_task_struct(current);
-               vcpu->arch.parent_task = current;
-       }
-
        return 0;
 }
 
 
 {
        void *sve_state = vcpu->arch.sve_state;
 
-       kvm_vcpu_unshare_task_fp(vcpu);
        kvm_unshare_hyp(vcpu, vcpu + 1);
        if (sve_state)
                kvm_unshare_hyp(sve_state, sve_state + vcpu_sve_state_size(vcpu));