> Subject: [EXTERNAL] Re: [Patch v3 6/6] bus/vmbus: set event for channel 
> without
> monitoring support
> 
> On Fri,  4 Apr 2025 17:35:38 -0700
> lon...@linuxonhyperv.com wrote:
> 
> > diff --git a/drivers/bus/vmbus/vmbus_channel.c
> > b/drivers/bus/vmbus/vmbus_channel.c
> > index bccef168d3..81e8096190 100644
> > --- a/drivers/bus/vmbus/vmbus_channel.c
> > +++ b/drivers/bus/vmbus/vmbus_channel.c
> > @@ -24,6 +24,19 @@ vmbus_sync_set_bit(volatile RTE_ATOMIC(uint32_t)
> *addr, uint32_t mask)
> >     rte_atomic_fetch_or_explicit(addr, mask, rte_memory_order_seq_cst);
> > }
> >
> > +static inline void
> > +vmbus_send_interrupt(const struct rte_vmbus_device *dev, uint32_t
> > +relid) {
> > +   RTE_ATOMIC(uint32_t) *int_addr;
> > +   uint32_t int_mask;
> > +
> > +   int_addr = (RTE_ATOMIC(uint32_t)*) (dev->int_page + relid / 32);
> > +   int_mask = 1u << (relid % 32);
> > +   vmbus_sync_set_bit(int_addr, int_mask);
> > +
> > +   vmbus_uio_irq_control(dev, 1);
> > +}
> > +
> 
> This part doesn't look right. RTE_ATOMIC() is just a macro to add the _Atomic
> attribute.
> 
> Can it be simplified like this?
> 
> 
> static inline void
> vmbus_sync_set_bit(RTE_ATOMIC(uint32_t *) addr, uint32_t mask) {
>       rte_atomic_fetch_or_explicit(addr, mask, rte_memory_order_seq_cst); }
> 
> static inline void
> vmbus_send_interrupt(const struct rte_vmbus_device *dev, uint32_t relid) {
>       RTE_ATOMIC(uint32_t *) int_addr;
>       uint32_t int_mask;
> 
>       int_addr = dev->int_page + relid / 32;
>       int_mask = 1u << (relid % 32);
>       vmbus_sync_set_bit(int_addr, int_mask);
> 
>       vmbus_uio_irq_control(dev, 1);
> }

Hi Stephen,

I need to go back to this version of the patch, as v5 doesn't compile 
successfully under clang with the following error:

[459/3553] Compiling C object drivers/libtmp_rte_bus_vmbus.a.p/bus_vmbus
ccache gcc -Idrivers/libtmp_rte_bus_vmbus.a.p -Idrivers -I../drivers 
-Idrivers/bus/vmbus -I../drivers/bus/vmbus -I../drivers/bus/vmbus/linux 
-Ilib/eal/common -I../lib/eal/common -I. -I.. -Iconfig -I../config 
-Ilib/eal/include -I../lib/eal/include -Ilib/eal/linux/include 
-I../lib/eal/linux/include -Ilib/eal/x86/include -I../lib/eal/x86/include 
-I../kernel/linux -Ilib/eal -I../lib/eal -Ilib/kvargs -I../lib/kvargs -Ilib/log 
-I../lib/log -Ilib/metrics -I../lib/metrics -Ilib/telemetry -I../lib/telemetry 
-fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch 
-Wextra -Werror -std=c11 -O2 -g -include rte_config.h -Wvla -Wcast-qual 
-Wdeprecated -Wformat -Wformat-nonliteral -Wformat-security 
-Wmissing-declarations -Wmissing-prototypes -Wnested-externs 
-Wold-style-definition -Wpointer-arith -Wsign-compare -Wstrict-prototypes 
-Wundef -Wwrite-strings -Wno-packed-not-aligned -Wno-missing-field-initializers 
-D_GNU_SOURCE -fPIC -march=corei7 -mrtm -DALLOW_EXPERIMENTAL_API 
-DALLOW_INTERNAL_API -Wno-format-truncation -Wno-address-of-packed-member 
-DRTE_LOG_DEFAULT_LOGTYPE=bus.vmbus -MD -MQ 
drivers/libtmp_rte_bus_vmbus.a.p/bus_vmbus_vmbus_channel.c.o -MF 
drivers/libtmp_rte_bus_vmbus.a.p/bus_vmbus_vmbus_channel.c.o.d -o 
drivers/libtmp_rte_bus_vmbus.a.p/bus_vmbus_vmbus_channel.c.o -c 
../drivers/bus/vmbus/vmbus_channel.c
../drivers/bus/vmbus/vmbus_channel.c: In function 'vmbus_set_monitor':
../drivers/bus/vmbus/vmbus_channel.c:51:22: error: assignment to 'uint32_t *' 
{aka 'unsigned int *'} from incompatible pointer type '_Atomic uint32_t *' {aka 
'_Atomic unsigned int *'} [-Werror=incompatible-pointer-types]
   51 |         monitor_addr = 
&channel->monitor_page->trigs[trigger_index].pending;
      |                      ^
cc1: all warnings being treated as errors

I think it's okay to define those pointers as "RTE_ATOMIC(uint32_t) *". The 
pointers themselves are not atomic, but data in the addresses they point to are 
atomic.

Do you think it is okay to proceed with this patch?

Thanks,
Long

Reply via email to