Как да се уверя, че 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
@CL. static int __init mlx90399_init(void) {връщане 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