LINUX.ORG.RU

падает книжный пример

 ,


0

1

помогите завести пример, взятый из книжки Олега Цилюрика. Падает на pci_map_single и dma_pool_create, что с моей точки зрения не удивительно - указатели на pci_dev передаются нулевые, но dma_alloc_coherent это проглатывает...

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/dmapool.h>

#define pool_size 1024
#define pool_align 8
// int direction = PCI_DMA_TODEVICE ;
// int direction = PCI_DMA_FROMDEVICE ;
static int direction = PCI_DMA_BIDIRECTIONAL;
//int direction = PCI_DMA_NONE;
static void output(char *kbuf, dma_addr_t handle, size_t size, char *string);
static int __init my_init(void)
{
    char *kbuf;
    dma_addr_t handle;
    size_t size = (10 * PAGE_SIZE);
    struct dma_pool *mypool;

/* dma_alloc_coherent method */
    kbuf = dma_alloc_coherent(NULL, size, &handle, GFP_KERNEL);
    output(kbuf, handle, size, "This is the dma_alloc_coherent() string");
    dma_free_coherent(NULL, size, kbuf, handle);
    goto out;

/* dma_map/unmap_single */
    kbuf = kzalloc(size, GFP_KERNEL);
    if (!kbuf) {
        printk("error: no memory\n");
        goto out;
    }   
    handle = pci_map_single(NULL, kbuf, size, direction);
    if(dma_mapping_error(NULL, handle)) {
        printk("dma_map_single error");
        kfree(kbuf);
    }
    output( kbuf, handle, size, "This is the dma_map_single() string" );
    dma_unmap_single( NULL, handle, size, direction );
    kfree( kbuf );

/* dma_pool method */
    mypool = dma_pool_create("mypool", NULL, pool_size, pool_align, 0);
    kbuf = dma_pool_alloc(mypool, GFP_KERNEL, &handle);
    output(kbuf, handle, size, "This is the dma_pool_alloc() string");
    dma_pool_free(mypool, kbuf, handle);
    dma_pool_destroy(mypool);
    goto out;

out:
    return -1;
}

module_init(my_init);
MODULE_AUTHOR("Jerry Cooperstein");
MODULE_AUTHOR("Oleg Tsiliuric");
MODULE_DESCRIPTION("LDD:1.0 s_23/lab1_dma.c");
MODULE_LICENSE("GPL v2");
#define MARK "=> "
static void output(char *kbuf, dma_addr_t handle, size_t size, char *string)
{
    unsigned long long diff;
    diff = (unsigned long long)kbuf - handle;
    printk(KERN_INFO MARK "kbuf=%p, handle=%p, size = %d\n", kbuf,
           (void *)(unsigned long long)handle, (int)size);
    printk(KERN_INFO MARK
           "(kbuf-handle)= %p, %llu, PAGE_OFFSET=%lu, compare=%llu\n",
           (void *)diff, diff, PAGE_OFFSET, diff - PAGE_OFFSET);
    strcpy(kbuf, string);
    printk(KERN_INFO MARK "string written was, %s\n", kbuf);
}

upd: ядро 3.9/3.10

★★★★★

Последнее исправление: metawishmaster (всего исправлений: 2)

у тебя твой init() постоянно -1 возвращает. И ещё там как минимум одна скобка пропущена.

anonymous
()
Ответ на: комментарий от anonymous


у тебя твой init() постоянно -1 возвращает. И ещё там как минимум одна скобка пропущена.


