> On 22 Feb 2025, at 5:52 PM, Aditya Garg <gargadity...@live.com> wrote:
> 
> 
> 
>> On 22 Feb 2025, at 2:37 PM, Aditya Garg <gargadity...@live.com> wrote:
>> 
>>> 
>>> What padding, please? Why TCP UAPI headers do not have these attributes?
>>> Think about it, and think about what actually __packed does and how it 
>>> affects
>>> (badly) the code generation. Otherwise it looks like a cargo cult.
>>> 
>>>> I tried removing __packed btw and driver no longer works.
>>> 
>>> So, you need to find a justification why. But definitely not due to padding 
>>> in
>>> many of them. They can go without __packed as they are naturally aligned.
>> 
>> Alright, I did some debugging, basically printk sizeof(struct). Did it for 
>> both packed and unpacked with the following results:
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_msg_request_header 
>> is 16
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_msg_request_header_unpacked is 16
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_msg_response_header is 20
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_msg_response_header_unpacked is 20
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_msg_simple_request 
>> is 32
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_msg_simple_request_unpacked is 32
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_msg_information is 
>> 65
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_msg_information_unpacked is 68
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_frame is 12
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_frame_unpacked is 
>> 12
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_fb_request_footer 
>> is 80
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_fb_request_footer_unpacked is 80
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct appletbdrm_fb_request is 48
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_fb_request_unpacked is 48
>> 
>> Feb 22 13:02:03 MacBook kernel: size of struct 
>> appletbdrm_fb_request_response is 40
>> Feb 22 13:02:04 MacBook kernel: size of struct 
>> appletbdrm_fb_request_response_unpacked is 40
>> 
>> So, the difference in sizeof in unpacked and packed is only in 
>> appletbdrm_msg_information. So, I kept this packed, and removed it from 
>> others. The Touch Bar still works.
>> 
>> So maybe keep just this packed?
> 
> And for justification why driver was not working, with 
> appletbdrm_msg_information not packed is because sizeof(struct 
> appletbdrm_msg_information) is being used in kzalloc in the driver. Similar 
> is the case for most other __packed structs.

I tried to debug a bit more and its not really the kzalloc logic, rather its 
the USB bit that’s causing the issue:

Code:

static int appletbdrm_read_response(struct appletbdrm_device *adev,
                                    struct appletbdrm_msg_response_header 
*response,
                                    size_t size, __le32 expected_response)
{
        struct usb_device *udev = adev_to_udev(adev);
        struct drm_device *drm = &adev->drm;
        int ret, actual_size;
        bool readiness_signal_received = false;

retry:
        ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, adev->in_ep),
                           response, size, &actual_size, 
APPLETBDRM_BULK_MSG_TIMEOUT);
        if (ret) {
                drm_err(drm, "Failed to read response (%d)\n", ret);
                return ret;
        }

        /*
         * The device responds to the first request sent in a particular
         * timeframe after the USB device configuration is set with a readiness
         * signal, in which case the response should be read again
         */
        if (response->msg == APPLETBDRM_MSG_SIGNAL_READINESS) {
                if (!readiness_signal_received) {
                        readiness_signal_received = true;
                        goto retry;
                }

                drm_err(drm, "Encountered unexpected readiness signal\n");
                return -EIO;
        }

        if (actual_size != size) {
                drm_err(drm, "Actual size (%d) doesn't match expected size 
(%lu)\n",
                        actual_size, size);
                return -EIO;
        }

        if (response->msg != expected_response) {
                drm_err(drm, "Unexpected response from device (expected %p4ch 
found %p4ch)\n",
                        &expected_response, &response->msg);
                return -EIO;
        }

        return 0;
}

Error:

Feb 23 20:00:29 MacBook kernel: appletbdrm 7-6:2.1: [drm] *ERROR* Actual size 
(65) doesn't match expected size (68)

So IMO, we still need this struct to remain packed.

> 
> Maybe the author wanted to keep this value consistent across various compiler 
> options? I don’t think CPU architecture really matters here though since this 
> driver is exclusively for x86_64 Intel Macs.


Reply via email to