Thread (49 messages) 49 messages, 9 authors, 2017-11-17

Re: [RFC PATCH 02/14] packet: implement PACKET_MEMREG setsockopt

From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2017-11-03 03:00:47

On Tue, Oct 31, 2017 at 9:41 PM, Björn Töpel [off-list ref] wrote:
From: Björn Töpel <redacted>

Here, the PACKET_MEMREG setsockopt is implemented for the AF_PACKET
protocol family. PACKET_MEMREG allows the user to register memory
regions that can be used by AF_PACKET V4 as packet data buffers.

Signed-off-by: Björn Töpel <redacted>
---
+/*************** V4 QUEUE OPERATIONS *******************************/
+
+/**
+ * tp4q_umem_new - Creates a new umem (packet buffer)
+ *
+ * @addr: The address to the umem
+ * @size: The size of the umem
+ * @frame_size: The size of each frame, between 2K and PAGE_SIZE
+ * @data_headroom: The desired data headroom before start of the packet
+ *
+ * Returns a pointer to the new umem or NULL for failure
+ **/
+static inline struct tp4_umem *tp4q_umem_new(unsigned long addr, size_t size,
+                                            unsigned int frame_size,
+                                            unsigned int data_headroom)
+{
+       struct tp4_umem *umem;
+       unsigned int nframes;
+
+       if (frame_size < TP4_UMEM_MIN_FRAME_SIZE || frame_size > PAGE_SIZE) {
+               /* Strictly speaking we could support this, if:
+                * - huge pages, or*
+                * - using an IOMMU, or
+                * - making sure the memory area is consecutive
+                * but for now, we simply say "computer says no".
+                */
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (!is_power_of_2(frame_size))
+               return ERR_PTR(-EINVAL);
+
+       if (!PAGE_ALIGNED(addr)) {
+               /* Memory area has to be page size aligned. For
+                * simplicity, this might change.
+                */
+               return ERR_PTR(-EINVAL);
+       }
+
+       if ((addr + size) < addr)
+               return ERR_PTR(-EINVAL);
+
+       nframes = size / frame_size;
+       if (nframes == 0)
+               return ERR_PTR(-EINVAL);
+
+       data_headroom = ALIGN(data_headroom, 64);
+
+       if (frame_size - data_headroom - TP4_KERNEL_HEADROOM < 0)
+               return ERR_PTR(-EINVAL);
signed comparison on unsigned int
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help