Re: [PATCH v1 06/10] device property: switch to use UUID API
From: huang ying <hidden>
Date: 2016-04-08 23:46:11
Also in:
dri-devel, linux-acpi, linux-efi, lkml, nvdimm
On Fri, Apr 8, 2016 at 6:00 PM, Andy Shevchenko [off-list ref] wrote:
On Fri, 2016-04-08 at 09:27 +0800, Huang, Ying wrote:quoted
Andy Shevchenko [off-list ref] writes:quoted
On Fri, 2016-02-26 at 16:11 +0200, Andy Shevchenko wrote:quoted
On Thu, 2016-02-18 at 01:03 +0100, Rafael J. Wysocki wrote:quoted
On Wednesday, February 17, 2016 02:17:24 PM Andy Shevchenko wrote:quoted
Switch to use a generic UUID API instead of custom approach. It allows to define UUIDs, compare them, and validate.[]Summon initial author of the UUID library. Summary: the API of comparison functions is rather strange. What the point to not take pointers directly? (Moreover I hope compiler too clever not to make a copy of constant arguments there) I could only imagine the case you are trying to avoid temporary variables for constants like NULL_UUID. Issue with this is the ugliness in the users of that, in particularly present in ACPI (drivers/acpi/apei/ghes.c). I would like to have more clear interface for that. Perhaps we may add something like cmp_p(pointer, non-pointer); cmp_pp(pointer, pointer); to not break existing API for now. It would be useful for many cases in the kernel.You can take a look at the drivers/acpi/apei/erst.c for uuid_le_cmp usage. #define CPER_CREATOR_PSTORE \ UUID_LE(0x75a574e3, 0x5052, 0x4b29, 0x8a, 0x8e, 0xbe, 0x2c, \ 0x64, 0x90, 0xb8, 0x9d) if (uuid_le_cmp(rcd->hdr.creator_id, CPER_CREATOR_PSTORE) != 0) goto skip; Looks better?I don't quite understand the issues with if (uuid_le_cmp(&rcd->hdr.creator_id, &CPER_CREATOR_PSTORE) != 0)
I tried to make uuid_le looks like a primitive data type and UUID constant looks like primitive type constants if possible. If we can define data as uuid_le/be, then it will look just like that. But if there are too many places we cannot use uuid_le/be directly, I am OK to convert the interface to use pointer instead.
or, like I mentioned previously, we may introduce _cmp_p() and use like if (uuid_le_cmp_p(&rcd->hdr.creator_id, CPER_CREATOR_PSTORE) != 0)
Personally, I don't like this interface. It is better for two parameters to have same data type.
if it looks better (again, I don't know if compiler is going to copy the last argument).quoted
This is the typical use case in mind when I write the uuid.h. As for uuid_le_cmp usage in drivers/acpi/apei/ghes.c, if (!uuid_le_cmp(*(uuid_le *)gdata->section_type, CPER_SEC_PLATFORM_MEM)) {Ditto if (!uuid_le_cmp_p((uuid_le *)gdata->section_type, CPER_SEC_PLATFORM_MEM)) {quoted
The code looks not good mainly because acpi_hest_generic_data is not defined with uuid_le in mind. struct acpi_hest_generic_data { u8 section_type[16]; u32 error_severity; u16 revision; u8 validation_bits; u8 flags; u32 error_data_length; u8 fru_id[16]; u8 fru_text[20]; }; If section_type was defined as uuid_le instead of u8[16], the uuid_le_cmp usage would look better. So I suggest to use uuid_le/be in data structure definition in new code if possible.This is understandable for such structures, but we might get a UUID from a buffer which is pointer to u8. It's not possible to convert to uuid_* since it's too generic stuff and might require to introduce ACPI_TYPE_UUID with standardization and all necessary work. Apparently not the shortest way.
If this is just a special case that happens seldom, we can just work around it with *(uuid_le/be *)buf. If it is common, we can change the interface or add a new interface. Best Regards, Huang, YIng
quoted
quoted
quoted
quoted
quoted
+static const uuid_le ads_uuid = + UUID_LE(0xdbb8e3e6, 0x5886, 0x4ba6, + 0x87, 0x95, 0x13, 0x19, 0xf5, 0x2a, 0x96, 0x6b); static bool acpi_enumerate_nondev_subnodes(acpi_handle scope, const union acpi_object *desc,@@ -138,7 +136,7 @@ static boolacpi_enumerate_nondev_subnodes(acpi_handle scope, || links->type != ACPI_TYPE_PACKAGE) break; - if (memcmp(uuid->buffer.pointer, ads_uuid, sizeof(ads_uuid))) + if (uuid_le_cmp(*(uuid_le *)uuid-quoted
buffer.pointer,ads_uuid))Maybe it's too late, but I don't quite understand the pointer manipulations here. I can see why you need a type conversion (although it looks ugly), but why do you need to dereference it too?The function takes that kind of type on input. The other variants are not compiled. Perhaps we better change uuid_{lb}e_cmp() first to take normal pointers, though I think the initial idea was to get type checking at compile time.-- Andy Shevchenko [off-list ref] Intel Finland Oy