скобка потерялась при наборее поста, но спасибо, исправил :)
а init() возвращает -1, что бы не произошло загрузка модуля, а когда я говорил, что он падает, то имел ввиду такой плевок в дмесге, если метку out поставить около строки «/* dma_pool method */» (и похожая фигня будет если goto убрать вообще):
[code]
Jul 22 12:38:15 t420s kernel: [140931.134230] => kbuf=ffff880036970000, handle= 36970000, size = 40960
Jul 22 12:38:15 t420s kernel: [140931.134233] => (kbuf-handle)= ffff880000000000, 18446612132314218496, PAGE_OFFSET=18446612132314218496, compare=0
Jul 22 12:38:15 t420s kernel: [140931.134234] => string written was, This is the dma_alloc_coherent() string
Jul 22 12:38:15 t420s kernel: [140931.134244] BUG: unable to handle kernel NULL pointer dereference at 00000000000001d8
Jul 22 12:38:15 t420s kernel: [140931.134284] IP: [<ffffffff811d62d0>] swiotlb_map_page+0x39/0x10c
Jul 22 12:38:15 t420s kernel: [140931.134313] PGD 0
Jul 22 12:38:15 t420s kernel: [140931.134325] Oops: 0000 [#1] SMP
Jul 22 12:38:15 t420s kernel: [140931.134341] Modules linked in: dmalab(O+) pci_driver(O) nls_cp437 vfat fat usb_storage vboxpci(O) vboxnetadp(O) vboxnetflt(O) vboxdrv(O) parport_pc ppdev lp parport rfcomm bnep binfmt_misc uinput nfsd auth_rpcgss nfs_acl nfs lockd fscache sunrpc sha256_generic hmac nls_utf8 cifs loop arc4 iwldvm btusb mac80211 i915 bluetooth iwlwifi i2c_algo_bit drm_kms_helper snd_hda_codec_hdmi snd_hda_codec_conexant drm snd_hda_intel snd_hda_codec coretemp snd_hwdep thinkpad_acpi i2c_i801 snd_pcm crc32c_intel i2c_core tpm_tis tpm acpi_cpufreq ghash_clmulni_intel tpm_bios iTCO_wdt nvram mperf cfg80211 processor aesni_intel snd_page_alloc snd_seq xts aes_x86_64 lrw gf128mul ablk_helper iTCO_vendor_support lpc_ich evdev psmouse snd_seq_device snd_timer snd ehci_pci ehci_hcd wmi mfd_core pcspkr soundcore serio_raw button battery ac video cryptd rfkill ext4 crc16 mbcache jbd2 sg sr_mod sd_mod cdrom crc_t10dif ahci libahci xhci_hcd libata e1000e usbcore scsi_mod ptp pps_core usb_common sdhci_pci sd
Jul 22 12:38:15 t420s kernel: hci mmc_core thermal thermal_sys [last unloaded: pci_driver]
Jul 22 12:38:15 t420s kernel: [140931.134847] CPU 1
Jul 22 12:38:15 t420s kernel: [140931.134858] Pid: 15229, comm: insmod Tainted: G O 3.9.8 #4 LENOVO 41732BG/41732BG
Jul 22 12:38:15 t420s kernel: [140931.134893] RIP: 0010:[<ffffffff811d62d0>] [<ffffffff811d62d0>] swiotlb_map_page+0x39/0x10c
Jul 22 12:38:15 t420s kernel: [140931.134930] RSP: 0018:ffff880319331d18 EFLAGS: 00010293
Jul 22 12:38:15 t420s kernel: [140931.134952] RAX: 00000003164c0000 RBX: ffff8803164c0000 RCX: 6db6db6db6db6db7
Jul 22 12:38:15 t420s kernel: [140931.134981] RDX: 0000000000000000 RSI: 00000003164c0000 RDI: 0000000000000000
Jul 22 12:38:15 t420s kernel: [140931.135009] RBP: 000000000000a000 R08: 0000000000000000 R09: 0000000000000000
Jul 22 12:38:15 t420s kernel: [140931.135038] R10: dead000000200200 R11: ffff880036970000 R12: 0000000000000000
Jul 22 12:38:15 t420s kernel: [140931.135067] R13: 000000000000165a R14: 0000000000000001 R15: ffff880319331ef8
Jul 22 12:38:15 t420s kernel: [140931.135096] FS: 00007f6377483700(0000) GS:ffff88041e240000(0000) knlGS:0000000000000000
Jul 22 12:38:15 t420s kernel: [140931.135128] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Jul 22 12:38:15 t420s kernel: [140931.135152] CR2: 00000000000001d8 CR3: 00000001ad4c3000 CR4: 00000000000407e0
Jul 22 12:38:15 t420s kernel: [140931.135181] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Jul 22 12:38:15 t420s kernel: [140931.135210] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Jul 22 12:38:15 t420s kernel: [140931.135239] Process insmod (pid: 15229, threadinfo ffff880319330000, task ffff8803258430c0)
Jul 22 12:38:15 t420s kernel: [140931.135272] Stack:
Jul 22 12:38:15 t420s kernel: [140931.135282] ffff8803164c0000 0000000036970000 ffffffff816206d0 ffffffffa01f6138
Jul 22 12:38:15 t420s kernel: [140931.135317] 000000000000165a 0000000036970000 ffffffffa0731000 ffffffffa01f6000
Jul 22 12:38:15 t420s kernel: [140931.135351] 0000000000000000 ffffffff8100209f ffffffffa01f6000 ffffffffa0731000
Jul 22 12:38:15 t420s kernel: [140931.135386] Call Trace:
Jul 22 12:38:15 t420s kernel: [140931.135400] [<ffffffffa01f6138>] ? my_init+0x138/0x1000 [dmalab]
Jul 22 12:38:15 t420s kernel: [140931.135428] [<ffffffffa01f6000>] ? 0xffffffffa01f5fff
Jul 22 12:38:15 t420s kernel: [140931.135451] [<ffffffff8100209f>] ? do_one_initcall+0x75/0x12a
Jul 22 12:38:15 t420s kernel: [140931.135477] [<ffffffffa01f6000>] ? 0xffffffffa01f5fff
Jul 22 12:38:15 t420s kernel: [140931.135500] [<ffffffffa01f6000>] ? 0xffffffffa01f5fff
Jul 22 12:38:15 t420s kernel: [140931.135523] [<ffffffff81085637>] ? load_module+0x1b03/0x1e08
Jul 22 12:38:15 t420s kernel: [140931.135548] [<ffffffff8108208d>] ? free_notes_attrs+0x40/0x40
Jul 22 12:38:15 t420s kernel: [140931.135574] [<ffffffff810ebd2b>] ? vmap_page_range_noflush+0x1e3/0x27c
Jul 22 12:38:15 t420s kernel: [140931.135610] [<ffffffff810859da>] ? sys_init_module+0x9e/0xab
Jul 22 12:38:15 t420s kernel: [140931.135637] [<ffffffff8137e6ad>] ? system_call_fastpath+0x1a/0x1f
Jul 22 12:38:15 t420s kernel: [140931.135662] Code: c4 48 01 f0 55 48 c1 f8 03 48 89 cd 48 b9 b7 6d db b6 6d db b6 6d 48 0f af c1 53 48 c1 e0 0c 41 83 f8 03 48 8d 34 10 75 02 0f 0b <48> 8b 87 d8 01 00 00 48 89 fb 48 85 c0 74 17 48 8d 54 2e ff 48
Jul 22 12:38:15 t420s kernel: [140931.135813] RIP [<ffffffff811d62d0>] swiotlb_map_page+0x39/0x10c
Jul 22 12:38:15 t420s kernel: [140931.135839] RSP <ffff880319331d18>
Jul 22 12:38:15 t420s kernel: [140931.135853] CR2: 00000000000001d8
Jul 22 12:38:15 t420s kernel: [140931.142681] ---[ end trace 357b3e03d44b06d3 ]---
[/code]

metawishmaster ★★★★★
() автор топика
Последнее исправление: metawishmaster (всего исправлений: 3)

Студент, printk

printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
kbuf = dma_alloc_coherent(NULL, size, &handle, GFP_KERNEL);
printk(KERN_ALERT "%s %d kbuf=%p, handle=%llx\n", __FUNCTION__, __LINE__, kbuf, handle);
    output(kbuf, handle, size, "This is the dma_alloc_coherent() string");
printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
    dma_free_coherent(NULL, size, kbuf, handle);
printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);

тебе в помощь

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

когда я проверял (на NULL и с dma_mapping_error), было все ok... но сейчас попробую Вашм методом

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от ttnl

и все-равно падает на pci_map_single :)

#include <linux/module.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/dmapool.h>
//#include "out.c"
#define pool_size 1024
#define pool_align 8
// int direction = PCI_DMA_TODEVICE ;
// int direction = PCI_DMA_FROMDEVICE ;
static int direction = PCI_DMA_BIDIRECTIONAL;
//int direction = PCI_DMA_NONE;
static void output(char *kbuf, dma_addr_t handle, size_t size, char *string);
static int __init my_init(void)
{
	char *kbuf;
	dma_addr_t handle;
	size_t size = (10 * PAGE_SIZE);
	struct dma_pool *mypool;

/* dma_alloc_coherent method */
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	kbuf = dma_alloc_coherent(NULL, size, &handle, GFP_KERNEL);
	printk(KERN_ALERT "%s %d kbuf=%p, handle=%llx\n", __FUNCTION__, __LINE__, kbuf, handle);
	output(kbuf, handle, size, "This is the dma_alloc_coherent() string");
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	dma_free_coherent(NULL, size, kbuf, handle);
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
//	goto out;

/* dma_map/unmap_single */
	kbuf = kzalloc(size, GFP_KERNEL);
	if (!kbuf) {
		printk("error: no memory\n");
		goto out;
	}
/*37:*/	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	handle = pci_map_single(NULL, kbuf, size, direction);
	printk(KERN_ALERT "%s %d kbuf=%p, handle=%llx\n", __FUNCTION__, __LINE__, kbuf, handle);
	if(dma_mapping_error(NULL, handle)) {
		printk("dma_map_single error");
		kfree(kbuf);
		goto out;
	}
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	output(kbuf, handle, size, "This is the dma_map_single() string");
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	pci_unmap_single(NULL, handle, size, direction);
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	kfree(kbuf);
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);

/* dma_pool method */
	mypool = dma_pool_create("mypool", NULL, pool_size, pool_align, 0);
	printk(KERN_ALERT "%s %d mypool=%llx\n", __FUNCTION__, __LINE__, mypool);
	kbuf = dma_pool_alloc(mypool, GFP_KERNEL | GFP_DMA, &handle);
	printk(KERN_ALERT "%s %d kbuf=%p, handle=%llx\n", __FUNCTION__, __LINE__, kbuf, handle);
	output(kbuf, handle, size, "This is the dma_pool_alloc() string");
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	dma_pool_free(mypool, kbuf, handle);
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	dma_pool_destroy(mypool);
	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	goto out;

out:
	return -1;
}

module_init(my_init);
MODULE_AUTHOR("Jerry Cooperstein");
MODULE_AUTHOR("Oleg Tsiliuric");
MODULE_DESCRIPTION("LDD:1.0 s_23/lab1_dma.c");
MODULE_LICENSE("GPL v2");
#define MARK "=> "
static void output(char *kbuf, dma_addr_t handle, size_t size, char *string)
{
	unsigned long long diff;
	diff = (unsigned long long)kbuf - handle;
	printk(KERN_INFO MARK "kbuf=%p, handle=%p, size = %d\n", kbuf,
	       (void *)(unsigned long long)handle, (int)size);
	printk(KERN_INFO MARK
	       "(kbuf-handle)= %p, %llu, PAGE_OFFSET=%lu, compare=%llu\n",
	       (void *)diff, diff, PAGE_OFFSET, diff - PAGE_OFFSET);
	strcpy(kbuf, string);
	printk(KERN_INFO MARK "string written was, %s\n", kbuf);
}
[ 1512.097214] my_init 22
[ 1512.097258] my_init 24 kbuf=ffff880036480000, handle=36480000
[ 1512.097266] => kbuf=ffff880036480000, handle=0000000036480000, size = 40960
[ 1512.097275] => (kbuf-handle)= ffff880000000000, 18446612132314218496, PAGE_OFFSET=18446612132314218496, compare=0
[ 1512.097281] => string written was, This is the dma_alloc_coherent() string
[ 1512.097291] my_init 26
[ 1512.097300] my_init 28
[ 1512.097857] my_init 37
[ 1512.097894] BUG: unable to handle kernel NULL pointer dereference at 00000000000001e0
[ 1512.098083] IP: [<ffffffff811c36fb>] swiotlb_map_page+0x39/0x10c
[ 1512.098234] PGD 0 
[ 1512.098288] Oops: 0000 [#1] SMP 
[ 1512.098360] Modules linked in: dmalab(O+) vboxpci(O) vboxnetadp(O) vboxnetflt(O) vboxdrv(O) parport_pc ppdev lp parport rfcomm bnep uinput nfsd auth_rpcgss oid_registry nfs_acl nfs lockd fscache sunrpc md4 sha256_generic hmac nls_utf8 cifs loop arc4 iwldvm mac80211 snd_hda_codec_hdmi snd_hda_codec_conexant iwlwifi btusb bluetooth cfg80211 snd_hda_intel snd_hda_codec i915 coretemp crc32c_intel ghash_clmulni_intel aesni_intel thinkpad_acpi aes_x86_64 glue_helper lrw i2c_algo_bit iTCO_wdt nvram drm_kms_helper drm snd_hwdep snd_pcm snd_page_alloc gf128mul ablk_helper snd_seq snd_seq_device iTCO_vendor_support psmouse ehci_pci snd_timer cryptd snd rfkill ehci_hcd lpc_ich soundcore button wmi mfd_core pcspkr video tpm_tis tpm battery tpm_bios i2c_i801 serio_raw evdev acpi_cpufreq i2c_core ac mperf processor ext4 crc16 mbcache jbd2 sg sr_mod sd_mod cdrom crc_t10dif ahci libahci libata xhci_hcd usbcore scsi_mod sdhci_pci usb_common e1000e sdhci mmc_core thermal thermal_sys ptp pps_core
[ 1512.100134] CPU: 3 PID: 17561 Comm: insmod Tainted: G           O 3.10.3 #1
[ 1512.100238] Hardware name: LENOVO 41732BG/41732BG, BIOS 8CET50WW (1.30 ) 11/01/2011
[ 1512.100369] task: ffff8803a925a7e0 ti: ffff88040ba66000 task.ti: ffff88040ba66000
[ 1512.100534] RIP: 0010:[<ffffffff811c36fb>]  [<ffffffff811c36fb>] swiotlb_map_page+0x39/0x10c
[ 1512.100737] RSP: 0018:ffff88040ba67d18  EFLAGS: 00010293
[ 1512.100857] RAX: 0000000342eb0000 RBX: ffff880342eb0000 RCX: 6db6db6db6db6db7
[ 1512.101017] RDX: 0000000000000000 RSI: 0000000342eb0000 RDI: 0000000000000000
[ 1512.101148] RBP: 000000000000a000 R08: 0000000000000000 R09: 0000000000000000
[ 1512.101303] R10: 0000000000000000 R11: ffff88041e5ecd00 R12: 0000000000000000
[ 1512.101449] R13: 0000000000001653 R14: 0000000000000001 R15: ffff88040ba67ef8
[ 1512.101579] FS:  00007f40cb950700(0000) GS:ffff88041e2c0000(0000) knlGS:0000000000000000
[ 1512.101733] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 1512.101857] CR2: 00000000000001e0 CR3: 000000035f061000 CR4: 00000000000407e0
[ 1512.101995] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 1512.102109] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[ 1512.102229] Stack:
[ 1512.102264]  ffff880342eb0000 0000000036480000 ffffffff8161ca80 ffffffffa000e1db
[ 1512.102393]  0000000000001653 0000000036480000 ffffffffa000e000 ffffffffa000e000
[ 1512.102521]  0000000000000000 ffffffff81000257 ffffffffa000e000 ffffffffa068c000
[ 1512.102648] Call Trace:
[ 1512.102699]  [<ffffffffa000e1db>] ? my_init+0x1db/0x1000 [dmalab]
[ 1512.102805]  [<ffffffffa000e000>] ? 0xffffffffa000dfff
[ 1512.102888]  [<ffffffffa000e000>] ? 0xffffffffa000dfff
[ 1512.102970]  [<ffffffff81000257>] ? do_one_initcall+0x75/0x102
[ 1512.103065]  [<ffffffffa000e000>] ? 0xffffffffa000dfff
[ 1512.103149]  [<ffffffffa000e000>] ? 0xffffffffa000dfff
[ 1512.103235]  [<ffffffff810777bc>] ? load_module+0x1b22/0x1e22
[ 1512.103326]  [<ffffffff81074293>] ? free_notes_attrs+0x40/0x40
[ 1512.103421]  [<ffffffff81077b5a>] ? SyS_init_module+0x9e/0xab
[ 1512.103518]  [<ffffffff81365893>] ? tracesys+0xe1/0xe6
[ 1512.103598] Code: c4 48 01 f0 55 48 c1 f8 03 48 89 cd 48 b9 b7 6d db b6 6d db b6 6d 48 0f af c1 53 48 c1 e0 0c 41 83 f8 03 48 8d 34 10 75 02 0f 0b <48> 8b 87 e0 01 00 00 48 89 fb 48 85 c0 74 17 48 8d 54 2e ff 48 
[ 1512.104198] RIP  [<ffffffff811c36fb>] swiotlb_map_page+0x39/0x10c
[ 1512.104332]  RSP <ffff88040ba67d18>
[ 1512.104373] CR2: 00000000000001e0
[ 1512.130076] ---[ end trace afdfd260fbd6fe36 ]---
s

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от metawishmaster

Неудивительно. Функция swiotlb_map_page() не рассчитана на нулевое устройство, там в самом начале стоит проверка на dma_capable, которая такая:

bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
{
        struct sta2x11_mapping *map;

        if (dev->archdata.dma_ops != &sta2x11_dma_ops)

Т.е. пример неправильный. Я не специалист по x86, может быть, в каких-то случаях нулевое dev и прокатывает, не скажу. Но, как видно, невсегда.

ttnl ★★★★★
()

из книжки Олега Цилюрика

Не читай пакость, читай LDD.

anonymous
()
Ответ на: комментарий от ttnl

ясно, спасибо...
я только что посмотрел, похоже для арм нулевое dev прокатит... по-коайней мере для dma_map_single

metawishmaster ★★★★★
() автор топика
Ответ на: комментарий от ttnl

а не должен ли output(...) стоять перед pci_map_single(...):

/* dma_map/unmap_single */
	kbuf = kzalloc(size, GFP_KERNEL);
	if (!kbuf) {
		printk("error: no memory\n");
		goto out;
	}
        handle = NULL;
        output(kbuf, handle, size, "This is the dma_map_single() string"); // handle не разименовавается в ф-ии output;
/*37:*/	printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__);
	handle = pci_map_single(NULL, kbuf, size, direction);
	printk(KERN_ALERT "%s %d kbuf=%p, handle=%llx\n", __FUNCTION__, __LINE__, kbuf, handle);
	if(dma_mapping_error(NULL, handle)) {
		printk("dma_map_single error");
		kfree(kbuf);
		goto out;
	}
	
	pci_unmap_single(NULL, handle, size, direction);
	kfree(kbuf);
?

metawishmaster ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.