Just a small correction - Not if (req_end >= field_start && field_end >= req_start) But if (req_end *>* field_start && field_end *>* req_start)
On Mon, Jun 20, 2016 at 12:23 PM, Andrey Grodzovsky <andrey2...@gmail.com> wrote: > > > On Mon, Jun 20, 2016 at 11:38 AM, Jan Beulich <jbeul...@suse.com> wrote: > >> >>> On 20.06.16 at 17:15, <andrey2...@gmail.com> wrote: >> > On Mon, Jun 20, 2016 at 4:56 AM, Jan Beulich <jbeul...@suse.com> wrote: >> > >> >> >>> On 20.06.16 at 00:03, <andrey2...@gmail.com> wrote: >> >> > Follow up on >> >> http://www.gossamer-threads.com/lists/xen/devel/436000#436000 >> >> > Using >> >> http://eli.thegreenplace.net/2008/08/15/intersection-of-1d-segments as >> >> > reference. >> >> > >> >> > New value >> >> > |---------------| >> >> > >> >> > f1 f5 >> >> > |---| |-----| >> >> > f2 f4 >> >> > |-----| f3 |-----| >> >> > |-----| >> >> > >> >> > Given a new value of the type above, Current logic will not >> >> > allow applying parts of the new value overlapping with f3 filter. >> >> > only f2 and f4. >> >> >> >> I remains unclear what f1...f5 are meant to represent here. >> >> >> > >> > f1-f5 would be config_field[] such as header_common in >> conf_space_header.c >> > or any other config_field added (by adding quirks for example). >> > >> >> >> >> > This change allows all 3 types of overlapes to be included. >> >> > More specifically for passthrough an Industrial Ethernet Interface >> >> > (Hilscher GmbH CIFX 50E-DP(M/S)) on a HVM DomU running the >> >> > Xen 4.6 Hypervisor it allows to restore the LATENCY TIMER field >> >> > given a quirk to allow read/write for that field is already in place. >> >> > Device driver logic is such that the entire confspace is >> >> > written in 4 byte chunks s.t. LATENCY_TIMER AND CACHE_LINE_SIZE are >> >> > arriving together in one call to xen_pcibk_config_write. >> >> >> >> Tweaks to make individual devices work are dubious. Any >> >> explanation should outline why current behavior is _generally_ >> >> wrong. In particular with the original issue being with the >> >> Latency Timer field, and with that field now being allowed to >> >> be written by its entry in header_common[], ... >> > >> > >> > To me current behaviour looks generally inconsistent because given a >> > request to wrote >> > 4 bytes starting with 0xC let's look what's happening >> > inside xen_pcibk_config_write >> > >> > *[81664.632262 < 0.000035>] xen-pciback: 0000:06:00.0: write request >> 4 >> > bytes at 0xc = 4000* >> > *[81664.632264 < 0.000002>] xen-pciback: 0000:06:00.0: read 1 bytes >> at >> > 0xc* >> > *[81664.632275 < 0.000011>] xen-pciback: 0000:06:00.0: read 1 bytes >> at >> > 0xc = 0 * >> > *[81664.632282 < 0.000002>] xen-pciback: 0000:06:00.0: read 1 bytes >> at >> > 0xf* >> > *[81664.632292 < 0.000010>] xen-pciback: 0000:06:00.0: read 1 bytes >> at >> > 0xf = 0* >> > >> > So you can see that current logic will allow to read/write 0xc which >> > is PCI_CACHE_LINE_SIZE, >> > skips PCI_LATENCY_TIMER also there is a quirk in place there which >> allows >> > writes to this memory, >> > skips 0xE (which is fine since this field is not allowed to be accessed) >> > and then writes 0xf PCI_BIST >> > >> > So using my previous sketch adjusted for this use case >> > >> > |----4b write request starting at 0xc----| >> > >> > |--f1--| |--f2--| |--f3--| >> > >> > Where >> > f1 == PCI_CACHE_LINE_SIZE >> > f2 == PCI_LATENCY_TIMER >> > f3 == PCI_BIST >> > >> > With ciurrent logic Only f1 and f3 are allowed but not f2 even when >> there >> > is a field and >> > a quirk in place allowing read write access to that memory location. >> >> Let's leave quirks out of the picture for now. And without quirk, >> f2 is not writable (and cannot be made by adding a quirk, as >> explained before). >> >> Yes, i guess due to not allowing duplicates. > > >> > To me it seems as a generally inconsistent behaviour and not >> specifically >> > related to our driver. >> > >> > With my patch (and a fix from || to && Thanks a lot for pointing this >> out >> > to me.) >> > f1, f2 and f3 are being treated the same which IMHO is more correct. >> >> Hmm, with that and the >= -> > adjustment, I can't really see >> how your variant is different from the original (other than being >> more compact). What am I overlooking here? >> >> >> > --- a/drivers/xen/xen-pciback/conf_space.c >> >> > +++ b/drivers/xen/xen-pciback/conf_space.c >> >> > @@ -230,8 +230,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, >> int >> >> > offset, int size, u32 value) >> >> > field_start = OFFSET(cfg_entry); >> >> > field_end = OFFSET(cfg_entry) + field->size; >> >> > >> >> > - if ((req_start >= field_start && req_start < field_end) >> >> > - || (req_end > field_start && req_end <= >> field_end)) { >> >> > + if (req_end >= field_start || field_end >= req_start) >> { >> >> > tmp_val = 0; >> >> >> >> ... any change to the logic here which results in writes to the field >> >> getting issued would seem wrong without even looking at the >> >> particular nature of the field. >> > >> > I am not sure I understand - please clarify. >> >> See above - to me the original expression looks (a) correct and >> (b) identical in effect to the corrected version of yours. Hence >> if behavior changes, something must be wrong in either old or new >> code, and due to (a) I would imply it's in the new one. But as said >> above - I guess I'm missing something here. >> > > Here is printouts with applying the new logic > > [ 382.222213] xen-pciback: 0000:06:00.0: write request 4 bytes at 0xc = > 4000 > [ 382.222214] xen-pciback: 0000:06:00.0: read 1 bytes at 0xc > [ 382.222228] xen-pciback: 0000:06:00.0: read 1 bytes at 0xc = 0 > [ 382.222238] xen-pciback: 0000:06:00.0: read 1 bytes at 0xd > [ 382.222281] xen-pciback: 0000:06:00.0: read 1 bytes at 0xd = 0 > [ 382.222313] xen-pciback: 0000:06:00.0: read 1 bytes at 0xf > [ 382.222341] xen-pciback: 0000:06:00.0: read 1 bytes at 0xf = 0 > > So from prints the logic is not equivalent. 0xd is included in this case. > > In original logic field 0xd is excluded because > Not if ((req_start >= field_start && req_start < field_end) > Nor (req_end > field_start && req_end <= field_end)) evaluate to true. > Where request would be 4b segment starting with 0xc > While f (req_end >= field_start && field_end >= req_start) will evaluate > for true in this case. > > Unless I am missing something... > >> >> Jan >> > > Andrey >
_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel