| Posted | Nick | Remark | |
|---|---|---|---|
| #openstack-nova - 2023-01-23 | |||
| 13:25:45 | kashyap | + cpu_model_extra_flags = ["-aes"], | |
| 13:25:52 | gibi | it is more like a question. Do we want to run the check if on extra flags are configured? | |
| 13:26:54 | kashyap | gibi: Yeah, we do want to check to run (_compare_cpu) when the extra_flags are configured -- is that what you ask? | |
| 13:27:15 | gibi | scratch the nova.tests.fixtures.libvirt.Connection.compareCPU issue that was my mistake | |
| 13:27:46 | kashyap | gibi: I had to add the above diff, _and_ also return a negative integer for mocked_compare | |
| 13:28:16 | kashyap | gibi: So that's the fully modified test - https://paste.opendev.org/show/bPZk3eYZzuS4F7yazGqK/ | |
| 13:28:22 | kashyap | See line-6 and line-9 | |
| 13:28:42 | gibi | kashyap: my question is: if there is no extra flags configured, should we still run the compare_cpu or is it OK to only run the compare_cpu if there are extra flags configured | |
| 13:29:02 | gibi | kashyap: yepp tha paste matches what I did | |
| 13:29:04 | sean-k-mooney | gibi: we should run the compare if there are no extra flags | |
| 13:29:13 | sean-k-mooney | we just dont need to modify the model | |
| 13:29:20 | gibi | then we need to change the code up a bit | |
| 13:29:41 | gibi | as this for loop is empty if no extra flags provided https://review.opendev.org/c/openstack/nova/+/870794/8/nova/virt/libvirt/driver.py#992 | |
| 13:29:41 | sean-k-mooney | the code should treat it as an empty list of flags | |
| 13:29:57 | kashyap | sean-k-mooney: We never modify the model ourselves | |
| 13:30:13 | gibi | sean-k-mooney: also I'm not sure you see that but this code compares the extra flag independently one by one, not all at once | |
| 13:30:15 | sean-k-mooney | well not the model but the cpu definition | |
| 13:31:14 | sean-k-mooney | what we want the algortim to do is generate teh cpu xml from the modle then apply any flags that are present and then do one compare | |
| 13:31:26 | sean-k-mooney | it should do that for each model in cpu_models | |
| 13:31:28 | kashyap | gibi: Can you summarize your observation in the comment, please? (Also - the one-by-one flag comparison - I don't see an issue there) | |
| 13:31:36 | sean-k-mooney | and raise an error if any of them fail | |
| 13:31:58 | gibi | kashyap: sure | |
| 13:32:14 | sean-k-mooney | doing it flag by flag is an optimisation of that in that it will fail on the first flag that is not supported | |
| 13:32:30 | sean-k-mooney | but its not really sematicaly correct | |
| 13:32:45 | sean-k-mooney | for example to disable TSX you need to remove two flags | |
| 13:32:54 | sean-k-mooney | doing it one at a time will fail in that case | |
| 13:33:07 | kashyap | gibi: Also, I'm not sure I agree with sean-k-mooney on to run the _compare_cpu() when there are no flags there | |
| 13:33:22 | sean-k-mooney | no flags means do not modify the enabled model | |
| 13:33:24 | kashyap | sean-k-mooney: If you run it w/o the flags, then that means it's the same as the first call that we removed | |
| 13:33:31 | sean-k-mooney | so we still need to check that for validity | |
| 13:33:37 | kashyap | Does what I say above that make sense? | |
| 13:33:54 | sean-k-mooney | kashyap: the first call is correct where teh model is comaptible with the host | |
| 13:34:51 | sean-k-mooney | flags is optional and only needed fi teh default models shipped by lbivrt/qemu are not sufficent fro your usecase | |
| 13:35:04 | sean-k-mooney | where they are you should not be requried to use it but we should still validate the model | |
| 13:35:58 | gibi | there is a difference between the old check we removed and using the new check with the empty flag list | |
| 13:36:00 | sean-k-mooney | i mentioned in one of my reviews i was not sure the current compare was correct and the per flag iteration was one of my concerns | |
| 13:36:12 | kashyap | sean-k-mooney: Huh, if we retain the second call when no flags are given, then there's no difference with the _removed_ call in this patch -- gibi: does this make sense? | |
| 13:36:35 | gibi | the old check used cpu.model = self._get_cpu_model_mapping(model) as the the one to compare while the remaining check uses self._host.get_capabilities().host.cpu.model + the extra flags | |
| 13:36:38 | sean-k-mooney | the first call was only incorrect if you use extra flags | |
| 13:36:54 | kashyap | [ What's the diff with the new (or rather the 2nd check) with an empty flag list? Ah, you just write above] | |
| 13:38:06 | sean-k-mooney | well the second check is wrong because its not looping over al the models enabeld in cpu_models | |
| 13:38:13 | kashyap | Hmm, I'm trying to minimize the "impact surface" here. | |
| 13:38:47 | gibi | I guess we are back to the drawing board then | |
| 13:38:57 | kashyap | gibi: The first check was wrong anyway: so that we can remove w/o doubt. | |
| 13:39:10 | sean-k-mooney | no not in all cases | |
| 13:39:21 | sean-k-mooney | it was only wrogn if you enabled a modle that is not compatible with the cpu | |
| 13:39:21 | gibi | the two check uses a different cpu.model for comparision | |
| 13:39:39 | sean-k-mooney | gibi: right and the second check is not looping over the lsit fo cpu_modles | |
| 13:40:22 | sean-k-mooney | so we need to 1 loop over them using self._get_cpu_model_mapping(model) and 2 apply all cpu flags before doing the compare | |
| 13:41:17 | sean-k-mooney | 3 the comapre should not be condtional on extra flags and should happen even when empty | |
| 13:41:53 | kashyap | Hm, that could make whole code flow to be changed and a lot more surface impact :-( - I wonder if we try it on _top_ of the workaround? | |
| 13:41:57 | gibi | basically to see that each configred model with all the configured flags applied are still compatible with the hypervisor | |
| 13:42:39 | kashyap | gibi: Yeah, that's what libvirt will be doing under the hood "by default". | |
| 13:43:11 | gibi | kashyap: I don't think so. I guess libvirt will do the check during boot with the selected model + extra flags | |
| 13:43:24 | gibi | not each model + flags at startup | |
| 13:43:30 | kashyap | (I'm just thinking if we can "do this additional improvement" on _top_ of the current workaround + API replacement patch?) | |
| 13:43:56 | gibi | I guess if we want the workaround to land independently then we need to add back the old check and make both check optional with the WA flag. | |
| 13:44:12 | gibi | sean-k-mooney: ^^ what do you think? | |
| 13:44:39 | kashyap | Hmm, the first check is wrong unilaterally - sean-k-mooney agrees that too, IIUC | |
| 13:44:56 | kashyap | (As based on his suggestion is the current revision) | |
| 13:45:42 | kashyap | (And thanks for your patience so far, folks!) | |
| 13:45:55 | gibi | then I'm confused, as we discussed above that the second check alone is not enough. | |
| 13:46:07 | sean-k-mooney | https://review.opendev.org/c/openstack/nova/+/870794/8/nova/virt/libvirt/driver.py#992 | |
| 13:46:14 | sean-k-mooney | kashyap: actully i dont | |
| 13:46:17 | gibi | as it does nothing when no extra flags I configured | |
| 13:46:30 | sean-k-mooney | kashyap: i said its condtionally wrong if and only if you use extra_flags | |
| 13:47:03 | sean-k-mooney | anyway i posted what i think is the correct code in the comment above ^ | |
| 13:48:16 | kashyap | sean-k-mooney: Well, I'm fine if you've refined your view _now_. But a few days ago you did write here: | |
| 13:48:19 | kashyap | (quote) | |
| 13:48:22 | kashyap | < sean-k-mooney> but if you want to future proof then sure you can put the remain check under a workaroudn | |
| 13:48:25 | kashyap | [...] | |
| 13:48:27 | kashyap | < sean-k-mooney> or just delete the first check | |
| 13:48:30 | kashyap | (/quote) | |
| 13:49:11 | kashyap | (Doing "nothing when no extra flags" are configured is still fine - as it was already explicitly tested by a downstream bug reporter in a real env) | |
| 13:49:19 | sean-k-mooney | yes i did not express my concern at that point with the looping as i tought i has already disucsst that with you | |
| 13:49:30 | kashyap | Okay. | |
| 13:49:59 | sean-k-mooney | kashyap: its not fine because its an upstream regression | |
| 13:50:00 | kashyap | gibi: sean-k-mooney: Also it was tested with the workaround as it stands: https://bugzilla.redhat.com/show_bug.cgi?id=2138381#c45 | |
| 13:50:12 | kashyap | (Unforunately, it's a private comment, so only RHTers can see it) | |
| 13:51:12 | kashyap | (Hmm, perhaps ignore that test, I think he tested it with the first revision) | |
| 13:51:25 | gibi | kashyap: you will only see the changed behaivor if the test is configuring incompatible model without extra flags. | |
| 13:51:50 | kashyap | gibi: True | |
| 13:51:55 | gibi | in the baseline that will fail the startup of nova-compute in the new code it will let the nova-compute start | |
| 13:52:08 | gibi | but fail all instance boot instead | |
| 13:52:15 | kashyap | I'm trying to find a reasonable compromise here: so shall I put both the blocks back into the code and add the workaround? | |
| 13:52:24 | kashyap | (s/blocks/calls/) | |
| 13:53:08 | kashyap | gibi: Right, failing at instance boot is still "something" - as it still provides a libvirt error. But I know we've already discussed and that's not 'acceptable' | |
| 13:53:50 | sean-k-mooney | i condier the bug you are introduceing by removign all cpu checks in the case that cpu flags is empty to be more serios then the bug you are trying to fix | |
| 13:53:54 | kashyap | sean-k-mooney: Keeping the first call in tact will break upstream deployments whenever using Icelake and Cascadelake | |
| 13:54:21 | sean-k-mooney[m] | the code i put in a comment in the reveiw will work for that case | |
| 13:54:25 | kashyap | sean-k-mooney: gibi: Okay: I'll keep both the checks in and wrap 'em around the workaround. | |
| 13:54:29 | sean-k-mooney[m] | and provide the corect behavior in other cases | |
| 13:54:32 | kashyap | Does that suit? | |
| 13:54:42 | sean-k-mooney[m] | have you looked at the code i provided | |
| 13:54:49 | sean-k-mooney[m] | i would perfer if you used that | |
| 13:54:59 | kashyap | Not yet; /me goes to look | |
| 13:55:54 | sean-k-mooney | my network went down for a minute or two so i read scrollback on matrix so i think im caught back up | |
| 13:56:03 | gibi | sean-k-mooney: does that change works for the *lake issue even if the compare_cpu is not replaced with the compare_hypervisor_cpu call? | |
| 13:56:37 | sean-k-mooney | oh am i ment to use the new api but i think it would yes | |
| 13:56:38 | kashyap | sean-k-mooney: So you did this: | |