)]}'
{"nova/virt/libvirt/driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4281,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4282,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4283,"context_line":""},{"line_number":4284,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4285,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4286,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4287,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4288,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4289,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4290,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4291,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4292,"context_line":"                #"},{"line_number":4293,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4294,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4295,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4296,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4297,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4298,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4299,"context_line":"                # for QEMU community devs."},{"line_number":4300,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4301,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4302,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_e3743d00","side":"PARENT","line":4299,"range":{"start_line":4284,"start_character":0,"end_line":4299,"end_character":42},"updated":"2018-02-13 21:28:14.000000000","message":"This seems like an important comment that you removed... any reason why?","commit_id":"cfdc1d0c5110e62ca0a7db57fa92f9d9f5b063be"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"9ee1b535c620869ef1aac502cb8956ab0f05efe8","unresolved":false,"context_lines":[{"line_number":4281,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4282,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4283,"context_line":""},{"line_number":4284,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4285,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4286,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4287,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4288,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4289,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4290,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4291,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4292,"context_line":"                #"},{"line_number":4293,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4294,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4295,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4296,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4297,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4298,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4299,"context_line":"                # for QEMU community devs."},{"line_number":4300,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4301,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4302,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_c3ca2ca0","side":"PARENT","line":4299,"range":{"start_line":4284,"start_character":0,"end_line":4299,"end_character":42},"in_reply_to":"3fa0c359_8ed45dbf","updated":"2018-02-15 14:59:32.000000000","message":"I think the comment is still relevant. Despite improved flexibility / options in Nova\u0027s emulator threads placement, you still have the stated problem. If a guest spans many NUMA nodes, then you\u0027re likely to have cross-node I/O traffic. Solving this requires exposing PCI bridge \u003c-\u003e NUMA node affinity information or using I/O threads, or more likely a combination of both. Nova hasn\u0027t done that yet","commit_id":"cfdc1d0c5110e62ca0a7db57fa92f9d9f5b063be"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"223286c646afc3c6e3c02856dec670a57d1850f9","unresolved":false,"context_lines":[{"line_number":4281,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4282,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4283,"context_line":""},{"line_number":4284,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4285,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4286,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4287,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4288,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4289,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4290,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4291,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4292,"context_line":"                #"},{"line_number":4293,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4294,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4295,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4296,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4297,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4298,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4299,"context_line":"                # for QEMU community devs."},{"line_number":4300,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4301,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4302,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_92bbf30c","side":"PARENT","line":4299,"range":{"start_line":4284,"start_character":0,"end_line":4299,"end_character":42},"in_reply_to":"3fa0c359_a3cb6070","updated":"2018-02-17 05:32:49.000000000","message":"@Daniel\nIt\u0027s a great pleasure to see you here. Thank you.","commit_id":"cfdc1d0c5110e62ca0a7db57fa92f9d9f5b063be"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4b68963f8aa04a5d05a8a5e22fb797319133656c","unresolved":false,"context_lines":[{"line_number":4281,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4282,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4283,"context_line":""},{"line_number":4284,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4285,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4286,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4287,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4288,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4289,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4290,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4291,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4292,"context_line":"                #"},{"line_number":4293,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4294,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4295,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4296,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4297,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4298,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4299,"context_line":"                # for QEMU community devs."},{"line_number":4300,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4301,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4302,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_a3cb6070","side":"PARENT","line":4299,"range":{"start_line":4284,"start_character":0,"end_line":4299,"end_character":42},"in_reply_to":"3fa0c359_c3ca2ca0","updated":"2018-02-15 15:01:58.000000000","message":"Hey, thanks Dan for your insight. Much appreciated!","commit_id":"cfdc1d0c5110e62ca0a7db57fa92f9d9f5b063be"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4281,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4282,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4283,"context_line":""},{"line_number":4284,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4285,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4286,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4287,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4288,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4289,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4290,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4291,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4292,"context_line":"                #"},{"line_number":4293,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4294,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4295,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4296,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4297,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4298,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4299,"context_line":"                # for QEMU community devs."},{"line_number":4300,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4301,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4302,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_8ed45dbf","side":"PARENT","line":4299,"range":{"start_line":4284,"start_character":0,"end_line":4299,"end_character":42},"in_reply_to":"3fa0c359_e3743d00","updated":"2018-02-15 05:33:42.000000000","message":"Because I thought this comments just said \"we should propose emulator_threads_policy if QEMU community is ready for that.\" It is already done, and now this should be removed!\n\n...but to be honest, I\u0027m not sure if I\u0027m getting this comments exactly.","commit_id":"cfdc1d0c5110e62ca0a7db57fa92f9d9f5b063be"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4164,"context_line":"            b) Otherwise we float over the whole host NUMA node"},{"line_number":4165,"context_line":"        \"\"\""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"        pin_cpuset \u003d ("},{"line_number":4168,"context_line":"            vconfig.LibvirtConfigGuestCPUTuneVCPUPin())"},{"line_number":4169,"context_line":"        pin_cpuset.id \u003d cpu"},{"line_number":4170,"context_line":""},{"line_number":4171,"context_line":"        if (object_numa_cell.cpu_pinning and"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_4392d158","line":4168,"range":{"start_line":4167,"start_character":8,"end_line":4168,"end_character":55},"updated":"2018-02-13 21:28:14.000000000","message":"pretty sure this can fit on a single line :)","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4164,"context_line":"            b) Otherwise we float over the whole host NUMA node"},{"line_number":4165,"context_line":"        \"\"\""},{"line_number":4166,"context_line":""},{"line_number":4167,"context_line":"        pin_cpuset \u003d ("},{"line_number":4168,"context_line":"            vconfig.LibvirtConfigGuestCPUTuneVCPUPin())"},{"line_number":4169,"context_line":"        pin_cpuset.id \u003d cpu"},{"line_number":4170,"context_line":""},{"line_number":4171,"context_line":"        if (object_numa_cell.cpu_pinning and"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_cec105e7","line":4168,"range":{"start_line":4167,"start_character":8,"end_line":4168,"end_character":55},"in_reply_to":"3fa0c359_4392d158","updated":"2018-02-15 05:33:42.000000000","message":"Done","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4181,"context_line":"                                emulator_threads_isolated, wants_realtime,"},{"line_number":4182,"context_line":"                                pin_cpuset):"},{"line_number":4183,"context_line":"        \"\"\"Returns a set of cpu_ids to add to the cpuset for emulator threads."},{"line_number":4184,"context_line":"        Prepares emulatorpin config for the guest with the following caveats:"},{"line_number":4185,"context_line":""},{"line_number":4186,"context_line":"            a) If emulator threads policy is isolated, we pin emulator threads"},{"line_number":4187,"context_line":"               to one cpu we have reserved for it."}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_03eda9b5","line":4184,"range":{"start_line":4184,"start_character":8,"end_line":4184,"end_character":49},"updated":"2018-02-13 21:28:14.000000000","message":"this method isn\u0027t returning a config component... it\u0027s just returning a set()","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4181,"context_line":"                                emulator_threads_isolated, wants_realtime,"},{"line_number":4182,"context_line":"                                pin_cpuset):"},{"line_number":4183,"context_line":"        \"\"\"Returns a set of cpu_ids to add to the cpuset for emulator threads."},{"line_number":4184,"context_line":"        Prepares emulatorpin config for the guest with the following caveats:"},{"line_number":4185,"context_line":""},{"line_number":4186,"context_line":"            a) If emulator threads policy is isolated, we pin emulator threads"},{"line_number":4187,"context_line":"               to one cpu we have reserved for it."}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_94878a10","line":4184,"range":{"start_line":4184,"start_character":8,"end_line":4184,"end_character":49},"in_reply_to":"3fa0c359_03eda9b5","updated":"2018-02-15 05:33:42.000000000","message":"Deleted this part. Please see the following comment.","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4198,"context_line":"        emulatorpin_cpuset \u003d set([])"},{"line_number":4199,"context_line":""},{"line_number":4200,"context_line":"        if emulator_threads_isolated:"},{"line_number":4201,"context_line":"            emulatorpin_cpuset \u003d set("},{"line_number":4202,"context_line":"                            object_numa_cell.cpuset_reserved)"},{"line_number":4203,"context_line":"        elif not wants_realtime or cpu not in vcpus_rt:"},{"line_number":4204,"context_line":"            emulatorpin_cpuset \u003d set(pin_cpuset.cpuset)"},{"line_number":4205,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_03712944","line":4202,"range":{"start_line":4201,"start_character":12,"end_line":4202,"end_character":61},"updated":"2018-02-13 21:28:14.000000000","message":"one line :)","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4198,"context_line":"        emulatorpin_cpuset \u003d set([])"},{"line_number":4199,"context_line":""},{"line_number":4200,"context_line":"        if emulator_threads_isolated:"},{"line_number":4201,"context_line":"            emulatorpin_cpuset \u003d set("},{"line_number":4202,"context_line":"                            object_numa_cell.cpuset_reserved)"},{"line_number":4203,"context_line":"        elif not wants_realtime or cpu not in vcpus_rt:"},{"line_number":4204,"context_line":"            emulatorpin_cpuset \u003d set(pin_cpuset.cpuset)"},{"line_number":4205,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_eea96124","line":4202,"range":{"start_line":4201,"start_character":12,"end_line":4202,"end_character":61},"in_reply_to":"3fa0c359_03712944","updated":"2018-02-15 05:33:42.000000000","message":"Done","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4300,"context_line":"                                    instance_numa_topology.cells[guest_node_id]"},{"line_number":4301,"context_line":"                                )"},{"line_number":4302,"context_line":"                            for cpu in guest_config_cell.cpus:"},{"line_number":4303,"context_line":"                                pin_cpuset \u003d ("},{"line_number":4304,"context_line":"                                    self._get_pin_cpuset(cpu, object_numa_cell,"},{"line_number":4305,"context_line":"                                        host_cell))"},{"line_number":4306,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4307,"context_line":""},{"line_number":4308,"context_line":"                                emu_pcpu_set |\u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_e3c3dd36","line":4305,"range":{"start_line":4303,"start_character":32,"end_line":4305,"end_character":51},"updated":"2018-02-13 21:28:14.000000000","message":"could be more condensed as:\n\n pin_cpuset \u003d self._get_pin_cpuset(\n     cpu, object_numa_cell, host_cell)","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4300,"context_line":"                                    instance_numa_topology.cells[guest_node_id]"},{"line_number":4301,"context_line":"                                )"},{"line_number":4302,"context_line":"                            for cpu in guest_config_cell.cpus:"},{"line_number":4303,"context_line":"                                pin_cpuset \u003d ("},{"line_number":4304,"context_line":"                                    self._get_pin_cpuset(cpu, object_numa_cell,"},{"line_number":4305,"context_line":"                                        host_cell))"},{"line_number":4306,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4307,"context_line":""},{"line_number":4308,"context_line":"                                emu_pcpu_set |\u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_0ea7ed51","line":4305,"range":{"start_line":4303,"start_character":32,"end_line":4305,"end_character":51},"in_reply_to":"3fa0c359_e3c3dd36","updated":"2018-02-15 05:33:42.000000000","message":"Done","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f812ce95577909b3dad6bf36a0bf0531ee8cdf0d","unresolved":false,"context_lines":[{"line_number":4313,"context_line":""},{"line_number":4314,"context_line":"                # Sort the vcpupin list per vCPU id for human-friendlier XML"},{"line_number":4315,"context_line":"                guest_cpu_tune.vcpupin.sort(key\u003doperator.attrgetter(\"id\"))"},{"line_number":4316,"context_line":""},{"line_number":4317,"context_line":"                # Set pcpus for emulator threads"},{"line_number":4318,"context_line":"                if emu_pcpu_set:"},{"line_number":4319,"context_line":"                    guest_cpu_tune.emulatorpin \u003d ("},{"line_number":4320,"context_line":"                        vconfig.LibvirtConfigGuestCPUTuneEmulatorPin())"},{"line_number":4321,"context_line":"                    guest_cpu_tune.emulatorpin.cpuset \u003d emu_pcpu_set"},{"line_number":4322,"context_line":""},{"line_number":4323,"context_line":"                # normalize cell.id"},{"line_number":4324,"context_line":"                for i, (cell, memnode) in enumerate("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_c367c14c","line":4321,"range":{"start_line":4316,"start_character":0,"end_line":4321,"end_character":68},"updated":"2018-02-13 21:28:14.000000000","message":"you could move all this up into the _get_emulatorpin_cpuset() method and rename it to something like _get_emulatorpin_config() to make it fit the docstring you currently have in _get_emulatorpin_cpuset().","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d56ca75ad08a4df1ad557efa7f3f5ba4a54415dc","unresolved":false,"context_lines":[{"line_number":4313,"context_line":""},{"line_number":4314,"context_line":"                # Sort the vcpupin list per vCPU id for human-friendlier XML"},{"line_number":4315,"context_line":"                guest_cpu_tune.vcpupin.sort(key\u003doperator.attrgetter(\"id\"))"},{"line_number":4316,"context_line":""},{"line_number":4317,"context_line":"                # Set pcpus for emulator threads"},{"line_number":4318,"context_line":"                if emu_pcpu_set:"},{"line_number":4319,"context_line":"                    guest_cpu_tune.emulatorpin \u003d ("},{"line_number":4320,"context_line":"                        vconfig.LibvirtConfigGuestCPUTuneEmulatorPin())"},{"line_number":4321,"context_line":"                    guest_cpu_tune.emulatorpin.cpuset \u003d emu_pcpu_set"},{"line_number":4322,"context_line":""},{"line_number":4323,"context_line":"                # normalize cell.id"},{"line_number":4324,"context_line":"                for i, (cell, memnode) in enumerate("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa0c359_b4e72647","line":4321,"range":{"start_line":4316,"start_character":0,"end_line":4321,"end_character":68},"in_reply_to":"3fa0c359_c367c14c","updated":"2018-02-15 05:33:42.000000000","message":"The initialization can\u0027t be in the iteration clause, so I moved the initialization on the top, and put this part into the iteration. By this change, we need resetting of the initialization guest_cpu_tune.emulatorpin field in qemu tcg case in the following patch[1]. \n\nBut yes, I like this better since we should refactor this without considering qemu tcg case.\n\n[1] https://review.openstack.org/#/c/530451/7/nova/virt/libvirt/driver.py @L4327","commit_id":"791cae80177558afbb89743bc203bb50746a2028"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bcfa569c0a6b0d15f0d3081179a7efe4ac6333af","unresolved":false,"context_lines":[{"line_number":4279,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4280,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4281,"context_line":""},{"line_number":4282,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4283,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4284,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4285,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4286,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4287,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4288,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4289,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4290,"context_line":"                #"},{"line_number":4291,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4292,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4293,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4294,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4295,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4296,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4297,"context_line":"                # for QEMU community devs."},{"line_number":4298,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4299,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4300,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa0c359_6373184f","side":"PARENT","line":4297,"range":{"start_line":4282,"start_character":0,"end_line":4297,"end_character":42},"updated":"2018-02-15 15:03:03.000000000","message":"Based on Dan\u0027s comment on the previous patch (and my conversations with Kashyap this morning), it looks like this comment is indeed still valid, so Tetsuro, please do restore it! :) Thanks!","commit_id":"23d21a20a26df12c26537d2a57921a4a589dd515"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"16e65a560830332547239a80e376e7a5a6e5fce6","unresolved":false,"context_lines":[{"line_number":4279,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4280,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4281,"context_line":""},{"line_number":4282,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4283,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4284,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4285,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4286,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4287,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4288,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4289,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4290,"context_line":"                #"},{"line_number":4291,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4292,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4293,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4294,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4295,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4296,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4297,"context_line":"                # for QEMU community devs."},{"line_number":4298,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4299,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4300,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa0c359_6f1c3213","side":"PARENT","line":4297,"range":{"start_line":4282,"start_character":0,"end_line":4297,"end_character":42},"in_reply_to":"3fa0c359_5e456a14","updated":"2018-02-17 13:57:57.000000000","message":"I am no-one\u0027s master, Tetsuro!","commit_id":"23d21a20a26df12c26537d2a57921a4a589dd515"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"223286c646afc3c6e3c02856dec670a57d1850f9","unresolved":false,"context_lines":[{"line_number":4279,"context_line":"                                    emupcpus.extend(pin_cpuset.cpuset)"},{"line_number":4280,"context_line":"                                guest_cpu_tune.vcpupin.append(pin_cpuset)"},{"line_number":4281,"context_line":""},{"line_number":4282,"context_line":"                # TODO(berrange) When the guest has \u003e1 NUMA node, it will"},{"line_number":4283,"context_line":"                # span multiple host NUMA nodes. By pinning emulator threads"},{"line_number":4284,"context_line":"                # to the union of all nodes, we guarantee there will be"},{"line_number":4285,"context_line":"                # cross-node memory access by the emulator threads when"},{"line_number":4286,"context_line":"                # responding to guest I/O operations. The only way to avoid"},{"line_number":4287,"context_line":"                # this would be to pin emulator threads to a single node and"},{"line_number":4288,"context_line":"                # tell the guest OS to only do I/O from one of its virtual"},{"line_number":4289,"context_line":"                # NUMA nodes. This is not even remotely practical."},{"line_number":4290,"context_line":"                #"},{"line_number":4291,"context_line":"                # The long term solution is to make use of a new QEMU feature"},{"line_number":4292,"context_line":"                # called \"I/O Threads\" which will let us configure an explicit"},{"line_number":4293,"context_line":"                # I/O thread for each guest vCPU or guest NUMA node. It is"},{"line_number":4294,"context_line":"                # still TBD how to make use of this feature though, especially"},{"line_number":4295,"context_line":"                # how to associate IO threads with guest devices to eliminate"},{"line_number":4296,"context_line":"                # cross NUMA node traffic. This is an area of investigation"},{"line_number":4297,"context_line":"                # for QEMU community devs."},{"line_number":4298,"context_line":"                emulatorpin \u003d vconfig.LibvirtConfigGuestCPUTuneEmulatorPin()"},{"line_number":4299,"context_line":"                emulatorpin.cpuset \u003d set(emupcpus)"},{"line_number":4300,"context_line":"                guest_cpu_tune.emulatorpin \u003d emulatorpin"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa0c359_5e456a14","side":"PARENT","line":4297,"range":{"start_line":4282,"start_character":0,"end_line":4297,"end_character":42},"in_reply_to":"3fa0c359_6373184f","updated":"2018-02-17 05:32:49.000000000","message":"Yes, master. Done.","commit_id":"23d21a20a26df12c26537d2a57921a4a589dd515"}]}
