[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 2/8] vpci: Refactor REGISTER_VPCI_INIT
On 2025/6/27 17:00, Chen, Jiqian wrote: > On 2025/6/27 14:05, Jan Beulich wrote: >> On 27.06.2025 04:59, Chen, Jiqian wrote: >>> On 2025/6/26 20:06, Jan Beulich wrote: >>>> On 26.06.2025 10:03, Chen, Jiqian wrote: >>>>> On 2025/6/25 22:07, Jan Beulich wrote: >>>>>> On 25.06.2025 12:16, Chen, Jiqian wrote: >>>>>>> On 2025/6/25 18:03, Jan Beulich wrote: >>>>>>>> Also, as said - you will need to check whether other architectures are >>>>>>>> different from x86-64 in this regard. We better wouldn't leave a trap >>>>>>>> here, >>>>>>>> for them to fall into when they enable vPCI support. I.e. my >>>>>>>> recommendation >>>>>>>> would be that if in doubt, we put the __aligned() there >>>>>>>> unconditionally. >>>> >>>> Note how I used __aligned() here. Why would you ... >>>> >>>>>>> That's difficult for me to check on all different platforms since I >>>>>>> don't have them all. >>>>>> >>>>>> You don't need to have them. You'd need to carefully go through the >>>>>> respective >>>>>> section(s) of their psABI-s. >>>>>> >>>>>>> So you mean I should remove "#ifdef CONFIG_X86"? Just let __aligned(16) >>>>>>> for all platforms? >>>>>> >>>>>> Yes. And, as also said, with a suitable comment please. >>>>> Ah, my comment definitely needs your change suggestion. >>>>> I wrote a draft as below: >>>>> >>>>> /* >>>>> * Size of vpci_capability is lager than 8 bytes. When it is used as the >>>>> entry >>>>> * of __start_vpci_array in section, it is 16-byte aligned by assembler, >>>>> that >>>>> * causes the array length (__end_vpci_array - __start_vpci_array) wrong, >>>>> so >>>>> * force its definition to use 16-byte aligned here. >>>>> */ >>>>> struct vpci_capability { >>>>> unsigned int id; >>>>> bool is_ext; >>>>> int (* init)(const struct pci_dev *pdev); >>>>> int (* cleanup)(const struct pci_dev *pdev); >>>>> } __attribute__((aligned(16))); >>>> >>>> ... open-code that here? >>> That because when using __aligned() without CONFIG_X86, I got compile error >>> vpci.h:18:13: error: expected declaration specifiers or ‘...’ before >>> numeric constant >>> 18 | } __aligned(16); >>> | ^~ >>> I tried some methods, only open-code can fix it. >> >> Well, that's odd. In e.g. xen/sched.h we have >> >> struct domain >> { >> ... >> } __aligned(PAGE_SIZE); >> >> which clearly must be working fine. The error message from the compiler >> doesn't say very much alone. For informational diagnostics the compiler >> normally also emits may help, or else it would take looking at the >> pre-processed output to understand what's going on here. > > I add some codes to print the macro __align, the codes are: > > diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h > index 51573baabc..8f6af1c822 100644 > --- a/xen/include/xen/vpci.h > +++ b/xen/include/xen/vpci.h > @@ -13,12 +13,16 @@ typedef uint32_t vpci_read_t(const struct pci_dev *pdev, > unsigned int reg, > typedef void vpci_write_t(const struct pci_dev *pdev, unsigned int reg, > uint32_t val, void *data); > > +#define STRINGIFY(x) #x > +#define TOSTRING(x) STRINGIFY(x) > +#pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16))) > + > struct vpci_capability { > unsigned int id; > bool is_ext; > int (* init)(const struct pci_dev *pdev); > int (* cleanup)(const struct pci_dev *pdev); > } __aligned(16); > > The result are: > > In file included from ./include/xen/sched.h:25, > from arch/x86/x86_64/asm-offsets.c:11: > ./include/xen/vpci.h:18:9: note: ‘#pragma message: __aligned(16) expands to: > __attribute__((__aligned__(16)))’ > 18 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16))) > | ^~~~~~~ > In file included from ./include/xen/sched.h:25, > from drivers/vpci/vpci.c:20: > ./include/xen/vpci.h:18:9: note: ‘#pragma message: __aligned(16) expands to: > __attribute__((__aligned__(16)))’ > 18 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16))) > | ^~~~~~~ > In file included from emul.h:88, > from vpci.c:18: > vpci.h:15:9: note: ‘#pragma message: __aligned(16) expands to: __aligned(16)’ > 15 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16))) > | ^~~~~~~ > vpci.h:22:13: error: expected declaration specifiers or ‘...’ before numeric > constant > 22 | } __aligned(16); > | ^~ > In file included from emul.h:88, Ah, the root cause is that I need to add compiler.h to tests directory tools/tests/vpci/ Like below, but we will use your patch, so this problem is not important. diff --git a/tools/tests/vpci/Makefile b/tools/tests/vpci/Makefile index 97359ff67f..11de341ab9 100644 --- a/tools/tests/vpci/Makefile +++ b/tools/tests/vpci/Makefile @@ -14,12 +14,12 @@ else $(warning HOSTCC != CC, will not run test) endif -$(TARGET): vpci.c vpci.h list.h main.c emul.h +$(TARGET): vpci.c vpci.h list.h main.c emul.h compiler.h $(CC) $(CFLAGS_xeninclude) -g -o $@ vpci.c main.c .PHONY: clean clean: - rm -rf $(TARGET) *.o *~ vpci.h vpci.c list.h + rm -rf $(TARGET) *.o *~ vpci.h vpci.c list.h compiler.h .PHONY: distclean distclean: clean @@ -38,6 +38,7 @@ vpci.c: $(XEN_ROOT)/xen/drivers/vpci/vpci.c sed -e '/#include/d' -e '1s/^/#include "emul.h"/' <$< >$@ list.h: $(XEN_ROOT)/xen/include/xen/list.h +compiler.h: $(XEN_ROOT)/xen/include/xen/compiler.h vpci.h: $(XEN_ROOT)/xen/include/xen/vpci.h -list.h vpci.h: +list.h compiler.h vpci.h: sed -e '/#include/d' <$< >$@ > from main.c:19: > vpci.h:15:9: note: ‘#pragma message: __aligned(16) expands to: __aligned(16)’ > 15 | #pragma message("__aligned(16) expands to: " TOSTRING(__aligned(16))) > | ^~~~~~~ > vpci.h:22:13: error: expected declaration specifiers or ‘...’ before numeric > constant > 22 | } __aligned(16); > | ^~ > make[6]: *** [Makefile:18: test_vpci] Error 1 > make[5]: *** > [/home/cjq/code/upstream/xen/tools/tests/../../tools/Rules.mk:194: > subdir-install-vpci] Error 2 > make[4]: *** > [/home/cjq/code/upstream/xen/tools/tests/../../tools/Rules.mk:189: > subdirs-install] Error 2 > make[3]: *** [/home/cjq/code/upstream/xen/tools/../tools/Rules.mk:194: > subdir-install-tests] Error 2 > make[2]: *** [/home/cjq/code/upstream/xen/tools/../tools/Rules.mk:189: > subdirs-install] Error 2 > make[1]: *** [Makefile:64: install] Error 2 > make: *** [Makefile:147: install-tools] Error 2 > make: *** Waiting for unfinished jobs.... > >> >>>> As to the comment: First, it wants to be as close to what is being >>>> commented as >>>> possible. Hence >>>> >>>> struct __aligned(16) vpci_capability { >>> This also got the compile error. >>>> >>>> is likely the better placement. Second, there's nothing here the assembler >>>> does >>>> on its own. It's the compiler which does something (insert alignment >>>> directives), >>>> and only to follow certain rules. (See "x86: don't have gcc over-align >>>> data" >>>> that I Cc-ed you on for some of the relevant aspects.) That is, you don't >>>> want >>>> to "blame" any part of the tool chain, at least not where it's the >>>> underlying >>>> ABI that mandates certain behavior. There's also no strong need to talk >>>> about >>>> the specific effects that it would have if we didn't arrange things >>>> properly. >>>> That is, talking about the effect on arrays in general is fine and helpful. >>>> Talking about __{start,end}_vpci_array imo is not. >>>> >>>> While further playing with the compiler, I noticed that adding >>>> __aligned(16) >>>> actually has a negative effect as long as that other patch isn't in use: >>>> The >>>> struct instances then are being aligned to even 32-byte boundaries (which >>>> means >>>> __start_vpci_array would then also need aligning as much). When that other >>>> patch is in use, the __aligned() becomes unnecessary. Therefore I'm no >>>> longer >>>> convinced using __aligned() is the best solution here. >>> Em, changing __start_vpci_array to be struct vpci_capability array cause >>> those concerns, maybe keeping using struct pointer is a compromise method. >> >> It would be a last resort, yes, but imo (a) we ought to strive to avoid >> unnecessary indirection and (b) the same underlying issue could become a >> problem elsewhere as well. >> >> Jan > -- Best regards, Jiqian Chen.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |