mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 15:34:48 +08:00
powerpc fixes for 4.18 #5
One fix for a regression in a recent TLB flush optimisation, which caused us to incorrectly not send TLB invalidations to coprocessors. Thanks to: Frederic Barrat, Nicholas Piggin, Vaibhav Jain. -----BEGIN PGP SIGNATURE----- iQIwBAABCAAaBQJbZDxOExxtcGVAZWxsZXJtYW4uaWQuYXUACgkQUevqPMjhpYAm 7w//QcYYpBcBu9XK0E53XglSoC4iTzMrPnIIivPsSngLXWtEC/5315nbCOdhT4mh CTYxmwCm0pZG4kxJntnT4MXwSLhM46eFs586uOS1BgEJw+m85m2tiEsrNQSogJ14 GzZiIk1UbzKUZjpSTIXigx0Um6x+q83kIBhd/ewrejB1wz6d5T7Wktjv2iWewGdf kOJPXuvaWXeGmJWJ2Gek3T5j7PCII0humEQjsy40XVFR3NYC7jT1r4UONE3NeBTU xavo/EcB3JHx2MPPgAfJT/KAiHLQZzuR382azf7W5sQJ7/Yy2N1jpskSxFoMEMtc axYWniHfGwJsnwcO4HPisIA67tXR6EzugAyuta4IQufRVp1s+j2WIzyqjl4uOB7Q v5ZXBH/Y4wShqVHhUzzQasiJgGYZoUoeOvJIoFNEo5f6UFuT/l9mkuM4vPtNKi6i NpT2Hj/hTATNRGyrBnvjcktS8uHbVxSHE6Cm4ZHSfQ8POMulUKvhHTZ7gYsxpxUE ktKCNgNL57QHRQojY0AftpEMLrDYiJEE9+6OLjEk3Mf7ayiZAAjIpy7LRD9+p8Q8 eomEXmwQr1YOXGgvS0mFFPd+P2PfJoQztd1fWZtZIY1xksdwGep65e24hBOEjCAV 7vVx+3pm+dekEFVf976ZYgACHCjOn8Efd5t+AK7b8S0u0uw= =Z81h -----END PGP SIGNATURE----- Merge tag 'powerpc-4.18-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fixes from Michael Ellerman: "One fix for a regression in a recent TLB flush optimisation, which caused us to incorrectly not send TLB invalidations to coprocessors. Thanks to Frederic Barrat, Nicholas Piggin, Vaibhav Jain" * tag 'powerpc-4.18-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/64s/radix: Fix missing global invalidations when removing copro
This commit is contained in:
commit
2ed7533cb7
@ -143,23 +143,32 @@ static inline void mm_context_remove_copro(struct mm_struct *mm)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
c = atomic_dec_if_positive(&mm->context.copros);
|
|
||||||
|
|
||||||
/* Detect imbalance between add and remove */
|
|
||||||
WARN_ON(c < 0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Need to broadcast a global flush of the full mm before
|
* When removing the last copro, we need to broadcast a global
|
||||||
* decrementing active_cpus count, as the next TLBI may be
|
* flush of the full mm, as the next TLBI may be local and the
|
||||||
* local and the nMMU and/or PSL need to be cleaned up.
|
* nMMU and/or PSL need to be cleaned up.
|
||||||
* Should be rare enough so that it's acceptable.
|
*
|
||||||
|
* Both the 'copros' and 'active_cpus' counts are looked at in
|
||||||
|
* flush_all_mm() to determine the scope (local/global) of the
|
||||||
|
* TLBIs, so we need to flush first before decrementing
|
||||||
|
* 'copros'. If this API is used by several callers for the
|
||||||
|
* same context, it can lead to over-flushing. It's hopefully
|
||||||
|
* not common enough to be a problem.
|
||||||
*
|
*
|
||||||
* Skip on hash, as we don't know how to do the proper flush
|
* Skip on hash, as we don't know how to do the proper flush
|
||||||
* for the time being. Invalidations will remain global if
|
* for the time being. Invalidations will remain global if
|
||||||
* used on hash.
|
* used on hash. Note that we can't drop 'copros' either, as
|
||||||
|
* it could make some invalidations local with no flush
|
||||||
|
* in-between.
|
||||||
*/
|
*/
|
||||||
if (c == 0 && radix_enabled()) {
|
if (radix_enabled()) {
|
||||||
flush_all_mm(mm);
|
flush_all_mm(mm);
|
||||||
|
|
||||||
|
c = atomic_dec_if_positive(&mm->context.copros);
|
||||||
|
/* Detect imbalance between add and remove */
|
||||||
|
WARN_ON(c < 0);
|
||||||
|
|
||||||
|
if (c == 0)
|
||||||
dec_mm_active_cpus(mm);
|
dec_mm_active_cpus(mm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user