Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
On Wed, 2013-12-04 at 08:44 -0800, H. Peter Anvin wrote: > On 12/04/2013 12:59 AM, Ingo Molnar wrote: > > > > * H. Peter Anvin wrote: > > > >> Hi guys, > >> > >> 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() > >> functions > >> > >> causes a regression, because it incorrectly changed the constraints of > >> bitops. > >> > >> Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as "er", but > >> it needs to be "Ir" for the bitops themselves. "I" is correct (as > >> opposed to "J" even on 64 bits, because we only generate the 64-bit > >> version when we have a register operand. > >> > >> Unfortunately there isn't a way we can get gcc+gas to generate a version > >> with an offset pointer. > > > > Does the regression manifest itself in any actual breakage - if yes, > > how does it look like? (People experiencing similar symptoms will be > > helped by seeing a fix matching their problems.) > > > > It was discovered because it caused a build failure in a > not-yet-submitted driver patch. This happens when someone uses > test_and_set_bit() or another similar operation on a fixed bit index > above 255; the assembler throws an error at that point and the build fails. > > *HOWEVER*, for bit indicies in the range 32-255, the current code will > instead silently miscompile, as the CPU will truncate the argument to 5 > bits. I don't know if there are any such instances in the current > kernel, but it is entirely possible there is, with unknown but > potentially disastrous results. I'm seeing reports from folks using vfio for PCI device assignment through QEMU that hugepages aren't being released on VM shutdown and reverting 0c44c2d0f459 resolves the problem. I haven't confirmed this myself nor do I pretend to understand the changes this commit makes. Thanks, Alex -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
On Wed, 2013-12-04 at 08:44 -0800, H. Peter Anvin wrote: On 12/04/2013 12:59 AM, Ingo Molnar wrote: * H. Peter Anvin h...@zytor.com wrote: Hi guys, 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions causes a regression, because it incorrectly changed the constraints of bitops. Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as er, but it needs to be Ir for the bitops themselves. I is correct (as opposed to J even on 64 bits, because we only generate the 64-bit version when we have a register operand. Unfortunately there isn't a way we can get gcc+gas to generate a version with an offset pointer. Does the regression manifest itself in any actual breakage - if yes, how does it look like? (People experiencing similar symptoms will be helped by seeing a fix matching their problems.) It was discovered because it caused a build failure in a not-yet-submitted driver patch. This happens when someone uses test_and_set_bit() or another similar operation on a fixed bit index above 255; the assembler throws an error at that point and the build fails. *HOWEVER*, for bit indicies in the range 32-255, the current code will instead silently miscompile, as the CPU will truncate the argument to 5 bits. I don't know if there are any such instances in the current kernel, but it is entirely possible there is, with unknown but potentially disastrous results. I'm seeing reports from folks using vfio for PCI device assignment through QEMU that hugepages aren't being released on VM shutdown and reverting 0c44c2d0f459 resolves the problem. I haven't confirmed this myself nor do I pretend to understand the changes this commit makes. Thanks, Alex -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
On 12/04/2013 12:59 AM, Ingo Molnar wrote: > > * H. Peter Anvin wrote: > >> Hi guys, >> >> 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() >> functions >> >> causes a regression, because it incorrectly changed the constraints of >> bitops. >> >> Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as "er", but >> it needs to be "Ir" for the bitops themselves. "I" is correct (as >> opposed to "J" even on 64 bits, because we only generate the 64-bit >> version when we have a register operand. >> >> Unfortunately there isn't a way we can get gcc+gas to generate a version >> with an offset pointer. > > Does the regression manifest itself in any actual breakage - if yes, > how does it look like? (People experiencing similar symptoms will be > helped by seeing a fix matching their problems.) > It was discovered because it caused a build failure in a not-yet-submitted driver patch. This happens when someone uses test_and_set_bit() or another similar operation on a fixed bit index above 255; the assembler throws an error at that point and the build fails. *HOWEVER*, for bit indicies in the range 32-255, the current code will instead silently miscompile, as the CPU will truncate the argument to 5 bits. I don't know if there are any such instances in the current kernel, but it is entirely possible there is, with unknown but potentially disastrous results. -hpa -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
* H. Peter Anvin wrote: > Hi guys, > > 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() > functions > > causes a regression, because it incorrectly changed the constraints of > bitops. > > Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as "er", but > it needs to be "Ir" for the bitops themselves. "I" is correct (as > opposed to "J" even on 64 bits, because we only generate the 64-bit > version when we have a register operand. > > Unfortunately there isn't a way we can get gcc+gas to generate a version > with an offset pointer. Does the regression manifest itself in any actual breakage - if yes, how does it look like? (People experiencing similar symptoms will be helped by seeing a fix matching their problems.) Thanks, ngo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
* H. Peter Anvin h...@zytor.com wrote: Hi guys, 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions causes a regression, because it incorrectly changed the constraints of bitops. Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as er, but it needs to be Ir for the bitops themselves. I is correct (as opposed to J even on 64 bits, because we only generate the 64-bit version when we have a register operand. Unfortunately there isn't a way we can get gcc+gas to generate a version with an offset pointer. Does the regression manifest itself in any actual breakage - if yes, how does it look like? (People experiencing similar symptoms will be helped by seeing a fix matching their problems.) Thanks, ngo -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
On 12/04/2013 12:59 AM, Ingo Molnar wrote: * H. Peter Anvin h...@zytor.com wrote: Hi guys, 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions causes a regression, because it incorrectly changed the constraints of bitops. Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as er, but it needs to be Ir for the bitops themselves. I is correct (as opposed to J even on 64 bits, because we only generate the 64-bit version when we have a register operand. Unfortunately there isn't a way we can get gcc+gas to generate a version with an offset pointer. Does the regression manifest itself in any actual breakage - if yes, how does it look like? (People experiencing similar symptoms will be helped by seeing a fix matching their problems.) It was discovered because it caused a build failure in a not-yet-submitted driver patch. This happens when someone uses test_and_set_bit() or another similar operation on a fixed bit index above 255; the assembler throws an error at that point and the build fails. *HOWEVER*, for bit indicies in the range 32-255, the current code will instead silently miscompile, as the CPU will truncate the argument to 5 bits. I don't know if there are any such instances in the current kernel, but it is entirely possible there is, with unknown but potentially disastrous results. -hpa -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
Hi guys, 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions causes a regression, because it incorrectly changed the constraints of bitops. Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as "er", but it needs to be "Ir" for the bitops themselves. "I" is correct (as opposed to "J" even on 64 bits, because we only generate the 64-bit version when we have a register operand. Unfortunately there isn't a way we can get gcc+gas to generate a version with an offset pointer. -hpa -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Regression due to 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions
Hi guys, 0c44c2d0f459 x86: Use asm goto to implement better modify_and_test() functions causes a regression, because it incorrectly changed the constraints of bitops. Specifically, the GEN_BINARY_RMWcc() hardcodes a constraint as er, but it needs to be Ir for the bitops themselves. I is correct (as opposed to J even on 64 bits, because we only generate the 64-bit version when we have a register operand. Unfortunately there isn't a way we can get gcc+gas to generate a version with an offset pointer. -hpa -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/