Как убедиться, что insmod не работает из-за ошибки?

Я разработал периферийный драйвер для Linux. Функция .probe выполняет обычные проверки ошибок, таких как сбои выделения памяти, а также пытается связаться с оборудованием и при любом типе ошибки освобождает любую память и возвращает код ошибки, такой как -ENOMEM или -EIO.

Проблема в том, что хотя функция проверки модуля возвращает -EIO, когда оборудование недоступно, я все еще вижу, что модуль указан в выводе lsmod. Можно ли убедиться, что insmod полностью выходит из строя при возникновении проблемы во время инициализации?

Вот моя текущая функция зонда. Все специфичные для устройства функции при сбое возвращают соответствующий код ошибки, обычно -EIO.

static int mlx90399_probe(struct i2c_client *client,
        const struct i2c_device_id *id)
{
    int err;
    struct mlx90399_data *data;

    data = kzalloc(sizeof(*data), GFP_KERNEL);
    if (!data) {
        dev_err(&client->dev, "Memory allocation fails\n");
        err = -ENOMEM;
        goto exit;
    }
    i2c_set_clientdata(client, data);
    data->client = client;
    mutex_init(&data->lock);
    data->mode = MLX90399_MODE_OFF;

    err = mlx90399_reset(client);
    if (err < 0)
        goto exit;

    msleep(1); /* nominal 0.6ms from reset */
    err = mlx90399_write_register_defaults(client);
    if (err < 0)
        goto exit;

    err = mlx90399_update_scale(client);
    if (err < 0)
        goto exit;

    data->indio_dev = iio_allocate_device(0);
    if (data->indio_dev == NULL) {
        err = -ENOMEM;
        goto exit;
    }

    data->indio_dev->dev.parent = &client->dev;
    data->indio_dev->info = &mlx90399_info;
    data->indio_dev->dev_data = (void *)(data);
    data->indio_dev->modes = INDIO_DIRECT_MODE;

    mlx90399_setup_irq(client);

    err = iio_device_register(data->indio_dev);
    if(err < 0)
        goto exit;

    return 0;

exit:
    kfree(data);
    return err;
}

person Atilla Filiz    schedule 27.02.2014    source источник
comment
Показать функцию инициализации модуля.   -  person CL.    schedule 27.02.2014
comment
@КЛ. статический интервал __init mlx90399_init (void) { return i2c_add_driver (& mlx90399_driver); }   -  person Atilla Filiz    schedule 27.02.2014


Ответы (2)


Смотрите комментарий в __driver_attach():

/*
 * Lock device and try to bind to it. We drop the error
 * here and always return 0, because we need to keep trying
 * to bind to devices and some drivers will return an error
 * simply if it didn't support the device.
 *
 * driver_probe_device() will spit a warning if there
 * is an error.
 */

Чтобы инициализация модуля не удалась, отмените регистрацию драйвера и верните код ошибки из функции инициализации.

person CL.    schedule 27.02.2014

Обратите внимание, что между модулем и устройством не обязательно соотношение 1:1. Один модуль может использоваться для нескольких устройств. Например, при использовании деревьев устройств дерево устройств может объявить несколько встроенных UART, и все они используют один модуль ядра последовательного устройства. Функция probe модуля будет вызываться несколько раз, по одному разу для каждого устройства. Тот факт, что один вызов probe завершился неудачей, не обязательно означает, что модуль следует выгружать.

person Craig McQueen    schedule 07.07.2016