From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751276AbcGGNMg (ORCPT ); Thu, 7 Jul 2016 09:12:36 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:55027 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750734AbcGGNM3 (ORCPT ); Thu, 7 Jul 2016 09:12:29 -0400 X-IBM-Helo: d06dlp02.portsmouth.uk.ibm.com X-IBM-MailFrom: ldufour@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org Subject: Re: [v4] powerpc: Export thread_struct.used_vr/used_vsr to user space To: Michael Ellerman , Simon Guo References: <3rlZmP39HNz9sXR@ozlabs.org> Cc: Kees Cook , Rashmica Gupta , linux-kernel@vger.kernel.org, Paul Mackerras , linuxppc-dev@lists.ozlabs.org From: Laurent Dufour Date: Thu, 7 Jul 2016 15:12:20 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <3rlZmP39HNz9sXR@ozlabs.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16070713-0008-0000-0000-000002995FC4 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16070713-0009-0000-0000-000019018ACE Message-Id: <577E5534.70300@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-07-07_09:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1607070123 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/07/2016 13:15, Michael Ellerman wrote: > On Thu, 2016-07-07 at 07:49:36 UTC, Simon Guo wrote: >> From: Simon Guo >> >> These 2 fields track whether user process has used Altivec/VSX >> registers or not. They are used by kernel to setup signal frame >> on user stack correctly regarding vector part. > > I still dislike this. It's just exporting internal kernel state, which I know is > the point. > > And I'd still like to know why we're the only arch that needs to do this. > > I'm not saying I won't merge it, but I'd like to understand it better first. > >> CRIU(Checkpoint and Restore In User space) builds signal frame >> for restored process. It will need this export information to >> setup signal frame correctly. And CRIU will need to restore these >> 2 fields for the restored process. > > I don't really know how CRIU works, but .. > > Does the kernel write a sigframe for the process that's being checkpointed? If > so can't you infer the state of the bits based on what was written? Hi Michael, Basically, CRIU checkpoints the process register's state through the ptrace API, and it restores it through a signal frame at restart time. This is quite odd but that the way it works on all the CRIU's supported architectures. Obviously everything is done from/in user space, so the sigframe building too. Since we can't know from user space if the thread has used or not the Altivec/VSX registers, since we can't rely on the MSR bits, we always dump these registers. > Alternately, when restoring, can you setup the sigframe with the Altivec/VSX > fields populated, and the kernel will then load them, regardless of whether > they were actually used or not prior to the checkpoint? In the case of Altivec/VSX fields, we currently force the kernel to retrieve them from the signal frame by setting MSR_VEC/MSR_VSX so restore_sigcontext() will copy them to the kernel thread's state. However this doesn't touch to used_vsr and used_vr which may remain at 0. Most of the time this is fine, but in the case a thread which has really used those registers is catching a signal just after the restore and before it has touched to these registers again (and so set used_vsr/vr), these registers will not be pushed in the newly built signal frame since setup_sigcontext() check for used_vsr/vr before pushing the registers on the stack. This may be an issue in the case the thread wants to changed those registers (don't ask me why :)) in the stacked signal frame from the signal handler since they will not be there... Being able to get and set the used_vr and used_vsr thread's variables, fixes this issue. Cheers, Laurent.