Re: [PATCH 7/8] hw/9pfs: annotate V9fsTransport callbacks as coroutine_fn

Philippe Mathieu-Daudé <[email protected]>
Newsgroups org.xenproject.lists.xen-devel,org.nongnu.qemu-devel
Message-ID <[email protected]>
On 21/7/26 10:06, Marc-André Lureau wrote:
> Hi
> 
> On Tue, Jul 21, 2026 at 11:58 AM Marc-André Lureau
> <[email protected]> wrote:
>>
>> Hi
>>
>> On Tue, Jul 21, 2026 at 12:54 AM Philippe Mathieu-Daudé
>> <[email protected]> wrote:
>>>
>>> On 20/7/26 22:42, Philippe Mathieu-Daudé wrote:
>>>> On 20/7/26 16:02, Christian Schoenebeck wrote:
>>>>> On Monday, 20 July 2026 09:55:36 CEST Marc-André Lureau wrote:
>>>>>> All V9fsTransport callbacks are invoked exclusively from coroutine
>>>>>> context (the v9fs_* PDU handlers). Annotate the function pointer
>>>>>> types in V9fsTransport and all implementations (virtio and xen
>>>>>> backends), as well as intermediate callers in 9p.c (pdu_marshal,
>>>>>> pdu_unmarshal, v9fs_init_qiov_from_pdu, etc.).
>>>>>>
>>>>>> Signed-off-by: Marc-André Lureau <[email protected]>
>>>>>> ---
>>>>>>    hw/9pfs/9p.h               | 26 +++++++++++++++-----------
>>>>>>    hw/9pfs/9p.c               | 31 +++++++++++++++++++------------
>>>>>>    hw/9pfs/virtio-9p-device.c | 24 +++++++++++++-----------
>>>>>>    hw/9pfs/xen-9p-backend.c   | 34 +++++++++++++++++-----------------
>>>>>>    4 files changed, 64 insertions(+), 51 deletions(-)
>>>>>>
>>>>>> diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h
>>>>>> index 1a309664f6e..0e52ffbdf38 100644
>>>>>> --- a/hw/9pfs/9p.h
>>>>>> +++ b/hw/9pfs/9p.h
>>>>>> @@ -472,17 +472,21 @@ void pdu_submit(V9fsPDU *pdu, P9MsgHeader *hdr);
>>>>>>    void v9fs_reset(V9fsState *s);
>>>>>>
>>>>>>
>>>>>>    struct V9fsTransport {
>>>>>> -    ssize_t     (*pdu_vmarshal)(V9fsPDU *pdu, size_t offset, const
>>>>>> char *fmt,
>>>>>> -                                va_list ap);
>>>>>> -    ssize_t     (*pdu_vunmarshal)(V9fsPDU *pdu, size_t offset, const
>>>>>> char *fmt,
>>>>>> -                                  va_list ap);
>>>>>> -    void        (*init_in_iov_from_pdu)(V9fsPDU *pdu, struct iovec
>>>>>> **piov,
>>>>>> -                                        unsigned int *pniov, size_t
>>>>>> size);
>>>>>> -    void        (*init_out_iov_from_pdu)(V9fsPDU *pdu, struct iovec
>>>>>> **piov,
>>>>>> -                                         unsigned int *pniov, size_t
>>>>>> size);
>>>>>> -    void        (*push_and_notify)(V9fsPDU *pdu);
>>>>>> -    size_t      (*msize_limit)(V9fsState *s);
>>>>>> -    size_t      (*response_buffer_size)(V9fsPDU *pdu);
>>>>>> +    ssize_t     coroutine_fn (*pdu_vmarshal)(V9fsPDU *pdu, size_t
>>>>>> offset,
>>>>>> +                                             const char *fmt,
>>>>>> va_list ap);
>>>>>> +    ssize_t     coroutine_fn (*pdu_vunmarshal)(V9fsPDU *pdu, size_t
>>>>>> offset,
>>>>>> +                                               const char *fmt,
>>>>>> va_list ap);
>>>>>> +    void        coroutine_fn (*init_in_iov_from_pdu)(V9fsPDU *pdu,
>>>>>> +                                                     struct iovec
>>>>>> **piov,
>>>>>> +                                                     unsigned int
>>>>>> *pniov,
>>>>>> +                                                     size_t size);
>>>>>> +    void        coroutine_fn (*init_out_iov_from_pdu)(V9fsPDU *pdu,
>>>>>> +                                                      struct iovec
>>>>>> **piov,
>>>>>> +                                                      unsigned int
>>>>>> *pniov,
>>>>>> +                                                      size_t size);
>>>>>> +    void        coroutine_fn (*push_and_notify)(V9fsPDU *pdu);
>>>>>> +    size_t      coroutine_fn (*msize_limit)(V9fsState *s);
>>>>>> +    size_t      coroutine_fn (*response_buffer_size)(V9fsPDU *pdu);
>>>>>>    };
>>>>>
>>>>> I wonder whether that could be made more diff/blame-friendly.
>>>>> Especially as
>>>>> this currently only serves documentation purposes.
>>>>>
>>>>> They way you are positioning coroutine_fn it usually resolves to an
>>>>> attribute
>>>>> attached to the function's return type, not to the function itself, even
>>>>> though clang/gcc handling it flexible. For attaching an attribute to the
>>>>> function itself the attribute should either be attached before the
>>>>> function
>>>>> declaration or after the function declaration.
>>>>
>>>> I tend to aggree it would be clearer to have these attributes /before/
>>>> the function prototype declaration.
>>>
>>> $ git grep -E '^(static )?coroutine_(mixed_)?fn' | wc -l
>>>         90
>>
>> More like
>> $  git grep -rnE '\b(coroutine_fn|co_wrapper[a-z_]*)\b' | wc -l
>> 1343
>>
> 
> That matching is not accurate, it's actually hard enough to match all
> annotations instances.. but this should be a rough estimation.
> 
>> most of them are "return-type co_annotation fn(..)"
>> we even have scripts/block-coroutine-wrapper.py that relies and
>> produce this order..
>> a bit late to change the style imho...
>>
>> At least, let's not make this a requirement for this series, please

Not a requirement on my side, but if we had to pick a style,
I'd vote for "attribute before return type".

>>
>>>> block/block-copy.c:47:static coroutine_fn int
>>> block_copy_task_entry(AioTask *task);
>>> block/copy-before-write.c:106:static coroutine_fn int
>>> cbw_do_copy_before_write(BlockDriverState *bs,
>>> block/nvme.c:1351:static coroutine_fn int nvme_co_flush(BlockDriverState
>>> *bs)
>>> block/ssh.c:1223:static coroutine_fn int ssh_flush(BDRVSSHState *s,
>>> BlockDriverState *bs)
>>> nbd/server.c:3077:static coroutine_fn void nbd_trip(void *opaque)
>>> block/block-copy.c:581:static coroutine_fn int
>>> block_copy_task_entry(AioTask *task)
>>> ...
>>>
>>>>
>>>>> In both cases you could then
>>>>> add it to its own, separate line, avoiding a lot of noise.
>>>>>
>>>>> /Christian
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.