Like it overall but see my suggestion below.
On Sunday, March 15, 2020 at 7:43:49 AM UTC-4, Fotis Xenakis wrote:
>
> Signed-off-by: Fotis Xenakis <[email protected] <javascript:>> 
> --- 
>  drivers/pci-function.cc | 39 +++++++++++++++++++++++++++++++++------ 
>  drivers/pci-function.hh |  1 + 
>  2 files changed, 34 insertions(+), 6 deletions(-) 
>
> diff --git a/drivers/pci-function.cc b/drivers/pci-function.cc 
> index 369f22e9..2cc8b837 100644 
> --- a/drivers/pci-function.cc 
> +++ b/drivers/pci-function.cc 
> @@ -807,36 +807,63 @@ namespace pci { 
>          write_pci_config(_bus, _device, _func, offset, val); 
>      } 
>   
> +    // Returns the offset of the first capability with id matching 
> @cap_id, or 
> +    // 0xFF if none found. 
>      u8 function::find_capability(u8 cap_id) 
>      { 
> -        return this->find_capability(cap_id, [](function *fun, u8 off) { 
> return true; } ); 
> +        return find_capability(cap_id, [](function *fun, u8 off) { return 
> true; } ); 
>      } 
>   
> +    // Returns the offset of the first capability with id matching 
> @cap_id and 
> +    // satisfying @predicate (if specified). If none found, returns 0xFF. 
>      u8 function::find_capability(u8 cap_id, std::function<bool 
> (function*, u8)> predicate) 
> +    { 
> +        u8 bad_offset = 0xFF; 
> +        std::vector<u8> cap_offs; 
> + 
> +        if (!find_capabilities(cap_offs, cap_id)) { 
> +            return bad_offset; 
> +        } 
> + 
> +        if (!predicate) { 
> +            predicate = [](function *fun, u8 off) { return true; }; 
> +        } 
> +        for (auto off: cap_offs) { 
> +            if (predicate(this, off)) { 
> +                return off; 
> +            } 
> +        } 
> +        return bad_offset; 
> +    }

Let us keep the original implementation of "u8 function::find_capability(u8 
cap_id, std::function<bool (function*, u8)> predicate)" as it is now. I 
think the current implementation of it is easier to understand and I do not 
see much benefit of it delegating to the new find_capabilities() function 
below.
I like your comments so please keep them of course. 

>
> + 
> +    // Append to @cap_offs the offsets of all capabilities with id 
> matching 
> +    // @cap_id. Returns whether any such capabilities were found. 
> +    bool function::find_capabilities(std::vector<u8>& cap_offs, u8 
> cap_id) 
>      { 
>          u8 capabilities_base = pci_readb(PCI_CAPABILITIES_PTR); 
>          u8 off = capabilities_base; 
> -        u8 bad_offset = 0xFF; 
>          u8 max_capabilities = 0xF0; 
>          u8 ctr = 0; 
> +        bool found = false; 
>   
>          while (off != 0) { 
>              // Read capability 
>              u8 capability = pci_readb(off + PCI_CAP_OFF_ID); 
> -            if (capability == cap_id && predicate(this, off)) { 
> -                return off; 
> +            if (capability == cap_id) { 
> +                cap_offs.push_back(off); 
> +                found = true; 
>              } 
>   
>              ctr++; 
>              if (ctr > max_capabilities) { 
> -                return bad_offset; 
> +                return found; 
>              } 
>   
>              // Next 
>              off = pci_readb(off + PCI_CAP_OFF_NEXT); 
>          } 
>   
> -        return bad_offset; 
> +        return found; 
>      } 
>   
>      bar * function::get_bar(int idx) 
> diff --git a/drivers/pci-function.hh b/drivers/pci-function.hh 
> index 59d57a1e..a8904cb0 100644 
> --- a/drivers/pci-function.hh 
> +++ b/drivers/pci-function.hh 
> @@ -342,6 +342,7 @@ namespace pci { 
>          // Capability parsing 
>          u8 find_capability(u8 cap_id); 
>          u8 find_capability(u8 cap_id, std::function<bool (function*, u8)> 
> predicate); 
> +        bool find_capabilities(std::vector<u8>& caps, u8 cap_id); 
>   
>          bar * get_bar(int idx); 
>          void add_bar(int idx, bar* bar); 
> -- 
> 2.25.1 
>
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/be7abe3b-c4f5-42b4-99bf-5f3fd7ce7f40%40googlegroups.com.

Reply via email to